void StateCharacterTurning::Update(float timeStep) { StateCharacterGrounded::Update(); RigidBody* body = pawn_->GetBody(); AnimationController* animCtrl = static_cast<PawnAnimated*>(pawn_)->GetAnimationController(); //apply a force to slow it down further, since we are changing direction body->ApplyImpulse(moveDir_ * pawn_->GetMoveForce() *0.25);//0.25 to dampen it //get the speed that we are travelling, that will determine when we turn around if(!flipped_) { //before we are flipped around, we drive the turning animation //float spd = pawn_->GetPlaneVelocity().Length(); //float turnTime = Fit(spd,0.0f,speed_,1.0f,0.0f); animCtrl->PlayExclusive("Models/Man/MAN_TurnSkidGunning.ani", 0,false, 0.1f); //animCtrl->SetTime("Models/Man/MAN_TurnSkidGunning.ani",turnTime); if(animCtrl->IsAtEnd("Models/Man/MAN_TurnSkidGunning.ani")) { Turn(); animCtrl->Play("Models/Man/MAN_TurnSkidGunningFlipped.ani", false, 0.0f); flipped_=true; } } else { animCtrl->Play("Models/Man/MAN_TurnSkidGunningFlipped.ani", false, 0.0f); //now that we are flipped we can set it to the next state too pawn_->SetState( new StateCharacterRunning(context_) ); } }
void StateCharacterStopping::Update(float timeStep) { StateCharacterGrounded::Update();//apply the brake force RigidBody* body = pawn_->GetBody(); AnimationController* animCtrl = static_cast<PawnAnimated*>(pawn_)->GetAnimationController(); //animation float skid = pawn_->GetPlaneVelocity().Length(); if(skid<=0.1) pawn_->SetState(new StateCharacterIdle(context_)); float skidTime = Fit(skid,pawn_->GetMoveForce(),0.0f,0.0f,0.03f); //GetSubsystem<DebugHud>()->SetAppStats("animtion speed:", skidTime ); animCtrl->PlayExclusive("Models/Man/MAN_TurnSkidGunning.ani", 0,false, 0.2f); animCtrl->SetTime("Models/Man/MAN_TurnSkidGunning.ani",skidTime); }
void SceneView3D::HandleUpdate(StringHash eventType, VariantMap& eventData) { // Timestep parameter is same no matter what event is being listened to float timeStep = eventData[Update::P_TIMESTEP].GetFloat(); if (MouseInView()) MoveCamera(timeStep); QueueUpdate(); if (preloadResourceScene_.NotNull()) { if (preloadResourceScene_->GetAsyncProgress() == 1.0f) { ResourceCache* cache = GetSubsystem<ResourceCache>(); XMLFile* xml = cache->GetResource<XMLFile>(dragAssetGUID_); if (dragNode_.NotNull()) { dragNode_->LoadXML(xml->GetRoot()); UpdateDragNode(0, 0); AnimationController* controller = dragNode_->GetComponent<AnimationController>(); if (controller) { controller->PlayExclusive("Idle", 0, true); dragNode_->GetScene()->SetUpdateEnabled(true); } } preloadResourceScene_ = 0; dragAssetGUID_ = ""; } } }
void Character::FixedUpdate(float timeStep) { /// \todo Could cache the components for faster access instead of finding them each frame RigidBody* body = GetComponent<RigidBody>(); AnimationController* animCtrl = GetComponent<AnimationController>(); // Update the in air timer. Reset if grounded if (!onGround_) inAirTimer_ += timeStep; else inAirTimer_ = 0.0f; // When character has been in air less than 1/10 second, it's still interpreted as being on ground bool softGrounded = inAirTimer_ < INAIR_THRESHOLD_TIME; // Update movement & animation const Quaternion& rot = node_->GetRotation(); Vector3 moveDir = Vector3::ZERO; const Vector3& velocity = body->GetLinearVelocity(); // Velocity on the XZ plane Vector3 planeVelocity(velocity.x_, 0.0f, velocity.z_); if (controls_.IsDown(CTRL_FORWARD)) moveDir += Vector3::FORWARD; if (controls_.IsDown(CTRL_BACK)) moveDir += Vector3::BACK; if (controls_.IsDown(CTRL_LEFT)) moveDir += Vector3::LEFT; if (controls_.IsDown(CTRL_RIGHT)) moveDir += Vector3::RIGHT; // Normalize move vector so that diagonal strafing is not faster if (moveDir.LengthSquared() > 0.0f) moveDir.Normalize(); // If in air, allow control, but slower than when on ground body->ApplyImpulse(rot * moveDir * (softGrounded ? MOVE_FORCE : INAIR_MOVE_FORCE)); if (softGrounded) { // When on ground, apply a braking force to limit maximum ground velocity Vector3 brakeForce = -planeVelocity * BRAKE_FORCE; body->ApplyImpulse(brakeForce); // Jump. Must release jump control inbetween jumps if (controls_.IsDown(CTRL_JUMP)) { if (okToJump_) { body->ApplyImpulse(Vector3::UP * JUMP_FORCE); okToJump_ = false; } } else okToJump_ = true; } // Play walk animation if moving on ground, otherwise fade it out if (softGrounded && !moveDir.Equals(Vector3::ZERO)) animCtrl->PlayExclusive("Models/Jack_Walk.ani", 0, true, 0.2f); else animCtrl->Stop("Models/Jack_Walk.ani", 0.2f); // Set walk animation speed proportional to velocity animCtrl->SetSpeed("Models/Jack_Walk.ani", planeVelocity.Length() * 0.3f); // Reset grounded flag for next frame onGround_ = false; }