first_person_player: finished first pass of movement and input

This commit is contained in:
2026-01-20 18:35:47 -08:00
parent 8a719e48ae
commit cfcbf1d8dc
5 changed files with 85 additions and 11 deletions

View File

@ -1,4 +1,4 @@
import "system/first_person_player.modifier.api" for API, Modifier, APIGet, APISet, Wire, Fields, State, Op
import "fpkit: system/first_person_player.modifier.api" for API, Modifier, APIGet, APISet, Wire, Fields, State, Op
import "luxe: io" for IO
import "luxe: assets" for Strings
import "luxe: input" for Input
@ -18,6 +18,13 @@ class Data {
var jump_impulse: Num = 20
var jump_grace_time: Num = 0.1
var event_forward: String = "up"
var event_backward: String = "down"
var event_strafe_left: String = "left"
var event_strafe_right: String = "right"
var event_sprint: String = "run"
var event_jump: String = "jump"
#hidden
var input_target: Float3 = [0, 0, 0]
@ -35,10 +42,10 @@ class Data {
}
#api
#display = "First-Person Player"
#display = "FPKit: First-Person Player"
#desc = "**Player movement system**. Takes the player's input and moves the player's character."
#icon = "luxe: image/modifier/modifier.svg"
class PlayerInput is API {
class FirstPersonPlayer is API {
set_movement_active(entity: Entity, active: Bool) {
system(entity).movement_active = active
}
@ -60,14 +67,12 @@ class System is Modifier {
_world = world
}
#hidden
attach(player: Entity, data: Data) {
if (!Character3D.has(player)) return
Character3D.set.speed(player, data.speed_walk)
data.target_speed = data.speed_walk
}
#hidden
tick(delta: Num) {
each {|player: Entity, data: Data|
if (!Character3D.has(player)) return
@ -87,6 +92,12 @@ class System is Modifier {
data.is_grounded = true
}
// Get player's movement input
var fore = Input.event_active(data.event_forward, "game") ? -1 : 0
var back = Input.event_active(data.event_backward, "game") ? 1 : 0
var left = Input.event_active(data.event_strafe_left, "game") ? -1 : 0
var right = Input.event_active(data.event_strafe_right, "game") ? 1 : 0
// Turn this into a Float3 of (Left/Right, 0, Forward/Backward) that is relative to the player's facing direction
data.input_target = Math.normalized(Math.mult(Transform.local_dir_to_world(_camera, right + left, 0, fore + back), [1, 0, 1]))
data.input_target = move_toward_vec(Character3D.get.input(player), data.input_target, data, delta * 6)