Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
FireBomb()
{
  CrashX = Rand(WORLD_X - 1);
  CrashY = Rand(WORLD_Y - 1);
  MakeExplosion(CrashX, CrashY);
  ClearMes();
  SendMesAt(-30, CrashX, CrashY);
}
Ejemplo n.º 3
0
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);
  };
}
Ejemplo n.º 4
0
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() ;
}
Ejemplo n.º 5
0
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) ;
		}
	}
}
Ejemplo n.º 6
0
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
}