diff --git a/.idea/misc.xml b/.idea/misc.xml
index 74dd639e4ea4800753c1dbdb333093410e843492..a4f09e258122edff410c9635941aefba73ff6e87 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
- <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
diff --git a/app/src/main/java/com/example/ellegadodepintia/Minijuego2.kt b/app/src/main/java/com/example/ellegadodepintia/Minijuego2.kt
index 57a7ba14ba5ba75377f144bc88bb0af796d50e2f..de0b825015e7fe02e9116824db1170dee9cc3600 100644
--- a/app/src/main/java/com/example/ellegadodepintia/Minijuego2.kt
+++ b/app/src/main/java/com/example/ellegadodepintia/Minijuego2.kt
@@ -1,11 +1,262 @@
package com.example.ellegadodepintia
+import android.annotation.SuppressLint
import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.view.MotionEvent
+import android.view.View
+import android.widget.Button
+import android.widget.ImageView
+import android.widget.RelativeLayout
+import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
+import kotlin.random.Random
class Minijuego2 : AppCompatActivity() {
+
+ private lateinit var botonIniciar: Button
+ private lateinit var protagonista: ImageView
+ private lateinit var layout: RelativeLayout
+ private lateinit var titulo: TextView
+ private lateinit var descripcion: TextView
+ private lateinit var puntuacionTextView: TextView // TextView para mostrar la puntuación
+ private lateinit var botonReinicio: Button
+ private lateinit var fondo1: ImageView
+ private lateinit var fondo2: ImageView
+
+
+ private var puntuacion = 0 // Puntuación del jugador
+ private var gravedad = 1f // Gravedad más suave
+ private var aceleracionSubida = -1f // Aceleración gradual de subida
+ private var velocidadMaximaCaida = 20f // Velocidad máxima de caída
+ private var velocidadMaximaSubida = -20f // Velocidad máxima de subida
+ private var velocidad = 0f // Velocidad actual del protagonista
+ private var jugando = false
+ private var pulsacion =
+ false // Bandera para saber si se está tocando la pantalla
+ private val obstaculos = mutableListOf<ImageView>() // Lista de tuberías
+ private val handler = Handler(Looper.getMainLooper())
+ private var obstacleTimer: Runnable? = null
+ private var fondoTimer: Runnable? = null
+ private var velocidadFondo = 5f // Velocidad de desplazamiento del fondo
+
+ @SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_minijuego2)
+
+
+ // Inicializar componentes del layout
+ botonIniciar = findViewById(R.id.boton_iniciar)
+ protagonista = findViewById(R.id.protagonista)
+ layout = findViewById(R.id.layout)
+ titulo = findViewById(R.id.titulo)
+ descripcion = findViewById(R.id.descripcion)
+ puntuacionTextView = findViewById(R.id.puntuacion)
+ botonReinicio = findViewById(R.id.boton_reinicio)
+ // Inicializar el fondo
+ fondo1 = findViewById(R.id.fondo1)
+ fondo2 = findViewById(R.id.fondo2)
+
+ // Configurar la acción del botón de inicio
+ botonIniciar.setOnClickListener {
+ iniciarJuego()
+ fondo2.x = fondo1.x + fondo1.width * 4
+ }
+
+ // Configurar el listener para detectar toques en la pantalla
+ findViewById<View>(android.R.id.content).setOnTouchListener { _, event ->
+ when (event.action) {
+ MotionEvent.ACTION_DOWN -> {
+ pulsacion = true // Activa el "jetpack" al tocar
+ }
+
+ MotionEvent.ACTION_UP -> {
+ pulsacion = false // Desactiva el "jetpack" al soltar
+ }
+ }
+ true
+ }
+ }
+
+ private fun iniciarJuego() {
+ // Ocultar los elementos de inicio y mostrar al protagonista
+ titulo.visibility = View.GONE
+ descripcion.visibility = View.GONE
+ botonIniciar.visibility = View.GONE
+ protagonista.visibility = View.VISIBLE
+
+ jugando = true
+ velocidad = 0f // Inicializar la velocidad en 0 al inicio
+ obstaculos.clear() // Limpiar obstáculos anteriores
+
+ // Iniciar el bucle de actualización para aplicar gravedad
+ handler.post(object : Runnable {
+ override fun run() {
+ if (jugando) {
+ actualizarPosicionProtagonista()
+ moverObstaculos()
+ verificarColisiones()
+ handler.postDelayed(this, 10)
+ }
+ }
+ })
+
+ // Iniciar el temporizador para generar obstáculos
+ obstacleTimer = object : Runnable {
+ override fun run() {
+ if (jugando) {
+ generarObstaculo()
+ handler.postDelayed(this, 2000) // Generar un nuevo obstáculo cada 2 segundos
+ }
+ }
+ }
+ handler.post(obstacleTimer!!)
+
+ // Iniciar el bucle para mover el fondo de manera independiente
+ fondoTimer = object : Runnable {
+ override fun run() {
+ if (jugando) {
+ moverFondo() // Mover el fondo
+ handler.postDelayed(this, 10) // Actualización a 16 ms (60 fps)
+ }
+ }
+ }
+ handler.post(fondoTimer!!)
+ }
+
+ private fun actualizarPosicionProtagonista() {
+ val altitud = protagonista.y
+
+ /// Si se está tocando, se aplica la aceleración hacia arriba, limitando la velocidad máxima de subida
+ velocidad = if (pulsacion) {
+ (velocidad + aceleracionSubida).coerceAtLeast(velocidadMaximaSubida)
+ } else {
+ // Si no se toca, se aplica la gravedad, limitando la velocidad máxima de caída
+ (velocidad + gravedad).coerceAtMost(velocidadMaximaCaida)
+ }
+
+ val nuevaPosicionY = altitud + velocidad
+
+ // Obtener la altura de la pantalla de forma dinámica
+ val techoPantalla = findViewById<View>(android.R.id.content).height
+
+ // Limitar la posición del protagonista en los bordes de la pantalla
+ if (nuevaPosicionY < 0) {
+ protagonista.y = 0f
+ velocidad = 0f
+ } else if (nuevaPosicionY + protagonista.height < techoPantalla) {
+ protagonista.y = nuevaPosicionY
+ }
+ }
+
+ private fun generarObstaculo() {
+ val tuberiaInferior = ImageView(this)
+ tuberiaInferior.setBackgroundResource(R.drawable.log) // Asegúrate de que el recurso de tubería esté disponible
+ val screenHeight = findViewById<View>(android.R.id.content).height
+ val alturaTuberia = Random.nextInt(500, 1500) // Altura aleatoria de la tubería inferior
+
+ // Configurar posición y tamaño de la tubería inferior
+ val layoutParams = RelativeLayout.LayoutParams(300, alturaTuberia)
+ layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
+ tuberiaInferior.layoutParams = layoutParams
+ tuberiaInferior.x = layout.width.toFloat()
+ tuberiaInferior.y = (screenHeight - alturaTuberia).toFloat()
+
+ layout.addView(tuberiaInferior)
+ obstaculos.add(tuberiaInferior)
+
+ // Generar la tubería superior
+ val tuberiaSuperior = ImageView(this)
+ tuberiaSuperior.setBackgroundResource(R.drawable.log) // Asegúrate de que el recurso de tubería esté disponible
+ val alturaTuberiaSuperior = screenHeight - alturaTuberia - 500 // Espacio entre tuberías
+
+ // Configurar posición y tamaño de la tubería superior
+ val layoutParamsSuperior = RelativeLayout.LayoutParams(300, alturaTuberiaSuperior)
+ layoutParamsSuperior.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
+ tuberiaSuperior.layoutParams = layoutParamsSuperior
+ tuberiaSuperior.x = layout.width.toFloat()
+ tuberiaSuperior.y = 0f // Colocar en la parte superior
+
+ layout.addView(tuberiaSuperior)
+ obstaculos.add(tuberiaSuperior)
+ }
+
+ private fun moverObstaculos() {
+ val obstaculosAEliminar =
+ mutableListOf<ImageView>() // Lista temporal para los obstáculos a eliminar
+
+ for (obstaculo in obstaculos) {
+ obstaculo.x -= 10f + (puntuacion / 10)// Mover obstáculo a la izquierda
+
+ // Verificar si el protagonista pasa el obstáculo
+ if (obstaculo.x + obstaculo.width < protagonista.x && obstaculo.y < protagonista.y) {
+ puntuacion++
+ puntuacionTextView.text = "Puntuación: $puntuacion"
+ }
+
+ // Verificar si el obstáculo sale de la pantalla
+ if (obstaculo.x + obstaculo.width < 0) {
+ obstaculosAEliminar.add(obstaculo) // Agregar a la lista de eliminación
+ }
+ }
+
+ // Eliminar obstáculos que salieron de la pantalla
+ for (obstaculo in obstaculosAEliminar) {
+ layout.removeView(obstaculo)
+ obstaculos.remove(obstaculo)
+ }
+ }
+
+
+ private fun verificarColisiones() {
+ for (obstaculo in obstaculos) {
+ if (obstaculo.x < protagonista.x + protagonista.width - 50 &&
+ obstaculo.x + obstaculo.width > protagonista.x &&
+ obstaculo.y < protagonista.y + protagonista.height - 20 &&
+ obstaculo.y + obstaculo.height > protagonista.y
+ ) {
+ // Colisión detectada
+ detenerJuego()
+ break
+ }
+ }
+ }
+
+ private fun detenerJuego() {
+ jugando = false
+ obstacleTimer?.let { handler.removeCallbacks(it) } // Detener el temporizador de obstáculos
+ botonReinicio.visibility = View.VISIBLE // Mostrar botón de reinicio
+
+ botonReinicio.setOnClickListener {
+ reiniciarJuego()
+ }
+ }
+
+ private fun reiniciarJuego() {
+ // Reiniciar variables del juego
+ puntuacion = 0
+ puntuacionTextView.text = "Puntuación: $puntuacion"
+ protagonista.y = (layout.height / 2).toFloat() // Reiniciar posición del protagonista
+ for (obstaculo in obstaculos) {
+ layout.removeView(obstaculo) // Eliminar cada obstáculo del layout
+ }
+ botonReinicio.visibility = View.GONE // Ocultar botón de reinicio
+ iniciarJuego() // Reiniciar el juego
+ }
+
+ private fun moverFondo() {
+ // Mueve ambos fondos hacia la izquierda
+ fondo1.x -= velocidadFondo
+ fondo2.x -= velocidadFondo
+
+ // Reinicia la posición cuando un fondo sale de la pantalla
+ if (fondo1.x + fondo1.width * 4 < 0) {
+ fondo1.x = fondo2.x + fondo2.width * 4
+ }
+ if (fondo2.x + fondo2.width * 4 < 0) {
+ fondo2.x = fondo1.x + fondo1.width * 4
+ }
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/drawable/boton_triangular.xml b/app/src/main/res/drawable/boton_triangular.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1fd06e7c24017c553ebca06b533d862fad28adda
--- /dev/null
+++ b/app/src/main/res/drawable/boton_triangular.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="100dp"
+ android:height="100dp"
+ android:viewportWidth="100"
+ android:viewportHeight="100">
+ <path
+ android:fillColor="#4CAF51"
+ android:pathData="M 0,0 L 100,50 L 0,100 Z" />
+</vector>
diff --git a/app/src/main/res/drawable/log.png b/app/src/main/res/drawable/log.png
new file mode 100644
index 0000000000000000000000000000000000000000..bebd40e78efe1249a3a5db10a7bb4d829659cf9b
Binary files /dev/null and b/app/src/main/res/drawable/log.png differ
diff --git a/app/src/main/res/drawable/mini2bg.png b/app/src/main/res/drawable/mini2bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce1bb1dfce39f96a7e7d3ea0345a6a18e1b30664
Binary files /dev/null and b/app/src/main/res/drawable/mini2bg.png differ
diff --git a/app/src/main/res/drawable/restart.png b/app/src/main/res/drawable/restart.png
new file mode 100644
index 0000000000000000000000000000000000000000..7621cfc6f34e01b048be735ac5f5f54378696ac1
Binary files /dev/null and b/app/src/main/res/drawable/restart.png differ
diff --git a/app/src/main/res/drawable/roca.png b/app/src/main/res/drawable/roca.png
new file mode 100644
index 0000000000000000000000000000000000000000..9062d2cc834805047acfe1a3641c64191fc25d56
Binary files /dev/null and b/app/src/main/res/drawable/roca.png differ
diff --git a/app/src/main/res/drawable/tuberia.xml b/app/src/main/res/drawable/tuberia.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd1636d941eea72f5858c31004fd639931d01bb9
--- /dev/null
+++ b/app/src/main/res/drawable/tuberia.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@android:color/holo_green_dark" /> <!-- Color de la tubería -->
+ <corners android:radius="0dp"/> <!-- Bordes rectos -->
+ <size
+ android:width="100dp"
+ android:height="300dp"/> <!-- Dimensiones de la tubería -->
+</shape>
diff --git a/app/src/main/res/drawable/vacceo.png b/app/src/main/res/drawable/vacceo.png
new file mode 100644
index 0000000000000000000000000000000000000000..42ddaf18633e5f0fdc3b57dd15fb189f21f08fdf
Binary files /dev/null and b/app/src/main/res/drawable/vacceo.png differ
diff --git a/app/src/main/res/layout/activity_minijuego2.xml b/app/src/main/res/layout/activity_minijuego2.xml
index 42abbe502cb2481659547d839364a4edd4d3423f..fefaab7298d625820a136add6b57f16ab9b6d846 100644
--- a/app/src/main/res/layout/activity_minijuego2.xml
+++ b/app/src/main/res/layout/activity_minijuego2.xml
@@ -1,23 +1,81 @@
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:gravity="center"
+ android:background="@color/white">
- android:background="@color/pintiaBackground"
- android:padding="16dp">
+ <ImageView
+ android:id="@+id/fondo1"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/mini2bg"
+ android:scaleY="4"
+ android:scaleX="4"/>
+ <ImageView
+ android:id="@+id/fondo2"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/mini2bg"
+ android:scaleY="4"
+ android:scaleX="4"/>
<TextView
- android:id="@+id/titleTextView"
+ android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:text="Pintia Flying Machine"
+ android:textSize="30sp"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="100dp"
+ android:textColor="@color/black"/>
+
+ <TextView
+ android:id="@+id/descripcion"
+ android:layout_width="335dp"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/titulo"
+ android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
- android:text="Minijuego 2"
- android:textColor="@color/pintiaTitleText"
+ android:text="Ayuda a Vacceo a volar lo más lejos posible esquivando obstáculos."
+ android:textColor="@color/black"
+ android:textSize="16sp" />
+
+ <Button
+ android:id="@+id/boton_iniciar"
+ android:layout_width="100dp"
+ android:layout_height="100dp"
+ android:background="@drawable/boton_triangular"
+ android:text="Iniciar"
+ android:textColor="@android:color/white"
+ android:layout_below="@id/descripcion"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="50dp"/>
+
+ <ImageView
+ android:id="@+id/protagonista"
+ android:layout_width="80dp"
+ android:layout_height="80dp"
+ android:src="@drawable/vacceo"
+ android:visibility="gone" />
+ <TextView
+ android:id="@+id/puntuacion"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Puntuación: 0"
android:textSize="24sp"
- android:textStyle="bold"
- tools:ignore="HardcodedText" />
+ android:textColor="@android:color/black"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"
+ android:layout_margin="16dp" />
+ <Button
+ android:id="@+id/boton_reinicio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Reiniciar"
+ android:layout_centerInParent="true"
+ android:visibility="gone" />
+
+
-</LinearLayout>
+</RelativeLayout>