bool MoveShot(Shot* s, ShotType st) { int spd = data::flameSpd, idx = 0; if (st == ST_Rocket) { spd = data::rocketSpd; idx = 1; } else if (st == ST_Shard) { spd = data::shardSpd; idx = 2; } int dist = (SDL_GetTicks() - s->time) / 10 * spd; if (s->dir == D_Right) s->x = s->ox + dist; else if (s->dir == D_Left) s->x = s->ox - dist; else if (s->dir == D_Up) s->y = s->oy - dist; else if (s->dir == D_Down) s->y = s->oy + dist; if (s->x <= 0) { MakeExplosion((ParticleColor)idx, SDL_GetTicks(), 0, 4, s->y); delete s; data::shots[idx] = 0; return false; } else if (s->x >= data::tileCount * data::tileSize) { MakeExplosion((ParticleColor)idx, SDL_GetTicks(), 0, data::tileCount * data::tileSize - 4, s->y); delete s; data::shots[idx] = 0; return false; } else if (s->y <= 0) { MakeExplosion((ParticleColor)idx, SDL_GetTicks(), 0, s->x, 4); delete s; data::shots[idx] = 0; return false; } else if (s->y >= data::tileCount * data::tileSize) { MakeExplosion((ParticleColor)idx, SDL_GetTicks(), 0, s->x, data::tileCount * data::tileSize - 4); delete s; data::shots[idx] = 0; return false; } return true; }
FireBomb() { CrashX = Rand(WORLD_X - 1); CrashY = Rand(WORLD_Y - 1); MakeExplosion(CrashX, CrashY); ClearMes(); SendMesAt(-30, CrashX, CrashY); }
void Effects::Play( TPoint pos, Effect effect ) { switch(effect) { case IEffects::PlayerStoped: PlaySound("./_data/fall.wav"); break; case IEffects::EnemyDied: case IEffects::PlayerDied: PlaySound("./_data/expl.wav"); MakeExplosion( m_pm, round<Point>(pos), m_pTexExplosion ); break; default: ASSERT(false); }; }
void DisplayHandler () // display callback function { if (bRotate) { fCameraAngle[0] += 1.0 ; fCameraAngle[2] += 1.0 ; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ; glLoadIdentity() ; SetCamera() ; if (!bPause) { GLfloat fTempX = GLfloat(iLastMouseX) / GLfloat(iWinWidth) ; GLfloat fTempY = GLfloat(iLastMouseY) / GLfloat(iWinHeight) ; GLfloat fFixedX = (Player.ptLocation.dX - 8.65) / -17.3 ; GLfloat fFixedZ = (Player.ptLocation.dZ - 8.65) / -17.3 ; if (bRightMouseDown) { if (!(fFixedX + 0.02 > fTempX && fFixedX - 0.02 < fTempX)) { if (fFixedX > fTempX) { Player.ptLocation.dX += 0.1 ; if (Player.ptAngle.dZ > -20) Player.ptAngle.dZ -= 5.0 ; } else { Player.ptLocation.dX -= 0.1 ; if (Player.ptAngle.dZ < 20) Player.ptAngle.dZ += 5.0 ; } } else { if (Player.ptAngle.dZ < 0) Player.ptAngle.dZ += 5.0 ; else if (Player.ptAngle.dZ > 0) Player.ptAngle.dZ -= 5.0 ; } if (!(fFixedZ + 0.1 > fTempY && fFixedZ - 0.02 < fTempY)) { if (fFixedZ > fTempY) { Player.ptLocation.dZ += 0.1 ; } else { Player.ptLocation.dZ -= 0.1 ; } } } else Player.ptAngle.dZ = 0 ; if (randp() > 0.98) AddPlanet() ; AddStar() ; AddStar() ; AddStar() ; AddStar() ; AddStar() ; AddStar() ; if (/*!bExplode && */iCount % 15 == 0) SpawnEnemy() ; if (!bExplode && bAutofire && iCount % 4 == 0) FireShot(&Player, pPlayerShots) ; iCount ++ ; } DisplayStars() ; DisplayPlanets() ; DisplayEnemies() ; DisplayShots(pPlayerShots) ; DisplayShots(pEnemyShots) ; if (bExplode && !bPause) { if (iCount == 0) { printf("Game over\n") ; MakeExplosion(Player.ptLocation, 1000) ; } } else { if (iCount % 4) { Particle *pNew = new Particle ; pNew->ptLocation.dX = Player.ptLocation.dX + randp() * 0.5 - 0.25; pNew->ptLocation.dY = Player.ptLocation.dY + 0.3 * randp() ; pNew->ptLocation.dZ = Player.ptLocation.dZ - 1.5 + 0.2 * randp() ; pNew->ptVelocity.dX = 0 ; pNew->ptVelocity.dY = 0 ; pNew->ptVelocity.dZ = -0.2 ; pNew->ptColor.dX = 0.98 ; pNew->ptColor.dY = 0.59 + 0.3 * randp() - 0.15 ; pNew->ptColor.dZ = 0.01 ; pNew->dAlpha = 0.7 ; pNew->dMass = 1 ; pNew->dLife = 7 * randp() + 3 ; pNew->ptAcceleration = 0 ; Particles.AddBack(pNew) ; } Player.Display() ; } LinkedListNode<Particle> *pTravParticles = Particles.pHead ; LinkedListNode<Particle> *pTempParticle ; while (pTravParticles != 0) { pTravParticles->pValue->dLife -- ; if (pTravParticles->pValue->dLife <= 0) { pTempParticle = pTravParticles ; pTravParticles = pTravParticles->pNext ; Particles.Remove(pTempParticle, true) ; } else { pTravParticles->pValue->Apply(0.9) ; DisplayParticle(pTravParticles->pValue) ; pTravParticles = pTravParticles->pNext ; } } glFinish() ; glutSwapBuffers() ; glutPostRedisplay() ; }
void DisplayEnemies() { Entity *pTrav = pEnemys ; Entity *pTravShots ; Entity *pTemp ; bool bShot ; Point ptBBModelUFL, ptBBModelLBR, ptBBShotUFL, ptBBShotLBR ; while (pTrav != 0) { if (pTrav->ptLocation.dZ > -100) { ptBBModelUFL = pTrav->ptLocation + pTrav->pModel->ptBBUpperFrontLeft ; ptBBModelLBR = pTrav->ptLocation + pTrav->pModel->ptBBLowerBackRight ; bShot = false ; pTravShots = pPlayerShots ; while (pTravShots != 0) { ptBBShotUFL = pTravShots->ptLocation + pTravShots->pModel->ptBBUpperFrontLeft ; ptBBShotLBR = pTravShots->ptLocation + pTravShots->pModel->ptBBLowerBackRight ; if ((ptBBModelUFL < ptBBShotUFL && ptBBModelLBR > ptBBShotUFL) || (ptBBModelUFL < ptBBShotLBR && ptBBModelLBR > ptBBShotLBR)) { bShot = true ; MakeExplosion(pTrav->ptLocation, 500) ; if (!bExplode) { iScore += 100 ; printf ("Score: %i\n", iScore) ; } pTemp = pTrav ; pTrav = pTrav->pNext ; pTemp->pModel = 0 ; RemoveEntity(pEnemys, pTemp) ; pTravShots->pModel = 0 ; RemoveEntity(pPlayerShots, pTravShots) ; break ; } pTravShots = pTravShots->pNext ; } if (!bShot) { ptBBShotUFL = Player.ptLocation + Player.pModel->ptBBUpperFrontLeft ; ptBBShotLBR = Player.ptLocation + Player.pModel->ptBBLowerBackRight ; if (!bExplode && ((ptBBModelUFL < ptBBShotUFL && ptBBModelLBR > ptBBShotUFL) || (ptBBModelUFL < ptBBShotLBR && ptBBModelLBR > ptBBShotLBR))) { bExplode = true ; iCount = 0 ; MakeExplosion(pTrav->ptLocation, 500) ; pTemp = pTrav ; pTrav = pTrav->pNext ; pTemp->pModel = 0 ; RemoveEntity(pEnemys, pTemp) ; } else { // if (randp() > 0.99) if (!bExplode && randp() > 0.99) FireShot(pTrav, pEnemyShots) ; pTrav->Display() ; if (!bPause) pTrav->ptLocation = pTrav->ptLocation + pTrav->ptDirection ; pTrav = pTrav->pNext ; } } } else { pTemp = pTrav ; pTrav = pTrav->pNext ; pTemp->pModel = 0 ; RemoveEntity(pEnemys, pTemp) ; } } }
bool CheckShot(Shot* s, ShotType st) { int x = 0, y = 0; Actor* a; //starting coords for checking int sx = s->x / data::tileSize - 1; int sy = s->y / data::tileSize - 1; //check the 9 spots near the shot to see if any are within (using exact points) for (int i = sx < 0 ? 0 : sx; i < sx + 3 && i < data::tileCount; i++) for (int j = sy < 0 ? 0 : sy; j < sy + 3 && j < data::tileCount; j++) { a = data::actors[i + j * data::tileCount]; if (a != 0) //actor exists at spot { x = i * data::tileSize + a->x; y = j * data::tileSize + a->y; if (s->x < x|| s->y < y || s->x >= x + data::tileSize || s->y >= y + data::tileSize) continue; //outside object's bounds, ignore if (a->type == AT_Enemy && a->alive) //kill enemy { data::score += data::enemyKillScore; a->alive = false; a->anim = SDL_GetTicks(); data::particles->Emit(16, s->x, s->y, 8, (ParticleColor)(st - 1)); MakeExplosion((ParticleColor)(st - 1), SDL_GetTicks(), 0, s->x, s->y); data::shots[(int)st - 1] = 0; delete s; return false; } else if (a->type == AT_Pillar && a->alive) //rockets destroy pillars, shards go through { if (st == ST_Flame || st == ST_Rocket) { if (st == ST_Rocket) { a->alive = false; a->anim = SDL_GetTicks(); } data::particles->Emit(16, s->x, s->y, 8, (ParticleColor)(st - 1)); MakeExplosion((ParticleColor)(st - 1), SDL_GetTicks(), 0, s->x, s->y); data::shots[(int)st - 1] = 0; delete s; return false; } } else if (a->type == AT_Rubble && st == ST_Rocket) //rockets destroy rubble { data::actors[a->pos] = 0; delete a; } } } return true; //no collision }