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; }
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); }