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