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;
				}
}
Example #3
0
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]);
}