Example #1
0
void deleteBulletPool(BulletPool *bp){
	int i;
	for (i = 0; i < 5; i++) {
		deleteBullet(bp->particles_[i]);
	}
	free(bp);
}
Example #2
0
void physics(Game *g)
{
	Flt d0,d1,dist;
	//Update ship position
	g->ship.pos[0] += g->ship.vel[0];
	g->ship.pos[1] += g->ship.vel[1];
	//Check for collision with window edges
	if (g->ship.pos[0] < 0.0) {
		g->ship.pos[0] += (float)xres;
	}
	else if (g->ship.pos[0] > (float)xres) {
		g->ship.pos[0] -= (float)xres;
	}
	else if (g->ship.pos[1] < 0.0) {
		g->ship.pos[1] += (float)yres;
	}
	else if (g->ship.pos[1] > (float)yres) {
		g->ship.pos[1] -= (float)yres;
	}
	//
	//
	//Update bullet positions
	struct timespec bt;
	clock_gettime(CLOCK_REALTIME, &bt);
	Bullet *b = g->bhead;
	while (b) {
		//How long has bullet been alive?
		double ts = timeDiff(&b->time, &bt);
		if (ts > 2.5) {
			//time to delete the bullet.
			Bullet *saveb = b->next;
			deleteBullet(g, b);
			b = saveb;
			g->nbullets--;
			continue;
		}
		//move the bullet
		b->pos[0] += b->vel[0];
		b->pos[1] += b->vel[1];
		//Check for collision with window edges
		if (b->pos[0] < 0.0) {
			b->pos[0] += (float)xres;
		}
		else if (b->pos[0] > (float)xres) {
			b->pos[0] -= (float)xres;
		}
		else if (b->pos[1] < 0.0) {
			b->pos[1] += (float)yres;
		}
		else if (b->pos[1] > (float)yres) {
			b->pos[1] -= (float)yres;
		}
		b = b->next;
	}
	//
	//Update asteroid positions
	Asteroid *a = g->ahead;
	while (a) {
		a->pos[0] += a->vel[0];
		a->pos[1] += a->vel[1];
		//Check for collision with window edges
		if (a->pos[0] < -100.0) {
			a->pos[0] += (float)xres+200;
		}
		else if (a->pos[0] > (float)xres+100) {
			a->pos[0] -= (float)xres+200;
		}
		else if (a->pos[1] < -100.0) {
			a->pos[1] += (float)yres+200;
		}
		else if (a->pos[1] > (float)yres+100) {
			a->pos[1] -= (float)yres+200;
		}
		a->angle += a->rotate;
		a = a->next;
	}
	//
	//Asteroid collision with bullets?
	//If collision detected:
	//     1. delete the bullet
	//     2. break the asteroid into pieces
	//        if asteroid small, delete it
	a = g->ahead;
	while (a) {
		//is there a bullet within its radius?
		Bullet *b = g->bhead;
		while (b) {
			d0 = b->pos[0] - a->pos[0];
			d1 = b->pos[1] - a->pos[1];
			dist = (d0*d0 + d1*d1);
			if (dist < (a->radius*a->radius)) {
				//std::cout << "asteroid hit." << std::endl;
				//this asteroid is hit.
				if (a->radius > 20.0) {
					//break it into pieces.
					Asteroid *ta = a;
					buildAsteroidFragment(ta, a);
					int r = rand()%10+5;
					for (int k=0; k<r; k++) {
						//get the next asteroid position in the array
						Asteroid *ta = new Asteroid;
						buildAsteroidFragment(ta, a);
						//add to front of asteroid linked list
						ta->next = g->ahead;
						if (g->ahead != NULL)
							g->ahead->prev = ta;
						g->ahead = ta;
						g->nasteroids++;
					}
				} else {
					a->color[0] = 1.0;
					a->color[1] = 0.1;
					a->color[2] = 0.1;
					//asteroid is too small to break up
					//delete the asteroid and bullet
					Asteroid *savea = a->next;
					deleteAsteroid(g, a);
					a = savea;
					g->nasteroids--;
				}
				//delete the bullet...
				Bullet *saveb = b->next;
				deleteBullet(g, b);
				b = saveb;
				g->nbullets--;
				if (a == NULL)
					break;
				continue;
			}
			b = b->next;
		}
		if (a == NULL)
			break;
		a = a->next;
	}
	//---------------------------------------------------
	//check keys pressed now
	if (keys[XK_Left]) {
		g->ship.angle += 4.0;
		if (g->ship.angle >= 360.0f)
			g->ship.angle -= 360.0f;
	}
	if (keys[XK_Right]) {
		g->ship.angle -= 4.0;
		if (g->ship.angle < 0.0f)
			g->ship.angle += 360.0f;
	}
	if (keys[XK_Up]) {
		//apply thrust
		//convert ship angle to radians
		Flt rad = ((g->ship.angle+90.0) / 360.0f) * PI * 2.0;
		//convert angle to a vector
		Flt xdir = cos(rad);
		Flt ydir = sin(rad);
		g->ship.vel[0] += xdir*0.02f;
		g->ship.vel[1] += ydir*0.02f;
		Flt speed = sqrt(g->ship.vel[0]*g->ship.vel[0]+
										g->ship.vel[1]*g->ship.vel[1]);
		if (speed > 10.0f) {
			speed = 10.0f;
			normalize(g->ship.vel);
			g->ship.vel[0] *= speed;
			g->ship.vel[1] *= speed;
		}
	}
	if (keys[XK_space]) {
		//a little time between each bullet
		struct timespec bt;
		clock_gettime(CLOCK_REALTIME, &bt);
		double ts = timeDiff(&g->bulletTimer, &bt);
		if (ts > 0.1) {
			timeCopy(&g->bulletTimer, &bt);
			//shoot a bullet...
			Bullet *b = new Bullet;
			timeCopy(&b->time, &bt);
			b->pos[0] = g->ship.pos[0];
			b->pos[1] = g->ship.pos[1];
			b->vel[0] = g->ship.vel[0];
			b->vel[1] = g->ship.vel[1];
			//convert ship angle to radians
			Flt rad = ((g->ship.angle+90.0) / 360.0f) * PI * 2.0;
			//convert angle to a vector
			Flt xdir = cos(rad);
			Flt ydir = sin(rad);
			b->pos[0] += xdir*20.0f;
			b->pos[1] += ydir*20.0f;
			b->vel[0] += xdir*6.0f + rnd()*0.1;
			b->vel[1] += ydir*6.0f + rnd()*0.1;
			b->color[0] = 1.0f;
			b->color[1] = 1.0f;
			b->color[2] = 1.0f;
			//add to front of bullet linked list
			b->next = g->bhead;
			if (g->bhead != NULL)
				g->bhead->prev = b;
			g->bhead = b;
			g->nbullets++;
		}
	}
}
Example #3
0
void collision ( Game *game )
{
	gatorEat = false;
	if ( !game->demo.on ) {
		float gravity = 0.3*game->difficulty;
		if (game->difficulty == 3)
			gravity -= 0.1;
		if ( game->c.isJumping ) {
			game->c.center[1] += game->c.velocity[1];
			game->c.velocity[0] = 0;
			game->c.velocity[1] -= gravity;
			if ( game->c.center[1] <= 0 ) {
				game->c.isJumping = false;
				game->c.isStanding = true;
				game->c.center[1] = 15;
			}
		}
		if ( game->c.center[0] == game->c.newPosX &&
				game->c.center[1] == game->c.newPosY )
			return;
		if ( game->c.center[0] < game->c.newPosX ) {
			if ( game->c.isJumping ) {
				game->c.center[0] += 20.0;
			} else {
				game->c.center[0] += 10.0;
				if ( game->c.velocity[0]<=0 )
					game->c.velocity[0]+=0.2;
			}
			if ( game->c.center[0] > game->c.newPosX )
				game->c.center[0] = game->c.newPosX;
		} else if ( game->c.center[0] > game->c.newPosX ) {
			if ( game->c.isJumping ) {
				game->c.center[0] -= 15.0;
			} else {
				game->c.center[0] -= 10.0;
				if ( game->c.velocity[0]>=0 )
					game->c.velocity[0] -=0.2;
			}
			if ( game->c.center[0] < game->c.newPosX )
				game->c.center[0] = game->c.newPosX;
		}
	}
	if ( game->frog->rocket() && game->frog->getFrame() ==1 ) {
		playSounds ( "./wav/rocket.wav", 1.0f, false, game->muted );
	}
	if ( game->rocketSound )
		playSounds ( "./wav/rocket.wav", 1.0f, false, true );
	// NO collision below this Y value
	if ( game->frog->getYpos() > ( 50+ ( 20*game->difficulty ) ) ) {
		//check for frog(ball)'s collision with lilies
		Lilypad *node = game->ihead;
		if ( game->c.isStanding == false ) {
			while ( node ) {
				float d1 = node->pos[1] - game->c.center[1];
				float d2 = node->pos[0] - game->c.center[0];
				float dist = sqrt ( d1*d1 + d2*d2 );
				if ( dist <= game->c.radius+node->size+15/game->difficulty ) {
					//rejump the ball
					game->c.isJumping = true;
					game->c.velocity[1] = 15.0;
					playSounds ( "./wav/boing2.wav",1.0f, false,game->muted );
					deleteLily ( node,game );
					//basic scoring for now -Kevin
					if (game->stresstest) {
						game->score+=1;
					} else {
						if (game->troll_lilypad &&
								game->difficulty == 1) {
							game->score+=2;
						} else if (game->troll_lilypad &&
								game->difficulty == 2) {
							game->score+=4;
						} else if (game->troll_lilypad &&
								game->difficulty == 3) {
							game->score+=7;
						}
						game->score+=10;
					}
				}
				node = node->next;
			}
		}
		// ========================================
		// collision frog with log
		for ( int i=0; i<4; i++ ) {
			if ( game->frog->getXpos() <= game->log[i]->getXpos()+15 &&
					game->frog->getXpos() >= game->log[i]->getXpos()-15 &&
					game->frog->getYpos() <= game->log[i]->getYpos()+50 &&
					game->frog->getYpos() >= game->log[i]->getYpos()-50 ) {
				game->c.velocity[1]=game->log[i]->getYvel()+15;
				playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
				game->score+=2;
			}
		}
		// ============================================
		// collision frog with golden turtle
		if ( game->turtle->isGolden() ) {
			if ( game->frog->getXpos() <= game->turtle->getXpos()+15 &&
					game->frog->getXpos() >= game->turtle->getXpos()-15 &&
					game->frog->getYpos() <= game->turtle->getYpos()+50 &&
					game->frog->getYpos() >= game->turtle->getYpos()-50 ) {
				game->c.velocity[1] = game->turtle->getYvel()+15;
				playSounds ( "./wav/money.wav",1.0f, false, game->muted );
				game->score+=500;
				game->turtle->notGolden();
			}
		}
		// ============================================
		//Collision between frog and bullet
		float d0, d1, dist;
		Bullet *b = &game->barr[0];
		d0 = b->pos[0] - game->frog->getXpos();
		d1 = b->pos[1] - game->frog->getYpos();
		dist = ( d0*d0 + d1*d1 );
		if ( dist < ( 30.0f * 30.0f ) ) {
			shotMonster = true;
			deleteBullet(game, b);
			gameOver ( game );
		}
		// FLY =====================================================
		int tongue=60/game->difficulty;
		if ( game->frog->getXpos() >= game->fly->getXpos()- tongue &&
				game->frog->getXpos() <= game->fly->getXpos()+ tongue &&
				game->frog->getYpos() <= game->fly->getYpos()+ tongue &&
				game->frog->getYpos() >= game->fly->getYpos()- tongue ) {
			playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
			game->score+=50;
			game->fly->death ( game->frog->getXpos(),game->frog->getYpos() );
			//std::cout<<"dead fly"<<std::endl;
		}
		// SWARM =====================================================
		if ( game->swarmOn ) {
			for ( int i=0; i < game->swarmSize; i++ ) {
				int tongue=30/game->difficulty;
				if ( game->frog->getXpos() >=
						game->swarm[i]->getXpos()-tongue &&
						game->frog->getXpos() <=
						game->swarm[i]->getXpos()+ tongue &&
						game->frog->getYpos() <=
						game->swarm[i]->getYpos()+ tongue &&
						game->frog->getYpos() >=
						game->swarm[i]->getYpos()- tongue ) {
					playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
					game->score+=1;
					game->swarm[i]->death(game->frog->getXpos(),
							game->frog->getYpos());
				}
			}
			//std::cout<<"dead fly"<<std::endl;
		}
		// pickup rocketPack ==================================================
		int reach=50/game->difficulty;
		if ( game->frog->getXpos() >= game->rocketPack->getXpos()- reach &&
				game->frog->getXpos() <= game->rocketPack->getXpos()+ reach &&
				game->frog->getYpos() <= game->rocketPack->getYpos()+ reach &&
				game->frog->getYpos() >= game->rocketPack->getYpos()- reach ) {
			playSounds ( "./wav/tick.wav",1.0f, false, game->muted );
			game->score+=10;
			game->frog->addRocket();
			game->rocketPack->setFrame ( 500 );
			//std::cout<<"dead rocketPack"<<std::endl;
		}
		// collision frog with gator head
		int head = 5 * game->difficulty;
		if ( game->frog->getXpos() <= game->gator->getXpos()- ( 5 + head )  &&
				game->frog->getXpos() >= game->gator->getXpos()-
				( 30 + head ) &&
				game->frog->getYpos() <= game->gator->getYpos()+
				( 5 + head ) &&
				game->frog->getYpos() >= game->gator->getYpos()-
				( 5 + head ) ) {
			game->gator->eat();
			gatorEat = true;
			gameOver ( game );
		}
		// collision frog with gator back
		int back = 90/ game->difficulty;
		if ( game->frog->getXpos() <= game->gator->getXpos()+ back &&
				game->frog->getXpos() >= game->gator->getXpos()-
				( back-head ) &&
				game->frog->getYpos() <= game->gator->getYpos()+ back/2 &&
				game->frog->getYpos() >= game->gator->getYpos()-back/2 ) {
			game->c.isJumping = true;
			game->c.velocity[1] = 15.0;
			playSounds ( "./wav/boing2.wav",1.0f, false,game->muted );
			game->score+=30;
			game->gator->dive();
		}
		// collision gator with log
		for ( int i=0; i<4; i++ ) {
			if ( game->gator->getXpos() <= game->log[i]->getXpos()+80 &&
					game->gator->getXpos() >= game->log[i]->getXpos()-20 &&
					game->gator->getYpos() >= game->log[i]->getYpos()-50 &&
					game->gator->getYpos() <= game->log[i]->getYpos()+50 ) {
				game->gator->move ( game->gator->getXpos()+45,
						game->gator->getYpos()+15,
						game->gator->getXvel(),game->gator->getYvel() );
			}
		}
	}
	//
	// check if frog left bridge
	if ( game->frog->getYpos() > 60 && game->score > 0 ) {
		//move bridge downward
		game->bridge->move ( game->bridge->getXpos(),
				game->bridge->getYpos()-0.5, 0, 0 );
	}
	//fell down
	if ( game->frog->getYpos() <=40 && game->bridge->getYpos() <=100 ) {
		gameOver ( game );
	}
	//frog at bottom
	if ( game->frog->getYpos() <= 40.0 &&
			game->bridge->getYpos() <=100 && game->lives < 1  ) {
		game->highscore[++game->scoreCount] = game->score;
		game->score = 0;
	}
	shotMonster = false;
}
Example #4
0
void gameOver ( Game *game )
{
	if ( game->demo.on ) {
		return;
	}
	if ( checkHighScore ( game,game->score ) ) {
		game->tempscore = game->score;
	}
	if ( !game->hschecked ) {
		game->hschecked = true;
		initHighScore ( game );
	}
	if ( shotMonster ) {
		// move explosion on screen if offscreen
		if ( game->explosion->getXpos() < 0 ) {
			playSounds ( "./wav/explosion.wav",1.0f, false,game->muted );
			game->explosion->move ( game->frog->getXpos(),
					game->frog->getYpos()+40,0,0 );
			//game->bossGO = false;
		}
		for (int i=0; i<game->nbullets; i++) {
			Bullet *b = &game->barr[i];
			deleteBullet(game, b);
		}
	} else {
		// move splash on screen if offscreen
		if ( game->splash->getXpos() < 0 ) {
			if (gatorEat)
				playSounds ( "./wav/bite.wav", 1.0f, false, game->muted );
			else
				playSounds ( "./wav/fishsplash.wav",1.0f, false,game->muted );
			game->splash->move ( game->frog->getXpos(),
					game->frog->getYpos()+40,0,0 );
		}
		//sendScoresToPHP(game->score, game->difficulty);
	}
	//move frog,logs and gator offscreen
	game->frog->move ( -200,-200,0,0 );
	for ( int i=0; i<4; i++ ) {
		game->log[i]->move ( -200*i,-300,0,0 );
	}
	//game->gator->move ( -200,-200,0,0 );
	// reset lilies
	clearLilies ( game );
	//wait for splash to complete
	if ( game->splash->getFrame() >=195 ) {
		//cout << game->tempscore << endl;
		//move bridge back
		game->bridge->move ( 300,150,0,0 );
		game->lives--;
		for ( int i=0; i<4; i++ ) {
			game->log[i]->move ( 50*i,-100*i,-.15*i,-1 );
		}
		game->gator->move ( -300,400,-2,-.5 );
		game->frog->move ( -100,-800,0,0 );
		game->frog->setYpos ( game->frog->getYpos()-10 );
		game->frog->setXpos ( game->frog->getXpos()-800 );
		game->splash->move ( -200,-200,0,0 );
		if ( checkHighScore ( game,game->tempscore ) && game->lives < 0 ) {
			game->isHighScore = true;
			game->showTaunt = false;
			playSounds ( "./wav/wow.wav", 0.5, false, game->muted );
		} else if (game->lives < 0 ) {
			game->isHighScore = false;
			game->showTaunt = true;
			playSounds ( "./wav/haha.wav", 0.5, false, game->muted );
		}
		if ( game->lives < 0 ) {
			game->gameover = true;
			playSounds ( "./wav/gameoverSound.wav", 1.0f, false, game->muted);
			game->lives = 1;
		}
		game->hschecked = false;
	}
}
void displayAllBullets()
{
	int pos;
	for (int i=0;i<server_data.bullet_count;i++)
        {   

		Bullet b=server_data.bullets[i];
	        switch(b.dir)
		{
			case DOWN:
				b.i = b.i-1;
				break;
			case UP:
				b.i = b.i+1;
				break;
			case RIGHT:
				b.j = b.j+1;
				break;
			case LEFT:
				b.j = b.j-1;
				break;
		}
		if(CheckPlayerCollide(b.i,b.j)!=-1)
		{      
		
		     pos=CheckPlayerCollide(b.i,b.j);
			deleteBullet(i);
			Alien a=server_data.aliens[pos];
			a.energy -=20;	
			server_data.aliens[pos]=a;	
			
		
		if(getCommandoIndex(server_data.bullets[i].pid)!=-1)
		{
			int commpos =getCommandoIndex(server_data.bullets[i].pid);
			 server_data.commandos[commpos].score +=100; 
			
		}
		if(getAlienIndex(server_data.bullets[i].pid)!=-1)
		{
			int alienpos =getAlienIndex(server_data.bullets[i].pid);
			 server_data.aliens[alienpos].score -=100; 
			
		}
			

			if(a.energy <= 0)
			{server_data.map_matrix[a.i][a.j]=NONE;
			deleteAlien(pos);}
		 
				
		}
		else if(checkAppleCollide(b.i,b.j)!=-1)
		{	
			pos=checkAppleCollide(b.i,b.j);

			deleteBullet(i);

			destroyGenerateApple(pos);
			server_data.map_matrix[b.i][b.j]=NONE;
		}
		else if(isObstacle(b.i,b.j))
		{

			deleteBullet(i);
			server_data.map_matrix[b.i][b.j]=NONE;
		}
		else if(checkBulletCollide(b.i,b.j)!=-1)
		{
			pos=checkBulletCollide(b.i,b.j);

			if(i>pos)
			{
			deleteBullet(i);
			deleteBullet(pos);
			}
			else
			{
			deleteBullet(pos);
			deleteBullet(i);
			}
			server_data.map_matrix[b.i][b.j]=NONE;
		}
		if(checkCommandoCollide(b.i,b.j)!=-1)
		{       
		
			pos=checkCommandoCollide(b.i,b.j);
			
			Commando c=server_data.commandos[pos];
			c.energy -=20;	
			server_data.commandos[pos]=c;
			
			
			
		if(getCommandoIndex(server_data.bullets[i].pid)!=-1)
		{
			int commpos =getCommandoIndex(server_data.bullets[i].pid);
			 server_data.commandos[commpos].score -=100; 
			
		}
		if(getAlienIndex(server_data.bullets[i].pid)!=-1)
		{
			int alienpos =getAlienIndex(server_data.bullets[i].pid);
			 server_data.aliens[alienpos].score +=100; 
			
		}
			
   			
			if(c.energy <= 0)
			{server_data.map_matrix[c.i][c.j]=NONE;
			deleteCommando(pos);}
			deleteBullet(i);
		
		}
		else
		{
			server_data.bullets[i]=b;
			if(b.i<0 || b.i>(ROWS-1) ||b.j <0 || b.j >(COLUMNS-1) )
			{
				deleteBullet(i);
			}
		}
	}
}