update to mouse camera control

This commit is contained in:
2025-04-30 17:40:49 -04:00
parent 19289e49be
commit b218a28eb2
14 changed files with 264 additions and 30 deletions

View File

@@ -15,11 +15,67 @@ run/main_scene="uid://cyo30vhqp8aod"
config/features=PackedStringArray("4.4", "GL Compatibility") config/features=PackedStringArray("4.4", "GL Compatibility")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[autoload]
GameManager="*res://src/game_manager.gd"
[editor] [editor]
version_control/plugin_name="GitPlugin" version_control/plugin_name="GitPlugin"
version_control/autoload_on_startup=true version_control/autoload_on_startup=true
[input]
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_forward={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_back={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
activate_unit={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
]
}
select_unit={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
deselect_unit={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
zoom_in={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
zoom_out={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
[rendering] [rendering]
renderer/rendering_method="gl_compatibility" renderer/rendering_method="gl_compatibility"

View File

@@ -1,14 +1,19 @@
extends Node extends Node
class_name Model
## Pixel to meters ratio.
const PIXEL_SIZE := 0.0048 const PIXEL_SIZE := 0.0048
## Scale from the miniature scale to real size.
const HEROIC_SCALE := 57.2 const HEROIC_SCALE := 57.2
## Width to Height ratio of the image.
const W_H_RATIO := 1.4 const W_H_RATIO := 1.4
# Basic Variables # Basic Variables
@export var ModelName: String @export var ModelName: String
@export var CustomName: String @export var CustomName: String
@export var MovementDistance: int @export var MovementDistance: int
@export var BaseSize: String # In mm ## In mm.
@export var BaseSize: String
@export var MovementType: String @export var MovementType: String
@export var RangeCharacteristic: DiceModifier @export var RangeCharacteristic: DiceModifier
@export var MeleeCharacteristic: DiceModifier @export var MeleeCharacteristic: DiceModifier

50
src/base_model.tscn Normal file
View File

@@ -0,0 +1,50 @@
[gd_scene load_steps=9 format=3 uid="uid://c26jufswfi2bh"]
[ext_resource type="Script" uid="uid://di5g5x80wtaw7" path="res://src/base_model.gd" id="1_ni6nx"]
[sub_resource type="Gradient" id="Gradient_fqpka"]
offsets = PackedFloat32Array(0, 0.632124, 1)
colors = PackedColorArray(0, 0, 0, 1, 0.310881, 0.310881, 0.310881, 1, 1, 1, 1, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_f2ut7"]
gradient = SubResource("Gradient_fqpka")
fill = 1
[sub_resource type="Gradient" id="Gradient_hq8bp"]
offsets = PackedFloat32Array(0, 0.439024, 1)
colors = PackedColorArray(1, 1, 1, 1, 0.282927, 0.282927, 0.282927, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_lcex4"]
gradient = SubResource("Gradient_hq8bp")
fill = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f2ut7"]
albedo_color = Color(1, 0.0470588, 1, 1)
albedo_texture = SubResource("GradientTexture2D_f2ut7")
metallic = 0.6
metallic_texture = SubResource("GradientTexture2D_lcex4")
[sub_resource type="CylinderShape3D" id="CylinderShape3D_wfmmx"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_04rm0"]
[node name="BaseModel" type="CharacterBody3D"]
script = ExtResource("1_ni6nx")
[node name="Pivot" type="Node3D" parent="."]
[node name="Sprite2D" type="Sprite3D" parent="Pivot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30011, 0)
pixel_size = 0.0048
billboard = 2
[node name="Base" type="MeshInstance3D" parent="Pivot"]
transform = Transform3D(57.2, 0, 0, 0, 57.2, 0, 0, 0, 57.2, 0, 0, 0)
material_override = SubResource("StandardMaterial3D_f2ut7")
skeleton = NodePath("")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CylinderShape3D_wfmmx")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_04rm0")

53
src/camera_pivot.gd Normal file
View File

@@ -0,0 +1,53 @@
extends Node3D
## Speed of the camera
@export var CAMERA_SPEED := 10
## Min y distance of the camera
@export var MIN_ZOOM := 6
## Max y distance of the camera
@export var MAX_ZOOM := 18
@export var MOUSE_SENSITIVITY := 0.5
@export var TILT_LOWER_LIMIT := deg_to_rad(-10.0)
@export var TILT_UPPER_LIMIT := deg_to_rad(80.0)
var zoom := 6.0
var _mouse_rotation := Vector2.ZERO
var _mouse_input := Vector2.ZERO
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
_update_camera(delta)
if Input.is_action_pressed("move_right"):
position.x += CAMERA_SPEED * delta
if Input.is_action_pressed("move_left"):
position.x -= CAMERA_SPEED * delta
if Input.is_action_pressed("move_back"):
position.z += CAMERA_SPEED * delta
if Input.is_action_pressed("move_forward"):
position.z -= CAMERA_SPEED * delta
if Input.is_action_just_released("zoom_in"):
zoom -= CAMERA_SPEED * delta
if Input.is_action_just_released("zoom_out"):
zoom += CAMERA_SPEED * delta
zoom = clamp(zoom, MIN_ZOOM, MAX_ZOOM)
$Camera3D.position.y = zoom
func _unhandled_input(event):
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
_mouse_input.x = -event.relative.x * MOUSE_SENSITIVITY
_mouse_input.y = -event.relative.y * MOUSE_SENSITIVITY
func _update_camera(delta):
_mouse_rotation.x += _mouse_input.x * delta
_mouse_rotation.x = clamp(_mouse_rotation.x, TILT_UPPER_LIMIT, TILT_UPPER_LIMIT)
_mouse_rotation.y += _mouse_input.y * delta
_mouse_input = Vector2.ZERO
$Camera3D.transform.basis = Basis.from_euler(Vector3(_mouse_rotation.y, 0.0, 0.0))
#CAMERA_CONTROLLER.rotation.z = 0.0
global_transform.basis = Basis.from_euler(Vector3(0.0, _mouse_rotation.x, 0.0))

1
src/camera_pivot.gd.uid Normal file
View File

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

84
src/game_manager.gd Normal file
View File

@@ -0,0 +1,84 @@
extends Node
# id: {
# 'name': '...',
# 'models': [
# {
# name: "...",
# activated_this_turn: bool,
# },
# ],
# }
## List of current players.
var Players := {}
## Number turns to play.
@export var max_turns := 0
## Number of the current turn.
@export var current_turn_number := 0
## ID of the current Player to play.
@export var current_activation_player := 0
## Array of players id to cycle forplay order.
@export var players_activation_order := []
@export var players_activation_order_index = 0
func set_up_game() -> void:
print("Start of game")
current_turn_number = 0
start_turn()
func start_turn() -> void:
current_turn_number += 1
print("Start of turn %s of %s" % [current_turn_number, max_turns])
# Set Players activation order.
players_activation_order_index = 0
players_activation_order = []
for id in Players:
players_activation_order.append(id)
players_activation_order.sort_custom(_sort_players_by_units_left)
func next_activation() -> void:
# Check that there are players with not activated models
var successfuly_activated := false
for _i in range(len(Players)):
var player = _alternate_over_players()
for model in player.models:
if not model.activated_this_turn:
successfuly_activated = true
break
if successfuly_activated:
break
if not successfuly_activated:
end_turn()
func end_turn() -> void:
print("End of turn %s of %s" % [current_turn_number, max_turns])
if current_turn_number >= max_turns:
end_game()
func end_game() -> void:
print("End of game")
pass
# Utility functions
func _sort_players_by_units_left(a, b) -> bool:
var player_a_models := 0
for model in Players[a].models:
if model.in_action:
player_a_models += 1
var player_b_models := 0
for model in Players[b].models:
if model.in_action:
player_b_models += 1
return player_a_models < player_b_models
func _alternate_over_players() -> Dictionary:
players_activation_order_index += 1
if players_activation_order_index >= len(players_activation_order):
players_activation_order_index = 0
return Players[players_activation_order[players_activation_order_index]]

1
src/game_manager.gd.uid Normal file
View File

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

View File

@@ -1,6 +1,7 @@
[gd_scene load_steps=7 format=3 uid="uid://budrvmnmxvk2d"] [gd_scene load_steps=8 format=3 uid="uid://budrvmnmxvk2d"]
[ext_resource type="Script" uid="uid://b5kn17oto74o" path="res://src/main_game.gd" id="1_fq370"] [ext_resource type="Script" uid="uid://b5kn17oto74o" path="res://src/main_game.gd" id="1_fq370"]
[ext_resource type="Script" uid="uid://dsio3o1q73f1q" path="res://src/camera_pivot.gd" id="2_3vl0c"]
[ext_resource type="PackedScene" uid="uid://ds20afeq5fbty" path="res://src/models/combat_priest.tscn" id="2_78si8"] [ext_resource type="PackedScene" uid="uid://ds20afeq5fbty" path="res://src/models/combat_priest.tscn" id="2_78si8"]
[ext_resource type="Texture2D" uid="uid://c3ydthu2vpopv" path="res://assets/dev_512_gr_032x.jpg" id="3_aptux"] [ext_resource type="Texture2D" uid="uid://c3ydthu2vpopv" path="res://assets/dev_512_gr_032x.jpg" id="3_aptux"]
@@ -17,14 +18,15 @@ size = Vector3(10, 1, 10)
script = ExtResource("1_fq370") script = ExtResource("1_fq370")
[node name="CameraPivot" type="Node3D" parent="."] [node name="CameraPivot" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.34202, -0.939692, 0, 0.939692, 0.34202, 0, 0, 0)
script = ExtResource("2_3vl0c")
[node name="Camera3D" type="Camera3D" parent="CameraPivot"] [node name="Camera3D" type="Camera3D" parent="CameraPivot"]
transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 5, 5) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 10, 0)
keep_aspect = 0
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="CameraPivot"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 5, 0)
[node name="BaseModel" parent="." instance=ExtResource("2_78si8")] [node name="BaseModel" parent="." instance=ExtResource("2_78si8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.723289, 0)
[node name="StaticBody3D" type="StaticBody3D" parent="."] [node name="StaticBody3D" type="StaticBody3D" parent="."]
@@ -36,3 +38,7 @@ shape = SubResource("BoxShape3D_78si8")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
material_override = SubResource("StandardMaterial3D_3vl0c") material_override = SubResource("StandardMaterial3D_3vl0c")
mesh = SubResource("BoxMesh_aptux") mesh = SubResource("BoxMesh_aptux")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -0.707107, 0.707107, 0, -0.707107, -0.707107, 0, 10, -10)
shadow_enabled = true

View File

@@ -1,22 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://c26jufswfi2bh"]
[ext_resource type="Script" uid="uid://di5g5x80wtaw7" path="res://src/models/base_model.gd" id="1_ni6nx"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_wfmmx"]
[node name="BaseModel" type="CharacterBody3D"]
script = ExtResource("1_ni6nx")
[node name="Pivot" type="Node3D" parent="."]
[node name="Sprite2D" type="Sprite3D" parent="Pivot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30011, 0)
pixel_size = 0.0048
billboard = 2
[node name="Base" type="MeshInstance3D" parent="Pivot"]
transform = Transform3D(57.2, 0, 0, 0, 57.2, 0, 0, 0, 57.2, 0, 0, 0)
skeleton = NodePath("")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CylinderShape3D_wfmmx")

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=7 format=3 uid="uid://ds20afeq5fbty"] [gd_scene load_steps=7 format=3 uid="uid://ds20afeq5fbty"]
[ext_resource type="PackedScene" uid="uid://c26jufswfi2bh" path="res://src/models/base_model.tscn" id="1_t6p38"] [ext_resource type="PackedScene" uid="uid://c26jufswfi2bh" path="res://src/base_model.tscn" id="1_t6p38"]
[ext_resource type="Script" uid="uid://4h1cvticrj7u" path="res://src/utils/dice_modifier.gd" id="2_ni6nx"] [ext_resource type="Script" uid="uid://4h1cvticrj7u" path="res://src/utils/dice_modifier.gd" id="2_ni6nx"]
[ext_resource type="Texture2D" uid="uid://cc85nihxm3set" path="res://assets/cartas/combat_priest_pixel.png" id="3_ni6nx"] [ext_resource type="Texture2D" uid="uid://cc85nihxm3set" path="res://assets/cartas/combat_priest_pixel.png" id="3_ni6nx"]