void Touch::UpdateTouches(Controls& controls) // Called from HandleUpdate { zoom_ = false; // reset bool Input* input = GetSubsystem<Input>(); // Zoom in/out if (input->GetNumTouches() == 2) { TouchState* touch1 = input->GetTouch(0); TouchState* touch2 = input->GetTouch(1); // Check for zoom pattern (touches moving in opposite directions and on empty space) if (!touch1->touchedElement_ && !touch2->touchedElement_ && ((touch1->delta_.y_ > 0 && touch2->delta_.y_ < 0) || (touch1->delta_.y_ < 0 && touch2->delta_.y_ > 0))) zoom_ = true; else zoom_ = false; if (zoom_) { int sens = 0; // Check for zoom direction (in/out) if (Abs(touch1->position_.y_ - touch2->position_.y_) > Abs(touch1->lastPosition_.y_ - touch2->lastPosition_.y_)) sens = -1; else sens = 1; cameraDistance_ += Abs(touch1->delta_.y_ - touch2->delta_.y_) * sens * touchSensitivity_ / 50.0f; cameraDistance_ = Clamp(cameraDistance_, CAMERA_MIN_DIST, CAMERA_MAX_DIST); // Restrict zoom range to [1;20] } } // Gyroscope (emulated by SDL through a virtual joystick) if (useGyroscope_ && input->GetNumJoysticks() > 0) // numJoysticks = 1 on iOS & Android { JoystickState* joystick = input->GetJoystickByIndex(0); if (joystick->GetNumAxes() >= 2) { if (joystick->GetAxisPosition(0) < -GYROSCOPE_THRESHOLD) controls.Set(CTRL_LEFT, true); if (joystick->GetAxisPosition(0) > GYROSCOPE_THRESHOLD) controls.Set(CTRL_RIGHT, true); if (joystick->GetAxisPosition(1) < -GYROSCOPE_THRESHOLD) controls.Set(CTRL_FORWARD, true); if (joystick->GetAxisPosition(1) > GYROSCOPE_THRESHOLD) controls.Set(CTRL_BACK, true); } } }
void Player::HandleSceneUpdate(StringHash eventType, VariantMap &eventData) { //Take the frame time step, which is stored as a double float timeStep = eventData[Update::P_TIMESTEP].GetFloat(); //Pulse and spin the counters' apples and hearts UpdateGUI(timeStep); //Only handle input when player is active if (!rootNode_->IsEnabled()) return; Input* input = GetSubsystem<Input>(); //Movement values Vector3 move = Vector3::ZERO; Vector3 moveJoy = Vector3::ZERO; Vector3 moveKey = Vector3::ZERO; float thrust = pilotMode_ ? 256.0f : 2323.0f; float maxSpeed = pilotMode_? 1.8f : 23.0f; //Firing values Vector3 fire = Vector3::ZERO; Vector3 fireJoy = Vector3::ZERO; Vector3 fireKey = Vector3::ZERO; //Read input if (input->GetJoystickByIndex(0)){ moveJoy = Vector3::RIGHT * input->GetJoystickByIndex(0)->GetAxisPosition(0) + Vector3::BACK * input->GetJoystickByIndex(0)->GetAxisPosition(1); fireJoy = Vector3::RIGHT * input->GetJoystickByIndex(0)->GetAxisPosition(2) + Vector3::BACK * input->GetJoystickByIndex(0)->GetAxisPosition(3); } moveKey = Vector3::LEFT * input->GetKeyDown(KEY_A) + Vector3::RIGHT * input->GetKeyDown(KEY_D) + Vector3::FORWARD * input->GetKeyDown(KEY_W) + Vector3::BACK * input->GetKeyDown(KEY_S); fireKey = Vector3::LEFT * (input->GetKeyDown(KEY_J) || input->GetKeyDown(KEY_KP_4)) + Vector3::RIGHT * (input->GetKeyDown(KEY_L) || input->GetKeyDown(KEY_KP_6)) + Vector3::FORWARD * (input->GetKeyDown(KEY_I) || input->GetKeyDown(KEY_KP_8)) + Vector3::BACK * (input->GetKeyDown(KEY_K) || input->GetKeyDown(KEY_KP_2) || input->GetKeyDown(KEY_KP_5)) + Quaternion(45.0f, Vector3::UP)*Vector3::LEFT * input->GetKeyDown(KEY_KP_7) + Quaternion(45.0f, Vector3::UP)*Vector3::RIGHT * input->GetKeyDown(KEY_KP_3) + Quaternion(45.0f, Vector3::UP)*Vector3::FORWARD * input->GetKeyDown(KEY_KP_9) + Quaternion(45.0f, Vector3::UP)*Vector3::BACK * input->GetKeyDown(KEY_KP_1); //Pick most significant input moveJoy.Length() > moveKey.Length() ? move = moveJoy : move = moveKey; fireJoy.Length() > fireKey.Length() ? fire = fireJoy : fire = fireKey; //Restrict move vector length if (move.Length() > 1.0f) move /= move.Length(); //Deadzone else if (move.Length() < 0.1f) move *= 0.0f; if (fire.Length() < 0.1f) fire *= 0.0f; else fire.Normalize(); //When in pilot mode if (pilotMode_){ //Apply movement Vector3 force = move * thrust * timeStep; if (rigidBody_->GetLinearVelocity().Length() < maxSpeed || (rigidBody_->GetLinearVelocity().Normalized() + force.Normalized()).Length() < 1.0f) { rigidBody_->ApplyForce(force); } //Update rotation according to direction of the player's movement. Vector3 velocity = rigidBody_->GetLinearVelocity(); Vector3 lookDirection = velocity + 2.0f*fire; Quaternion rotation = rootNode_->GetWorldRotation(); Quaternion aimRotation = rotation; aimRotation.FromLookRotation(lookDirection); rootNode_->SetRotation(rotation.Slerp(aimRotation, 7.0f * timeStep * velocity.Length())); //Update animation if (velocity.Length() > 0.05f){ animCtrl_->PlayExclusive("Resources/Models/WalkRelax.ani", 0, true, 0.15f); animCtrl_->SetSpeed("Resources/Models/WalkRelax.ani", velocity.Length()*2.3f); animCtrl_->SetStartBone("Resources/Models/WalkRelax.ani", "MasterBone"); } else { animCtrl_->PlayExclusive("Resources/Models/IdleRelax.ani", 0, true, 0.15f); animCtrl_->SetStartBone("Resources/Models/IdleRelax.ani", "MasterBone"); } // When in ship mode } else { //Update shield Quaternion randomRotation = Quaternion(Random(360.0f),Random(360.0f),Random(360.0f)); shieldNode_->SetRotation(shieldNode_->GetRotation().Slerp(randomRotation, Random(1.0f))); Color shieldColor = shieldMaterial_->GetShaderParameter("MatDiffColor").GetColor(); Color newColor = Color(shieldColor.r_ * Random(0.6f, 0.9f), shieldColor.g_ * Random(0.7f, 0.95f), shieldColor.b_ * Random(0.8f, 0.9f)); shieldMaterial_->SetShaderParameter("MatDiffColor", shieldColor.Lerp(newColor, Min(timeStep * 23.5f, 1.0f))); //Float ship_.node_->SetPosition(Vector3::UP *masterControl_->Sine(2.3f, -0.1f, 0.1f)); //Apply movement Vector3 force = move * thrust * timeStep; if (rigidBody_->GetLinearVelocity().Length() < maxSpeed || (rigidBody_->GetLinearVelocity().Normalized() + force.Normalized()).Length() < 1.0f) { rigidBody_->ApplyForce(force); } //Update rotation according to direction of the ship's movement. if (rigidBody_->GetLinearVelocity().Length() > 0.1f) rootNode_->LookAt(rootNode_->GetPosition()+rigidBody_->GetLinearVelocity()); //Shooting sinceLastShot_ += timeStep; if (fire.Length()) { if (sinceLastShot_ > shotInterval_) { Shoot(fire); } } } }