void PlayerPhysicsObject::handleInput(float delta) { std::vector<int> playerAttributes = itrPhysics_3.ownerAt(attributeIndex_)->getAttributes(ATTRIBUTE_PLAYER); if(playerAttributes.size() > 1) { ERROR_MESSAGEBOX("More than one controller for one player. Not tested.") } for(unsigned int i=0; i<playerAttributes.size(); i++) { AttributePtr<Attribute_Player> ptr_player = ptr_player = itrPlayer.at(playerAttributes.at(i)); AttributePtr<Attribute_Input> ptr_input = ptr_player->ptr_input; AttributePtr<Attribute_Health> health = ptr_player->ptr_health; if(health->health <= 0) { continue; } //-------------------------------------------------------------------------------------- //Look and move //-------------------------------------------------------------------------------------- yaw_ += ptr_input->rotation.x; btVector3 move = ptr_player->currentSpeed*btVector3(ptr_input->position.x, 0, ptr_input->position.y); //lower player speed when recently damaged if(ptr_player->timeSinceLastDamageTaken < 1.0f) { move *= 0.75f; } //Move player move = move.rotate(btVector3(0,1,0),yaw_); move = btVector3(move.x(), getLinearVelocity().y(), move.z()); setLinearVelocity(move); //Rotate player btTransform world; world = getWorldTransform(); world.setRotation(btQuaternion(yaw_,0,0)); setWorldTransform(world); //Jetpack if(ptr_player->jetpack) { float jetpackPower = -getGravity().y()*1.5f; world = getWorldTransform(); btVector3 velocity = getLinearVelocity(); if(world.getOrigin().y() < 18.0f) { setLinearVelocity(btVector3(move.x(), velocity.y()+jetpackPower*delta, move.z())); } } else if(ptr_input->jump && ptr_player->hovering) //Jump { float jumpPower = 600.0f; applyCentralImpulse(btVector3(0.0f, jumpPower, 0.0f)); //applyCentralForce(btVector3(0.0f, jumpPower, 0.0f)); } } }
void PhysicsBodyComponent::applyCentralImpulse(float x, float y, float z) { applyCentralImpulse(btVector3(x, y, z)); }