/* Keep running until time is up (may want to use some distance measure instead) */ eState StrategyGoStraight::apply() { eState nNewState = knGoStraight; // assume we will keep running if (TargetInSight() && ((int)m_nCallCount/50.0>GO_STRAIGHT_NO_TRACK_TIME)) { // Target spotted, switch to Track state nNewState = knTrack; m_nCallCount = 0; // reset call count in case we ever re-enter } else if (getKeepMoving()) { m_nCallCount++; // track the number of times we have been called float xval = m_gyroDriveCtrl->calcPID(m_gyro->GetAngle()); m_robotDrive->ArcadeDrive(-1.0, xval, false); //m_pickup->Drive(-0.4,true); } else { // time is up, switch to Spin state nNewState = knSpin; m_nCallCount = 0; // reset call count in case we ever re-enter } return nNewState; }
void CCharacter::Update( float dTime ) { NNObject::Update(dTime); clock_t currentTime = clock(); ShowHitEffect(dTime); UpdateHPBar(); UpdateZindex(); UpdateAttackTarget(); //현재 얼어있는 상태라면 이동/공격이 불가 if(m_Freeze) { CheckMeltingTime(currentTime); } else { //AttackTarget을 설정하고 Attack이 가능하면(사정거리 체크) //공격하고 그렇지 않으면 이동, 시야에 없으면 앞으로 전진 if(TargetInRange()) { if( CheckAttackTiming(currentTime) ) { AttackEnemy(currentTime); } } else if (TargetInSight() ) { GoToAttackTarget(dTime); } else { GoForward(dTime); } } }
/* Keep running until time is up (may want to use some distance measure instead) */ eState StrategyCurveLeft::apply() { eState nNewState = knCurveLeft; // assume we will keep running if (TargetInSight()&&((int)m_nCallCount/50.0>CURVE_LEFT_NO_TRACK_TIME)) { // Target spotted, switch to Track state nNewState = knTrack; m_nCallCount = 0; // reset call count in case we ever re-enter } else if (getKeepMoving()) { m_nCallCount++; // track the number of times we have been called m_gyroDriveCtrl->setDesiredValue(45.0f/50.0/3.0*(int)m_nCallCount);//take 5s to curve 45deg float xval = m_gyroDriveCtrl->calcPID(m_gyro->GetAngle()); m_robotDrive->ArcadeDrive(-0.5-((int)m_nCallCount)/50.0/2.0/5.0, xval, false);//take 5s to get up to full speed //m_robotDrive->ArcadeDrive(-1.0, -0.9, false); //m_pickup->Drive(-0.4,true); } else { // time is up, switch to Spin state nNewState = knSpin; m_nCallCount = 0; // reset call count in case we ever re-enter } return nNewState; }
/* Spin on the spot */ eState StrategySpin::apply() { eState nNewState = knSpin; // assume we will keep running // Keep turning until we find a target if (TargetInSight()) { // start tracking the target nNewState = knTrack; } else { if (m_kbot->getAutoDirection()) { m_robotDrive->ArcadeDrive(-0.8, -0.9, false); } else { m_robotDrive->ArcadeDrive(-0.8, 0.9, false); } } return nNewState; }