This commit is contained in:
2025-11-26 18:57:37 -06:00
parent 1e83200bba
commit d532a9ab21
25 changed files with 525 additions and 534 deletions

View File

@@ -4,24 +4,24 @@ class_name EntityMovement extends Node
const FRICTION = 0.01
enum FacingDirection {
SOUTH = 0,
EAST = 1,
NORTH = 2,
WEST = 3
SOUTH = 0,
EAST = 1,
NORTH = 2,
WEST = 3
};
const FacingDirWalkAnimations = {
FacingDirection.SOUTH: "walk_south",
FacingDirection.EAST: "walk_east",
FacingDirection.NORTH: "walk_north",
FacingDirection.WEST: "walk_west"
FacingDirection.SOUTH: "walk_south",
FacingDirection.EAST: "walk_east",
FacingDirection.NORTH: "walk_north",
FacingDirection.WEST: "walk_west"
};
const FacingDirAngle = {
FacingDirection.SOUTH: 0.0,
FacingDirection.EAST: PI / 2,
FacingDirection.NORTH: PI,
FacingDirection.WEST: -PI / 2
FacingDirection.SOUTH: 0.0,
FacingDirection.EAST: PI / 2,
FacingDirection.NORTH: PI,
FacingDirection.WEST: -PI / 2
};
var _inputDir:Vector2 = Vector2.ZERO
@@ -34,115 +34,115 @@ var _running:bool = false
@export var walkSpeed:float = 48.0
@export var runSpeed:float = 64.0
@export var facingDir:FacingDirection = FacingDirection.SOUTH:
set(value):
_facingDir = value
_updateSprite()
get:
return _facingDir
set(value):
_facingDir = value
_updateSprite()
get:
return _facingDir
#
# Private Methods
#
func _updateSprite() -> void:
if !sprite || sprite.animation == FacingDirWalkAnimations[facingDir]:
return
sprite.animation = FacingDirWalkAnimations[facingDir]
if !sprite || sprite.animation == FacingDirWalkAnimations[facingDir]:
return
sprite.animation = FacingDirWalkAnimations[facingDir]
func _applyFacingDir() -> void:
if !sprite || _inputDir.length() <= 0.01:
return
if !sprite || _inputDir.length() <= 0.01:
return
if _inputDir.y > 0:
if facingDir != FacingDirection.NORTH && _inputDir.x != 0:
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
facingDir = FacingDirection.EAST
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
facingDir = FacingDirection.WEST
else:
facingDir = FacingDirection.NORTH
else:
facingDir = FacingDirection.NORTH
elif _inputDir.y < 0:
if facingDir != FacingDirection.SOUTH && _inputDir.x != 0:
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
facingDir = FacingDirection.EAST
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
facingDir = FacingDirection.WEST
else:
facingDir = FacingDirection.SOUTH
else:
facingDir = FacingDirection.SOUTH
elif _inputDir.x > 0:
facingDir = FacingDirection.EAST
else:
facingDir = FacingDirection.WEST
if _inputDir.y > 0:
if facingDir != FacingDirection.NORTH && _inputDir.x != 0:
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
facingDir = FacingDirection.EAST
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
facingDir = FacingDirection.WEST
else:
facingDir = FacingDirection.NORTH
else:
facingDir = FacingDirection.NORTH
elif _inputDir.y < 0:
if facingDir != FacingDirection.SOUTH && _inputDir.x != 0:
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
facingDir = FacingDirection.EAST
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
facingDir = FacingDirection.WEST
else:
facingDir = FacingDirection.SOUTH
else:
facingDir = FacingDirection.SOUTH
elif _inputDir.x > 0:
facingDir = FacingDirection.EAST
else:
facingDir = FacingDirection.WEST
func _applyGravity() -> void:
if !body.is_on_floor():
body.velocity += PHYSICS.GRAVITY * get_process_delta_time()
if !body.is_on_floor():
body.velocity += PHYSICS.GRAVITY * get_process_delta_time()
func _applyMovement() -> void:
if !canMove():
return
if !canMove():
return
var cameraCurrent = get_viewport().get_camera_3d()
if !cameraCurrent:
return
var cameraCurrent = get_viewport().get_camera_3d()
if !cameraCurrent:
return
# Use camera orientation for movement direction
var camBasis = cameraCurrent.global_transform.basis
# Use camera orientation for movement direction
var camBasis = cameraCurrent.global_transform.basis
# Forward and right vectors, ignore vertical component
var forward = -camBasis.z
forward.y = 0
forward = forward.normalized()
var right = camBasis.x
right.y = 0
right = right.normalized()
# Forward and right vectors, ignore vertical component
var forward = -camBasis.z
forward.y = 0
forward = forward.normalized()
var right = camBasis.x
right.y = 0
right = right.normalized()
var directionAdjusted = (
forward * _inputDir.y + right * _inputDir.x
).normalized()
if directionAdjusted.length() <= 0.01:
return
var directionAdjusted = (
forward * _inputDir.y + right * _inputDir.x
).normalized()
if directionAdjusted.length() <= 0.01:
return
if rotate:
var targetRot = atan2(directionAdjusted.x, directionAdjusted.z)
rotate.rotation.y = targetRot
if rotate:
var targetRot = atan2(directionAdjusted.x, directionAdjusted.z)
rotate.rotation.y = targetRot
var speed = walkSpeed
if _running:
speed = runSpeed
body.velocity.x = directionAdjusted.x * speed
body.velocity.z = directionAdjusted.z * speed
var speed = walkSpeed
if _running:
speed = runSpeed
body.velocity.x = directionAdjusted.x * speed
body.velocity.z = directionAdjusted.z * speed
func _applyFriction(delta:float) -> void:
body.velocity.x *= delta * FRICTION
body.velocity.z *= delta * FRICTION
body.velocity.x *= delta * FRICTION
body.velocity.z *= delta * FRICTION
#
# Protected Methods
#
func canMove() -> bool:
return true
return true
#
# Callbacks
#
func _enter_tree() -> void:
_updateSprite()
_updateSprite()
func _physics_process(delta:float) -> void:
if Engine.is_editor_hint():
return
if Engine.is_editor_hint():
return
if !body:
return
if !body:
return
_applyGravity()
_applyFriction(delta)
_applyMovement()
_applyFacingDir()
body.move_and_slide()
_applyGravity()
_applyFriction(delta)
_applyMovement()
_applyFacingDir()
body.move_and_slide()

