Examples/mvp-walk-with-collision @bel

This commit is contained in:
breel
2025-08-17 21:41:41 -06:00
parent 9d2db4edda
commit d99cd1cd69
28 changed files with 691 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
extends Node
var speed = 1
func to_move_rotate(delta: float):
var mv = Vector3.ZERO
var rot = Vector3.ZERO
for state in _states():
var duo = _duo_for_state(delta, state)
mv += duo[0]
rot += duo[1]
return [mv, rot]
var state_move_forward = false
var state_move_left = false
var state_move_backward = false
var state_move_right = false
var state_turn_left = false
var state_turn_right = false
enum {
STATE_MOVING_FORWARD,
STATE_MOVING_LEFT,
STATE_MOVING_RIGHT,
STATE_MOVING_BACKWARD,
STATE_TURNING_LEFT,
STATE_TURNING_RIGHT,
STATE_IDLE
}
func _states():
var result = _states_moving() + _states_turning()
if result.is_empty():
result = [STATE_IDLE]
return result
func _states_moving():
var moving_forward = self.state_move_forward and not self.state_move_backward
var moving_left = self.state_move_left and not self.state_move_right
var moving_right = self.state_move_right and not self.state_move_left
var moving_backward = self.state_move_backward and not self.state_move_forward
if moving_forward and moving_left:
return [STATE_MOVING_LEFT, STATE_MOVING_FORWARD]
elif moving_forward and moving_right:
return [STATE_MOVING_RIGHT, STATE_MOVING_FORWARD]
elif moving_forward:
return [STATE_MOVING_FORWARD]
elif moving_backward and moving_left:
return [STATE_MOVING_LEFT, STATE_MOVING_BACKWARD]
elif moving_backward and moving_right:
return [STATE_MOVING_RIGHT, STATE_MOVING_BACKWARD]
elif moving_backward:
return [STATE_MOVING_BACKWARD]
elif moving_left:
return [STATE_MOVING_LEFT]
elif moving_right:
return [STATE_MOVING_RIGHT]
return []
func _states_turning():
if self.state_turn_left and not self.state_turn_right:
return [STATE_TURNING_LEFT]
elif self.state_turn_right and not self.state_turn_left:
return [STATE_TURNING_RIGHT]
return []
func _duo_for_state(delta: float, state):
var direction = Vector2.ZERO
match state:
STATE_MOVING_FORWARD:
direction.y = -1
STATE_MOVING_BACKWARD:
direction.y = 1
STATE_MOVING_LEFT:
direction.x = -1
STATE_MOVING_RIGHT:
direction.x = 1
STATE_TURNING_LEFT:
pass
rotate_object_local(Vector3.UP, speed * delta)
STATE_TURNING_RIGHT:
pass
rotate_object_local(Vector3.UP, -speed * delta)
STATE_IDLE:
pass
if direction == Vector2.ZERO:
return [Vector3.ZERO, Vector3.ZERO]
direction = direction.normalized()
var forward = global_transform.basis.z
var right = global_transform.basis.x
var relative_direction = (forward * direction.y + right * direction.x)
relative_direction.x *= speed
relative_direction.z *= speed
relative_direction.y = -speed
return [relative_direction, Vector3.ZERO]

View File

@@ -0,0 +1 @@
uid://cpe76cgad0r7d

View File

@@ -0,0 +1,4 @@
extends "res://Entities/Characters/Players/Kobolds/kobold.gd"
func _ready():
mover.speed = 3

View File

@@ -0,0 +1 @@
uid://djb32mbaia5hv

View File

@@ -0,0 +1 @@
extends "res://Entities/Characters/Players/player.gd"

View File

@@ -0,0 +1 @@
uid://y7r1crnxumyx

View File

@@ -0,0 +1,17 @@
extends "res://Entities/Characters/character.gd"
func _input(event):
if event is InputEventKey:
match event.keycode:
KEY_W:
self.state_move_forward = event.pressed
KEY_A:
self.state_move_left = event.pressed
KEY_S:
self.state_move_backward = event.pressed
KEY_D:
self.state_move_right = event.pressed
KEY_Q:
self.state_turn_left = event.pressed
KEY_E:
self.state_turn_right = event.pressed

View File

@@ -0,0 +1 @@
uid://brx1bih43d41c

View File

@@ -0,0 +1,8 @@
extends PhysicsBody3D
var mover = new("res://Entities/Characters/Movers/pedal.gd")
func _physics_process(delta: float):
duo = self.mover.to_move_rotate(delta)
velocity = duo[0]
move_and_slide()

View File

@@ -0,0 +1 @@
uid://uj4hyacvqtqa