feat: added boost
This commit is contained in:
parent
4d28ff8829
commit
b60cf6cb6c
|
@ -59,6 +59,7 @@ void ConfigureInput() {
|
||||||
AddAction("yaw_right", INPUT_LISTENER_KEY, 0, KEY_E);
|
AddAction("yaw_right", INPUT_LISTENER_KEY, 0, KEY_E);
|
||||||
AddAction("yaw_left", INPUT_LISTENER_KEY, 0, KEY_Q);
|
AddAction("yaw_left", INPUT_LISTENER_KEY, 0, KEY_Q);
|
||||||
AddAction("brake", INPUT_LISTENER_KEY, 0, KEY_SPACE);
|
AddAction("brake", INPUT_LISTENER_KEY, 0, KEY_SPACE);
|
||||||
|
AddAction("boost", INPUT_LISTENER_KEY, 0, KEY_LEFT_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
|
@ -46,7 +46,8 @@ void PlayerControllerEnterTree(PlayerController *self) {
|
||||||
AddListener("roll_right", ButtonInputListener(self, PlayerControllerInputRollRight));
|
AddListener("roll_right", ButtonInputListener(self, PlayerControllerInputRollRight));
|
||||||
AddListener("yaw_left", ButtonInputListener(self, PlayerControllerInputYawLeft));
|
AddListener("yaw_left", ButtonInputListener(self, PlayerControllerInputYawLeft));
|
||||||
AddListener("yaw_right", ButtonInputListener(self, PlayerControllerInputYawRight));
|
AddListener("yaw_right", ButtonInputListener(self, PlayerControllerInputYawRight));
|
||||||
AddListener("stop", ButtonInputListener(self, PlayerControllerInputBrake));
|
AddListener("brake", ButtonInputListener(self, PlayerControllerInputBrake));
|
||||||
|
AddListener("boost", ButtonInputListener(self, PlayerControllerInputBoost));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerExitTree(PlayerController *self) {
|
void PlayerControllerExitTree(PlayerController *self) {
|
||||||
|
@ -72,9 +73,9 @@ void PlayerControllerTickAngularAcceleration(PlayerController *self, double delt
|
||||||
//! linear acceleration limited to the local Z axis
|
//! linear acceleration limited to the local Z axis
|
||||||
static
|
static
|
||||||
void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) {
|
void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) {
|
||||||
float const target = self->brake ? 5.f : (self->rotation.y == 0.f ? 30.f : 10.f);
|
float const target = self->brake ? 5.f : (self->boost ? 50.f : (self->rotation.y == 0.f ? 30.f : 10.f));
|
||||||
float const speed_diff = target - self->speed;
|
float const acceleration = self->brake ? 40.f : (self->boost ? 60.f : 10.f);
|
||||||
self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 15.f * delta), speed_diff);
|
self->speed = MoveTowards(self->speed, target, delta * acceleration);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Update linear transform based on velocities
|
//! Update linear transform based on velocities
|
||||||
|
@ -82,10 +83,11 @@ static
|
||||||
void PlayerControllerTickTransform(PlayerController *self, double delta) {
|
void PlayerControllerTickTransform(PlayerController *self, double delta) {
|
||||||
Transform global_transform = self->transform.tc->get_global_transform(self->transform.data);
|
Transform global_transform = self->transform.tc->get_global_transform(self->transform.data);
|
||||||
Matrix global_matrix = TransformGetMatrix(global_transform);
|
Matrix global_matrix = TransformGetMatrix(global_transform);
|
||||||
|
float const rotate_speed = 1.f - self->speed / 60.f;
|
||||||
global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), self->speed * delta));
|
global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), self->speed * delta));
|
||||||
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_FORWARD(global_matrix), self->rotation.x * 2.f * delta), global_transform.rotation);
|
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_FORWARD(global_matrix), self->rotation.x * 1.25f * delta), global_transform.rotation);
|
||||||
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_RIGHT(global_matrix), self->rotation.y * 2.5f * delta), global_transform.rotation);
|
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_RIGHT(global_matrix), self->rotation.y * rotate_speed * 3.75f * delta), global_transform.rotation);
|
||||||
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_UP(global_matrix), self->rotation.z * 0.5f * delta), global_transform.rotation);
|
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_UP(global_matrix), self->rotation.z * .2f * delta), global_transform.rotation);
|
||||||
self->transform.tc->set_global_transform(self->transform.data, global_transform);
|
self->transform.tc->set_global_transform(self->transform.data, global_transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,3 +124,7 @@ void PlayerControllerInputYawLeft(PlayerController *self, bool value) {
|
||||||
void PlayerControllerInputBrake(PlayerController *self, bool value) {
|
void PlayerControllerInputBrake(PlayerController *self, bool value) {
|
||||||
self->brake = value;
|
self->brake = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlayerControllerInputBoost(PlayerController *self, bool value) {
|
||||||
|
self->boost = value;
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ typedef struct PlayerController {
|
||||||
Vector3 rotation;
|
Vector3 rotation;
|
||||||
float speed;
|
float speed;
|
||||||
bool brake;
|
bool brake;
|
||||||
|
bool boost;
|
||||||
} PlayerController;
|
} PlayerController;
|
||||||
|
|
||||||
SceneNode *CreatePlayerController();
|
SceneNode *CreatePlayerController();
|
||||||
|
@ -32,6 +33,7 @@ extern void PlayerControllerInputPitchDown(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerInputYawRight(PlayerController *self, bool value);
|
extern void PlayerControllerInputYawRight(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerInputYawLeft(PlayerController *self, bool value);
|
extern void PlayerControllerInputYawLeft(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerInputBrake(PlayerController *self, bool value);
|
extern void PlayerControllerInputBrake(PlayerController *self, bool value);
|
||||||
|
extern void PlayerControllerInputBoost(PlayerController *self, bool value);
|
||||||
|
|
||||||
DECL_REFLECT(PlayerController);
|
DECL_REFLECT(PlayerController);
|
||||||
decl_typeclass_impl(SceneNodeEntity, PlayerController);
|
decl_typeclass_impl(SceneNodeEntity, PlayerController);
|
||||||
|
|
Loading…
Reference in a new issue