From 62abe41b28d2f3b67e03a3be35bace42c4dd021a Mon Sep 17 00:00:00 2001
From: "javier.chaconrosales" <javier.chaconrosales@ucr.ad.cr>
Date: Tue, 19 Nov 2024 20:13:23 -0600
Subject: [PATCH] logica colision disparo e invasor

---
 proyecto/segunda_etapa/src/graphics.c | 88 ++++++++++++++-------------
 proyecto/segunda_etapa/src/logic.asm  | 48 +++++++++------
 2 files changed, 76 insertions(+), 60 deletions(-)

diff --git a/proyecto/segunda_etapa/src/graphics.c b/proyecto/segunda_etapa/src/graphics.c
index 9d10607..d94fed9 100644
--- a/proyecto/segunda_etapa/src/graphics.c
+++ b/proyecto/segunda_etapa/src/graphics.c
@@ -18,30 +18,32 @@ extern int shoot_pos_y;
 extern uint16_t shoot_active;
 extern short player_life;
 extern char invaders_data[];
+extern size_t invaders_data_size; // Tamaño del arreglo de datos de los invasores
 
 // función global de interés
 extern void update_logic(int event);
 
 /// @brief Registro con datos necesarios para la interfaz gráfica
 typedef struct {
-  SDL_Window* window;
-  SDL_Renderer* renderer;
-  TTF_Font* font;
-  SDL_Surface* backgroundSurface;
-  SDL_Texture* backgroundTexture;
-  SDL_Surface* player;
-  SDL_Texture* playerTexture;
-  SDL_Surface* shoot;
-  SDL_Texture* shootTexture0;
-  SDL_Texture* shootTexture1;
-  SDL_Surface* enemySurface;
-  SDL_Texture* enemyTexture; // Textura de los enemigos
-  SDL_Event e;
-  int end;
-  int event;
-  int shootTex;
+    SDL_Window* window;                    // Ventana principal
+    SDL_Renderer* renderer;                // Renderizador principal
+    TTF_Font* font;                        // Fuente para texto
+    SDL_Surface* backgroundSurface;        // Superficie del fondo
+    SDL_Texture* backgroundTexture;        // Textura del fondo
+    SDL_Surface* player;                   // Superficie del jugador
+    SDL_Texture* playerTexture;            // Textura del jugador
+    SDL_Surface* shoot;                    // Superficie del disparo
+    SDL_Texture* shootTexture0;            // Primera textura para disparo
+    SDL_Texture* shootTexture1;            // Segunda textura para disparo
+    SDL_Surface* enemy;                    // Superficie de los enemigos
+    SDL_Texture* enemyTexture;             // Textura de los enemigos
+    SDL_Event e;                           // Evento de SDL
+    int end;                               // Bandera para el bucle del juego
+    int event;                             // Evento del teclado
+    int shootTex;                          // Control para la animación del disparo
 } graphics_t;
 
