void deleteBulletPool(BulletPool *bp){ int i; for (i = 0; i < 5; i++) { deleteBullet(bp->particles_[i]); } free(bp); }
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++; } } }
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; }
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); } } } }