예제 #1
0
파일: DumbTank.cpp 프로젝트: DeadManIV/AI
void DumbTank::Update(float deltaTime, SDL_Event e)
{
	//This is a dumb tank. Do NOT copy this approach.

	//Did we see a tank?
	if(mTanksICanSee.size() == 0)
	{
		ChangeState(TANKSTATE_IDLE);

		//If there are no visible tanks, then keep moving.

		//Check if we reached position before turning.
		if(mPosition.y < mPosition1.y && mHeading.y != -1.0f)
		{
			mHeading = Vector2D(0.0f, -1.0f);
			mRotationAngle = 180.0f;
			mVelocity = Vector2D();
			return;
		}
		else if(mPosition.y > mPosition2.y && mHeading.y != 1.0f)
		{
			mHeading = Vector2D(0.0f, 1.0f);
			mRotationAngle = 0.0f;
			mVelocity = Vector2D();
			return;
		}
		else
		{
			//Move if we are facing the correct direction.
			mCurrentSpeed -= kSpeedIncrement*deltaTime;
			if(mCurrentSpeed < -GetMaxSpeed())
				mCurrentSpeed = -GetMaxSpeed();
		}
	}
	else
	{
		//Rotate man to face enemy tank.
		Vector2D toTarget = mTanksICanSee[0]->GetCentralPosition()-GetCentralPosition();
		toTarget.Normalize();
		double dot = toTarget.Dot(mManFireDirection);
		if(dot < 0.95f)
			RotateManByRadian(kManTurnRate, -1, deltaTime);

		//Otherwise stop moving and fire at the visible tank.
		mVelocity = Vector2D();
		ChangeState(TANKSTATE_MANFIRE);
	}

	BaseTank::Update(deltaTime, e);
}
void ControlledTank::Update(float deltaTime, SDL_Event e)
{
	switch(e.type)
	{
		//Deal with keyboard input.
		case SDL_KEYDOWN:
			switch(e.key.keysym.sym)
			{
				//Tank speed keys.
				case SDLK_UP:
					mTankMoveDirection	= DIRECTION_FORWARD;
					mTankMoveKeyDown	= true;
				break;

				case SDLK_DOWN:
					mTankMoveDirection	= DIRECTION_BACKWARD;
					mTankMoveKeyDown	= true;
				break;

				//Tank directional keys.
				case SDLK_LEFT:
					if(!mTankTurnKeyDown)
					{
						mTankTurnKeyDown	= true;
						mTankTurnDirection	= DIRECTION_LEFT;
					}
				break;

				case SDLK_RIGHT:
					if(!mTankTurnKeyDown)
					{
						mTankTurnKeyDown		= true;
						mTankTurnDirection	= DIRECTION_RIGHT;
					}
				break;

				//Man directional keys
				case SDLK_a:
					if(!mManKeyDown)
					{
						mManKeyDown		  = true;
						mManTurnDirection = DIRECTION_LEFT;
					}
				break;

				case SDLK_d:
					if(!mManKeyDown)
					{
						mManKeyDown		  = true;
						mManTurnDirection = DIRECTION_RIGHT;
					}
				break;

				//Fire input.
				case SDLK_1:
					ChangeState(TANKSTATE_MANFIRE);
				break;

				case SDLK_2:
					if(mCurrentState != TANKSTATE_CANNONFIRE)
						ChangeState(TANKSTATE_CANNONFIRE);
				break;
			}
		break;

		case SDL_KEYUP:
			switch(e.key.keysym.sym)
			{
				//Tank directional input.
				case SDLK_LEFT:
				case SDLK_RIGHT:
					mTankTurnKeyDown		= false;
					mTankTurnDirection	= DIRECTION_UNKNOWN;
				break;

				case SDLK_UP:
				case SDLK_DOWN:
					//mTankMoveKeyDown = false;
					//mTankMoveDirection = DIRECTION_NONE;
					//mCurrentSpeed = 0.0f;
					//mVelocity.Zero();
				break;

				//Man directional input.
				case SDLK_a:
				case SDLK_d:
					mManKeyDown			= false;
					mManTurnDirection	= DIRECTION_UNKNOWN;
				break;

				//Rocket input.
				case SDLK_1:
					ChangeState(TANKSTATE_IDLE);
				break;

				//Drop Mine input.
				case SDLK_3:
					ChangeState(TANKSTATE_DROPMINE);
				break;
			}
		break;
	}
	
	//Tank movement.
	if(mTankTurnKeyDown)
	{
		if(mTankTurnDirection == DIRECTION_LEFT)
			RotateHeadingByRadian(0.05f, -1);
		else if(mTankTurnDirection == DIRECTION_RIGHT)
			RotateHeadingByRadian(0.05f, 1);
	}
	if(mTankMoveKeyDown)
	{
		if(mTankMoveDirection == DIRECTION_FORWARD)
		{
			mCurrentSpeed -= kSpeedIncrement*deltaTime;
			if(mCurrentSpeed < -GetMaxSpeed())
				mCurrentSpeed = -GetMaxSpeed();
		}
		else if(mTankMoveDirection == DIRECTION_BACKWARD)
		{
			mCurrentSpeed += kSpeedIncrement*deltaTime;
			if(mCurrentSpeed > GetMaxSpeed())
				mCurrentSpeed = GetMaxSpeed();
		}
	}

	//Man movement.
	if(mManKeyDown)
	{
		if(mManTurnDirection == DIRECTION_LEFT)
			RotateManByRadian(-0.05f, 1);
		else if(mManTurnDirection == DIRECTION_RIGHT)
			RotateManByRadian(0.05f, 1);
	}

	//Call parent update.
	BaseTank::Update(deltaTime, e);
}