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_) ); } }
static duk_ret_t RigidBody_ApplyImpulse_float3_float3(duk_context* ctx) { int numArgs = duk_get_top(ctx); RigidBody* thisObj = GetThisWeakObject<RigidBody>(ctx); float3& impulse = *GetCheckedValueObject<float3>(ctx, 0, float3_ID); float3 position = numArgs > 1 ? *GetCheckedValueObject<float3>(ctx, 1, float3_ID) : float3::zero; thisObj->ApplyImpulse(impulse, position); return 0; }
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; }
void WizardSkill0::HandleNodeCollisionStart(StringHash eventType, VariantMap& eventData) { using namespace NodeCollisionStart; SharedPtr<Node> otherNode = SharedPtr<Node>(static_cast<Node*>(eventData[P_OTHERNODE].GetPtr())); RigidBody* otherRB = static_cast<RigidBody*>(eventData[P_OTHERBODY].GetPtr()); RigidBody* rb = static_cast<RigidBody*>(eventData[P_BODY].GetPtr()); Node* noed = rb->GetNode(); if (!otherNode->HasComponent<Health>()) { /*Node* particleStartNode_ = noed->GetScene()->CreateChild(0,LOCAL); ParticleEmitter* emitterStartFX_ = particleStartNode_->CreateComponent<ParticleEmitter>(LOCAL); emitterStartFX_->SetEffect(main_->cache_->GetResource<ParticleEffect>("Particle/dustCloud.xml")); emitterStartFX_->SetViewMask(1); particleStartNode_->SetPosition(noed->GetPosition() + (Vector3::UP)); emitterStartFX_->SetEmitting(true); particleStartNode_->AddComponent(new TimedRemove(context_, main_, 2.0f), 0, LOCAL);*/ /*Node* lightNode = noed->GetScene()->CreateChild(0,LOCAL); lightNode->SetPosition(noed->GetPosition() + (Vector3::UP)); Light* light = lightNode->CreateComponent<Light>(LOCAL); light->SetBrightness(2.0f); light->SetPerVertex(true); light->SetRange(5.0f); lightNode->AddComponent(new TimedRemove(context_, main_, 0.1f), 0, LOCAL);*/ //noed->Remove(); return; } if (otherNode->GetVar("npcType").GetInt() == 1)//terry { otherNode->GetComponent<Health>()->ModifyHealth(50, -1, false); if (otherNode->GetComponent<Health>()->health_ <= 0) { otherNode->GetComponent<Health>()->ModifyHealth(100, 0, false); otherNode->GetScene()->GetComponent<TerrySpawner>()->RespawnTerry(otherNode); } Vector3 victoria = otherNode->GetPosition(); Vector3 dir = (victoria - noed->GetPosition()).Normalized(); dir.y_ = 1.0f; dir *= 10.0f; otherNode->AddComponent(new Stunned(context_, main_, 4.0f), 0, LOCAL); otherRB->ApplyImpulse(dir); /*Node* particleStartNode_ = noed->GetScene()->CreateChild(0,LOCAL); ParticleEmitter* emitterStartFX_ = particleStartNode_->CreateComponent<ParticleEmitter>(LOCAL); emitterStartFX_->SetEffect(main_->cache_->GetResource<ParticleEffect>("Particle/dustCloud.xml")); emitterStartFX_->SetViewMask(1); particleStartNode_->SetPosition(noed->GetPosition() + (Vector3::UP)); emitterStartFX_->SetEmitting(true); particleStartNode_->AddComponent(new TimedRemove(context_, main_, 2.0f), 0, LOCAL);*/ /*Node* lightNode = noed->GetScene()->CreateChild(0,LOCAL); lightNode->SetPosition(noed->GetPosition() + (Vector3::UP)); Light* light = lightNode->CreateComponent<Light>(LOCAL); light->SetBrightness(2.0f); light->SetPerVertex(true); light->SetRange(5.0f); lightNode->AddComponent(new TimedRemove(context_, main_, 0.1f), 0, LOCAL);*/ //noed->Remove(); } }