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