View File

@@ -4,35 +4,35 @@ class_name NPC extends CharacterBody3D
@export var _movement:NPCMovement
@export var facingDirection:EntityMovement.FacingDirection:
set(value):
if _movement:
_movement.facingDir = value
get:
if _movement:
return _movement.facingDir
return EntityMovement.FacingDirection.SOUTH
set(value):
if _movement:
_movement.facingDir = value
get:
if _movement:
return _movement.facingDir
return EntityMovement.FacingDirection.SOUTH
@export var walkSpeed:float = 48.0:
set(value):
if _movement:
_movement.walkSpeed = value
get:
if _movement:
return _movement.walkSpeed
return 48.0
set(value):
if _movement:
_movement.walkSpeed = value
get:
if _movement:
return _movement.walkSpeed
return 48.0
@export var runSpeed:float = 64.0:
set(value):
if _movement:
_movement.runSpeed = value
get:
if _movement:
return _movement.runSpeed
return 64.0
set(value):
if _movement:
_movement.runSpeed = value
get:
if _movement:
return _movement.runSpeed
return 64.0
func onInteract(player:Player) -> void:
UI.TEXTBOX.setText("Hello, I'm an NPC!\nThis is the second line here, I am purposefully adding a tonne of words so that it is forced to go across multiple lines and you can see how the word wrapping works, not only using Godot's built in word wrapping but with my advanced visibile characters smart wrapping. Now I am doing a multiline thing\nLine 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10");
pass
UI.TEXTBOX.setText("Hello, I'm an NPC!\nThis is the second line here, I am purposefully adding a tonne of words so that it is forced to go across multiple lines and you can see how the word wrapping works, not only using Godot's built in word wrapping but with my advanced visibile characters smart wrapping. Now I am doing a multiline thing\nLine 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10");
pass
func _enter_tree() -> void:
pass
pass

View File

@@ -1,5 +1,5 @@
class_name NPCTest extends Node
func onInteract(playerEntity: Player) -> void:
print("Player has interacted with the NPC.")
UI.TEXTBOX.setText("You have interacted with the NPC.")
print("Player has interacted with the NPC.")
UI.TEXTBOX.setText("You have interacted with the NPC.")

