Detect tile under foot

This commit is contained in:
2025-01-02 21:36:24 -06:00
parent 95b13a7f55
commit 4303aafb59
11 changed files with 84 additions and 54 deletions

View File

@@ -7,12 +7,14 @@ enum Direction {
EAST
}
var speed:float = 3200;
var friction:float = 7;
var gravity:float = 150;
var speed:float = 150;
var friction:float = 8.5;
var gravity:float = 30;
var direction = Direction.SOUTH;
var meshInstance:MeshInstance3D;
var underFootTile:int = -1;
var underFootPosition:Vector3;
func getDirectionVector() -> Vector3:
match direction:
@@ -33,9 +35,58 @@ func updateMovement(delta) -> void:
func updateOverworldLogic(delta) -> void:
pass
# Private methods
func _updateTileData() -> void:
# ray cast down
var offset = Vector3(0, 0, 0.426);
var query = PhysicsRayQueryParameters3D.create(
position + offset,
position + Vector3(0, -1, 0) + offset
)
query.collide_with_areas = true
query.exclude = [self]
var result = get_world_3d().direct_space_state.intersect_ray(query)
if !result or !result.collider:
return;
var collider = result.collider;
var colliderMesh = collider.get_node("../");
if !colliderMesh or !colliderMesh.mesh or colliderMesh.mesh.get_surface_count() == 0:
return;
# Get the face index (triangle)
var arrays = colliderMesh.mesh.surface_get_arrays(0);
var indiceIdx = result.face_index * 3;
# Get each indice of the triangle
var index0 = arrays[Mesh.ARRAY_INDEX][indiceIdx+0];
var index1 = arrays[Mesh.ARRAY_INDEX][indiceIdx+1];
var index2 = arrays[Mesh.ARRAY_INDEX][indiceIdx+2];
# Get each uv of each indice
var uv0:Vector2 = arrays[Mesh.ARRAY_TEX_UV][index0];
var uv1:Vector2 = arrays[Mesh.ARRAY_TEX_UV][index1];
var uv2:Vector2 = arrays[Mesh.ARRAY_TEX_UV][index2];
# Determine the lowest texture coordinate
var min = Vector2(min(uv0.x, uv1.x, uv2.x), min(uv0.y, uv1.y, uv2.y));
# Convert to column/row
var w = 768;
var h = w;
var tw = 48;
var th = tw;
var column = int(roundf(min.x * w)) / 48;
var row = int(roundf(min.y * h)) / 48;
var columns = 768 / 48;
underFootPosition = result.position;
underFootTile = column % columns + row * columns;
# Events
func _ready() -> void:
meshInstance = get_node("MeshInstance3D")
_updateTileData();
pass
func _process(delta:float) -> void:
@@ -46,16 +97,17 @@ func _process(delta:float) -> void:
var material:ShaderMaterial = meshInstance.get_surface_override_material(0)
material.set_shader_parameter("direction", direction)
func _physics_process(delta: float) -> void:
# Update movement
updateMovement(delta);
# Gravity and friction
if !is_on_floor():
velocity.y -= gravity * delta;
else:
velocity += -(velocity * friction * delta);
# Update movement
updateMovement(delta)
if velocity.length() != 0:
_updateTileData();
# Update character controller.
move_and_slide();

View File

@@ -1,6 +1,7 @@
extends Camera3D
var PIXEL_SCALE:float = 4.0;
const PIXEL_SCALE:float = 4.0;
const WORLD_UNITS:float = 32.0;
func _ready() -> void:
pass
@@ -10,7 +11,7 @@ func _process(delta: float) -> void:
var z:float = (
tan((deg_to_rad(180) - deg_to_rad(fov)) / 2.0) *
(get_viewport().size.y / 2.0)
) / PIXEL_SCALE;
) / PIXEL_SCALE / WORLD_UNITS;
var rosa = get_node("..");
var look = rosa.position;

View File

@@ -1,6 +1,6 @@
extends "res://scripts/OverworldEntity.gd"
var interactRange = 22;
var interactRange = 0.7;
func updateOverworldLogic(delta) -> void:
# Check if interact button is pressed