bool colide_wave(wave* invasores, Missil* missil){ int x = get_x_missil(missil); int y = get_y_missil(missil); x-= invasores->x; y-= invasores->y; if( x >= 0 && y >= 0 && x < invasores->wave_width && y < ALIEN_SIZE * invasores->linhas + ALIEN_SPACING * (invasores->linhas - 1)){ int coluna = x/(ALIEN_SIZE + ALIEN_SPACING); int linha = (y + ALIEN_SPACING)/(ALIEN_SIZE + ALIEN_SPACING); switch (linha){ case 0: if ( acerta_alien (invasores->squids[coluna], get_x_missil(missil), get_y_missil(missil))){ invasores->squids[coluna] = NULL; invasores->aliens_mortos[0] ++; if ( invasores->aliens_mortos[0] == invasores->n_aliens) invasores->linhas--; return true; } break; case 1: if ( acerta_alien (invasores->jellyfishes[0][coluna], get_x_missil(missil), get_y_missil(missil))){ invasores->jellyfishes[0][coluna] = NULL; invasores->aliens_mortos[1] ++; if ( invasores->aliens_mortos[1] == invasores->n_aliens) invasores->linhas--; return true; } break; case 2: if ( acerta_alien (invasores->jellyfishes[1][coluna], get_x_missil(missil), get_y_missil(missil))){ invasores->jellyfishes[1][coluna] = NULL; invasores->aliens_mortos[2] ++; if ( invasores->aliens_mortos[2] == invasores->n_aliens) invasores->linhas--; return true; } break; case 3: if ( acerta_alien (invasores->crabs[0][coluna], get_x_missil(missil), get_y_missil(missil))){ invasores->crabs[0][coluna] = NULL; invasores->aliens_mortos[3] ++; if ( invasores->aliens_mortos[3] == invasores->n_aliens) invasores->linhas--; return true; } break; case 4: if ( acerta_alien (invasores->crabs[1][coluna], get_x_missil(missil), get_y_missil(missil))){ invasores->crabs[1][coluna] = NULL; invasores->aliens_mortos[4] ++; if ( invasores->aliens_mortos[4] == invasores->n_aliens) invasores->linhas--; return true; } break; } } return false; }
void processa_colisao(Buffer* buffer){ Missil* missil = get_missil_tanque(buffer->tanque); if (missil) if( get_y_missil(missil) < 0) destroi_missil_tanque(buffer->tanque); else if(get_y_missil(missil) > get_bottom_wave(buffer->invasores) && colide_wave(buffer->invasores, missil)) destroi_missil_tanque(buffer->tanque); else for (int i = 0; i < buffer->n_escudos && missil; i++) if (colide_escudo(buffer->escudo[i], missil)){ destroi_missil_tanque(buffer->tanque); break; } }
void processa_colisao(Buffer* buffer){ Missil* missil_tanque = get_missil_tanque(buffer->tanque); if (missil_tanque) if( get_y_missil(missil_tanque) < 0) destroi_missil_tanque(buffer->tanque); else { int pts = colide_wave(buffer->invasores, missil_tanque); if(pts){ *buffer->score += pts; destroi_missil_tanque(buffer->tanque); } else if(colide_nave(buffer->ovni, missil_tanque)){ play_sound(buffer->sound_mng, UFO_HIGHPITCH); *buffer->score += PONTOS_NAVE_MAE; buffer->ovni = NULL; destroi_missil_tanque(buffer->tanque); } else for (int i = 0; i < buffer->n_escudos && missil_tanque; i++) if (colide_escudo(buffer->escudo[i], missil_tanque)){ destroi_missil_tanque(buffer->tanque); break; } } for (int i=0; i<MAX_MISSEIS; i++){ Missil* missil_wave = get_missil_wave(buffer->invasores, i); if (missil_wave){ if ( get_y_missil(missil_wave) > buffer->altura_inicial) destroi_missil_wave(buffer->invasores, i); else{ for (int j = 0; j < buffer->n_escudos && missil_wave; j++) if (colide_escudo(buffer->escudo[j], missil_wave)){ destroi_missil_wave(buffer->invasores, i); break; } if (colide_tanque(buffer->tanque, missil_wave)){ destroi_missil_wave(buffer->invasores, i); tanque_morreu(buffer); } } } } if(get_bottom_wave(buffer->invasores) >= get_top_escudo(buffer->escudo[0])) for(int i=0; i<buffer->n_escudos; i++) destroi_topo_escudo(buffer->escudo[i]); }