From b60cf6cb6cfab6bcea9f7baf025f2a6f0214bd7e Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 1 Oct 2024 10:25:32 +0200 Subject: [PATCH] feat: added boost --- src/main.c | 1 + src/player_controller.c | 20 +++++++++++++------- src/player_controller.h | 2 ++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index bb19d00..98571b2 100644 --- a/src/main.c +++ b/src/main.c @@ -59,6 +59,7 @@ void ConfigureInput() { AddAction("yaw_right", INPUT_LISTENER_KEY, 0, KEY_E); AddAction("yaw_left", INPUT_LISTENER_KEY, 0, KEY_Q); AddAction("brake", INPUT_LISTENER_KEY, 0, KEY_SPACE); + AddAction("boost", INPUT_LISTENER_KEY, 0, KEY_LEFT_SHIFT); } int main() { diff --git a/src/player_controller.c b/src/player_controller.c index 281772c..7e7215b 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -46,7 +46,8 @@ void PlayerControllerEnterTree(PlayerController *self) { AddListener("roll_right", ButtonInputListener(self, PlayerControllerInputRollRight)); AddListener("yaw_left", ButtonInputListener(self, PlayerControllerInputYawLeft)); 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) { @@ -72,9 +73,9 @@ void PlayerControllerTickAngularAcceleration(PlayerController *self, double delt //! linear acceleration limited to the local Z axis static void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) { - float const target = self->brake ? 5.f : (self->rotation.y == 0.f ? 30.f : 10.f); - float const speed_diff = target - self->speed; - self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 15.f * delta), speed_diff); + float const target = self->brake ? 5.f : (self->boost ? 50.f : (self->rotation.y == 0.f ? 30.f : 10.f)); + float const acceleration = self->brake ? 40.f : (self->boost ? 60.f : 10.f); + self->speed = MoveTowards(self->speed, target, delta * acceleration); } //! Update linear transform based on velocities @@ -82,10 +83,11 @@ static void PlayerControllerTickTransform(PlayerController *self, double delta) { Transform global_transform = self->transform.tc->get_global_transform(self->transform.data); 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.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_FORWARD(global_matrix), self->rotation.x * 2.f * 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_UP(global_matrix), self->rotation.z * 0.5f * 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 * rotate_speed * 3.75f * 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); } @@ -122,3 +124,7 @@ void PlayerControllerInputYawLeft(PlayerController *self, bool value) { void PlayerControllerInputBrake(PlayerController *self, bool value) { self->brake = value; } + +void PlayerControllerInputBoost(PlayerController *self, bool value) { + self->boost = value; +} diff --git a/src/player_controller.h b/src/player_controller.h index 08d3cf9..c6fc5ce 100644 --- a/src/player_controller.h +++ b/src/player_controller.h @@ -16,6 +16,7 @@ typedef struct PlayerController { Vector3 rotation; float speed; bool brake; + bool boost; } PlayerController; SceneNode *CreatePlayerController(); @@ -32,6 +33,7 @@ extern void PlayerControllerInputPitchDown(PlayerController *self, bool value); extern void PlayerControllerInputYawRight(PlayerController *self, bool value); extern void PlayerControllerInputYawLeft(PlayerController *self, bool value); extern void PlayerControllerInputBrake(PlayerController *self, bool value); +extern void PlayerControllerInputBoost(PlayerController *self, bool value); DECL_REFLECT(PlayerController); decl_typeclass_impl(SceneNodeEntity, PlayerController);