bool S013010C_Aaron_Smith_Tank::RotateHeadingToTarget(Vector2D targetPos)
{
	Vector2D toTarget = Vec2DNormalize(GetCentralPosition() - targetPos);

	//Determine the angle between the heading vector and the target.

	double angle = atan2(toTarget.y - mHeading.y,toTarget.x - mHeading.x);

	
	//cout << angle << endl;
	angle *= (180 / Pi);
	//Return true if the player is facing the target.
	/*if (angle < -0.007)
		return true;*/

	if (angle < 0)
	{
		angle = 360 - (-angle);
	}

	RotateHeadingByRadian(angle, mHeading.Sign(toTarget));

	return true;
}
Exemple #2
0
void TestTank::Update(float deltaTime, SDL_Event e)
{
	//TODO: Adjust mHeading.
	switch (e.type)
	{
	case SDL_MOUSEMOTION:
		mMouseX = e.motion.x;
		mMouseY = e.motion.y;

		//cout << mMouseX << ":" << mMouseY << endl;
		break;
	case SDL_MOUSEBUTTONDOWN:
		if (e.button.button == SDL_BUTTON_LEFT)
		{
				mTargetPos = Vector2D(e.motion.x, e.motion.y);
				SetHasTarget(true);
				mSteering->TurnArriveOn();
		}
		else
		{
			//cout << "Mouse Down: " << e.motion.x << ":" << e.motion.y << endl;
		}
		break;
	case SDL_KEYDOWN:
		if (e.key.keysym.sym == SDLK_SPACE)
		{
			mDrawTarget = !mDrawTarget;
		}
		else if (e.key.keysym.sym == SDLK_RETURN)
		{
			mShowingDebug = !mShowingDebug;
		}
		else if (e.key.keysym.sym == SDLK_RIGHT)
		{
			RotateHeadingByRadian(0.05, 1);
		}
		break;

	}


	//if (mTanksICanSee.size() >= 1)
	//{
	//	bool isSafe = true;
	//	for (BaseTank* enemy : mTanksICanSee)
	//	{

	//		Vector2D targetDir = enemy->GetPosition() - GetPosition();
	//		float distance = targetDir.Length();

	//		if (distance < 100)
	//		{
	//			cout << "START FLEEING!!!!!" << endl;
	//			mTargetPos = enemy->GetCentrePosition();
	//			mEnemyHeading = enemy->GetHeading();
	//			mEnemySpeed = enemy->GetCurrentSpeed();
	//			mEnemyVelocity = enemy->GetVelocity();
	//			mSteering->TurnFleeOn();
	//			mSteering->TurnArriveOff();

	//			isSafe = false;
	//		}

	//		if (!mIsTestTank)
	//		{
	//			mSteering->TurnPursueOn();
	//		}
	//	}

	//	/*if (isSafe)
	//	mSteering->TurnArriveOn();*/

	//}
	//Call parent update.
	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);
}