View File

@@ -4,28 +4,28 @@ class_name Player extends CharacterBody3D
@export var _movement:PlayerMovement
@export var facingDirection:EntityMovement.FacingDirection:
set(value):
if _movement:
_movement.facingDir = value
get:
if _movement:
return _movement.facingDir
return EntityMovement.FacingDirection.SOUTH
set(value):
if _movement:
_movement.facingDir = value
get:
if _movement:
return _movement.facingDir
return EntityMovement.FacingDirection.SOUTH
@export var walkSpeed:float = 48.0:
set(value):
if _movement:
_movement.walkSpeed = value
get:
if _movement:
return _movement.walkSpeed
return 48.0
set(value):
if _movement:
_movement.walkSpeed = value
get:
if _movement:
return _movement.walkSpeed
return 48.0
@export var runSpeed:float = 64.0:
set(value):
if _movement:
_movement.runSpeed = value
get:
if _movement:
return _movement.runSpeed
return 64.0
set(value):
if _movement:
_movement.runSpeed = value
get:
if _movement:
return _movement.runSpeed
return 64.0

View File

@@ -9,25 +9,25 @@ const CAMERA_PIXEL_SCALE = 1.0
@export var offset:Vector3 = Vector3(0, 0, 12)
func _process(delta: float) -> void:
if !camera || !target:
return
if !camera || !target:
return
# I tried a few things but this is most consistent for both backbuffer and
# framebuffer viewports.
var viewportHeight = get_viewport().get_visible_rect().size.y;
var unitScale = CAMERA_PIXEL_SCALE * CAMERA_PIXELS_PER_UNIT;
# I tried a few things but this is most consistent for both backbuffer and
# framebuffer viewports.
var viewportHeight = get_viewport().get_visible_rect().size.y;
var unitScale = CAMERA_PIXEL_SCALE * CAMERA_PIXELS_PER_UNIT;
var z:float = (
tan((deg_to_rad(180) - deg_to_rad(camera.fov)) / 2.0) *
(viewportHeight / 2.0)
) / unitScale;
var look = target.global_position;
var position = offset + look;
var z:float = (
tan((deg_to_rad(180) - deg_to_rad(camera.fov)) / 2.0) *
(viewportHeight / 2.0)
) / unitScale;
var look = target.global_position;
var position = offset + look;
camera.look_at_from_position(
Vector3(position.x, position.y + z, position.z),
look
);
camera.look_at_from_position(
Vector3(position.x, position.y + z, position.z),
look
);
pass
pass

View File

@@ -4,10 +4,10 @@ class_name PlayerInput extends Node
@export var movement:PlayerMovement
func _process(delta: float) -> void:
if Input.is_action_just_pressed("pause"):
PAUSE.menuPause()
if Input.is_action_just_pressed("pause"):
PAUSE.menuPause()
if Input.is_action_just_pressed("interact"):
interaction.interact()
if Input.is_action_just_pressed("interact"):
interaction.interact()
movement._inputDir = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized()
movement._inputDir = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized()

View File

@@ -4,24 +4,24 @@ class_name PlayerInteraction extends Node
@export var player:CharacterBody3D
func canInteract() -> bool:
if PAUSE.isMovementPaused():
return false
return true
if PAUSE.isMovementPaused():
return false
return true
func interact() -> void:
if !canInteract():
return
if !canInteract():
return
var overlapping = interactableArea.get_overlapping_areas()
var interactable: InteractableArea = null
var overlapping = interactableArea.get_overlapping_areas()
var interactable: InteractableArea = null
for node in overlapping:
if !(node is InteractableArea):
continue
interactable = node
break
for node in overlapping:
if !(node is InteractableArea):
continue
interactable = node
break
if !interactable:
return
if !interactable:
return
interactable.interactEvent.emit(player)
interactable.interactEvent.emit(player)

View File

@@ -2,6 +2,6 @@
class_name PlayerMovement extends "res://entity/EntityMovement.gd"
func canMove() -> bool:
if PAUSE.isMovementPaused():
return false
return true
if PAUSE.isMovementPaused():
return false
return true