+
 /// Declaración de las Funciones ///
 
 /**
@@ -248,22 +250,24 @@ int initGameData(graphics_t* graficos) {
   graficos->shootTexture1 = SDL_CreateTextureFromSurface(graficos->renderer,
       graficos->shoot);
 
- // Cargar la imagen de los enemigos
-  graficos->enemySurface = IMG_Load("renderSrc/enemy.png");
-  if (graficos->enemySurface == NULL) {
-    SDL_Log("Error al cargar la imagen del enemigo: %s", IMG_GetError());
-    return EXIT_FAILURE;
-  }
-  graficos->enemyTexture = SDL_CreateTextureFromSurface(graficos->renderer, graficos->enemySurface);
-  SDL_FreeSurface(graficos->enemySurface);
+  // Cargar la imagen del enemigo
+    graficos->enemy = IMG_Load("renderSrc/enemy.png");
+    if (!graficos->enemy) {
+        SDL_Log("Error al cargar la imagen del enemigo: %s", IMG_GetError());
+        return EXIT_FAILURE;
+    }
+    graficos->enemyTexture = SDL_CreateTextureFromSurface(graficos->renderer, graficos->enemy);
+    SDL_FreeSurface(graficos->enemy);
 
-  graficos->end = 1;
-  graficos->event = 0;
-  graficos->shootTex = 0;
+    // Inicializar variables del juego
+    graficos->end = 1;
+    graficos->event = 0;
+    graficos->shootTex = 0;
 
-  return EXIT_SUCCESS;
+    return EXIT_SUCCESS;
 }
 
+
 void startGame(graphics_t* graficos) {
   while (graficos->end) {
     detectEvent(graficos);
@@ -345,25 +349,27 @@ void renderGraphics(graphics_t* graficos) {
     SDL_RenderCopy(graficos->renderer, currentTextureShoot, NULL, &shootRect);
   }
 
- // Renderizar invasores
-  for (int i = 0; i < 10; i++) {
-    int invader_x = *(int*)(invaders_data + i * 12);
-    int invader_y = *(int*)(invaders_data + i * 12 + 4);
-    int invader_life = *(int*)(invaders_data + i * 12 + 8);
-
-    if (invader_life > 0) { // Renderizar solo si está vivo
-      SDL_Rect invaderRect = {invader_x, invader_y, 40, 40};
-      SDL_SetRenderDrawColor(graficos->renderer, 255, 0, 0, 255); // Rojo
-      SDL_RenderFillRect(graficos->renderer, &invaderRect);
+ // Dibujar los enemigos
+    for (int i = 0; i < 10; ++i) {
+        int* enemyData = (int*)(invaders_data + i * invaders_data_size); // Calcular la posición del enemigo en el arreglo
+        int enemyX = enemyData[0]; // Posición X del enemigo
+        int enemyY = enemyData[1]; // Posición Y del enemigo
+        int enemyLife = enemyData[2]; // Vida del enemigo
+
+        if (enemyLife > 0) { // Solo dibujar enemigos vivos
+            SDL_Rect enemyRect = {enemyX, enemyY, 40, 40}; // Coordenadas y tamaño del enemigo
+            SDL_RenderCopy(graficos->renderer, graficos->enemyTexture, NULL, &enemyRect);
+        }
     }
-  }
 
-  SDL_RenderPresent(graficos->renderer);
-  SDL_Delay(10);
+    // Actualizar la pantalla
+    SDL_RenderPresent(graficos->renderer);
+    SDL_Delay(10); // Control de velocidad del juego
 }
 
 
 
+
 void showGameOver(SDL_Renderer* renderer, TTF_Font* font) {
   SDL_Color textcolor = {255, 0, 0, 255};
   const char* gameOverText = "Game Over";
diff --git a/proyecto/segunda_etapa/src/logic.asm b/proyecto/segunda_etapa/src/logic.asm
index 1cea69a..d3cbdbb 100644
--- a/proyecto/segunda_etapa/src/logic.asm
+++ b/proyecto/segunda_etapa/src/logic.asm
@@ -58,26 +58,36 @@ player_logic:
   mov [player_pos_x], eax
   ret
 
-; Actualizar la lógica de los invasores
+; Lógica de actualización de invasores con detección de colisiones
 update_invaders_logic:
-    mov rsi, invaders_data
-    xor rbx, rbx
-
-invaders_update_loop:
-    cmp rbx, 10
-    jge invaders_update_done
-
-    ; Actualizar posición en X de cada invasor
-    mov eax, dword [rsi]
-    add eax, 1
-    mov dword [rsi], eax
-
-    ; Mover al siguiente invasor
-    add rsi, invaders_data_size
-    inc rbx
-    jmp invaders_update_loop
-
-invaders_update_done:
+    mov rbx, 0                   
+    mov rsi, invaders_data       
+invaders_loop:
+    cmp rbx, 10                   
+    jge end_invaders_update      
+    ; Leer la posición del invasor
+    mov eax, dword [rsi]         
+    mov edx, dword [rsi + 4]     ; 
+
+    ; Comprobar si la posición coincide con la posición del disparo
+    cmp eax, dword [shoot_pos_x] 
+    jne next_invader             
+    cmp edx, dword [shoot_pos_y] 
+    jne next_invader            
+    ; Colisión detectada: reducir la vida del invasor
+    sub dword [rsi + 8], 1       
+    cmp dword [rsi + 8], 0      
+    jg next_invader              
+
+    ; Eliminar invasor si su vida es menor o igual a 0
+    mov dword [rsi], -1          
+    mov dword [rsi + 4], -1     
+
+next_invader:
+    add rsi, invaders_data_size  
+    inc rbx                     
+    jmp invaders_loop            
+end_invaders_update:
     ret
 
 
-- 
GitLab