diff --git a/core/tools.gd b/core/tools.gd index 060f026..7aef233 100644 --- a/core/tools.gd +++ b/core/tools.gd @@ -17,3 +17,8 @@ static func get_nearest(from: Node2D, nodes: Array[Node], predicate: Callable) - static func jitter(pos: Vector2, min_dist = 0.0, max_dist = 100.0) -> Vector2: # TODO uniform distribution return pos + Vector2.from_angle(randf_range(0.0, PI * 2.0)) * randf_range(min_dist, max_dist) + +# Acceleration toward a value +static func accel(current: Variant, target: Variant, accel: float, delta: float) -> Variant: + var diff = target - current + return current + min(diff * accel * delta, diff * accel * 0.1) diff --git a/core/unit.gd b/core/unit.gd index 2cf94c6..0dee9f2 100644 --- a/core/unit.gd +++ b/core/unit.gd @@ -18,12 +18,13 @@ signal promoted _check_compose() @export var hitpoints := 1 -@export var rotation_offset := 0.0 var chief_ref := WeakRef.new() -var target_reached = true var target_position := Vector2.ZERO +var target_linear_velocity := Vector2.ZERO +var target_angular_velocity := 0.0 +var target_reached := false var is_chief := false var subordinates := 0 @@ -39,16 +40,21 @@ func _compose(): if player.code and not Engine.is_editor_hint(): add_to_group("player:" + player.code) -func _physics_process(delta): - if not target_reached: - # TODO use position instead of global_position, once parented to battlefield - var previous = global_position - global_position += (target_position - global_position).normalized() * 100.0 * delta - var diff = global_position - previous - if diff.length() > 0.01: - $sprite.rotation = rotation_offset + diff.angle() - if global_position.distance_to(target_position) < 5.0: +func _process(delta): + if Engine.is_editor_hint(): + return + + if target_reached: + target_linear_velocity = Vector2.ZERO + else: + var current_position = self.global_position + var diff = target_position - current_position + if diff.length() > 5.0: + target_linear_velocity = diff.normalized() * clamp(diff.length() * 0.1, 1.0, 10.0) * 10.0 + else: target_reached = true + + self.linear_velocity = Tools.accel(self.linear_velocity, target_linear_velocity, 0.4, delta) func move_to(pos: Vector2): if pos != target_position: diff --git a/core/unit.tscn b/core/unit.tscn index 9afe679..5017955 100644 --- a/core/unit.tscn +++ b/core/unit.tscn @@ -1,8 +1,14 @@ -[gd_scene load_steps=2 format=3 uid="uid://bft45rcp7v3a6"] +[gd_scene load_steps=3 format=3 uid="uid://bft45rcp7v3a6"] [ext_resource type="Script" path="res://core/unit.gd" id="1_1i367"] -[node name="unit" type="Node2D" groups=["unit"]] +[sub_resource type="CircleShape2D" id="CircleShape2D_n7nby"] + +[node name="unit" type="RigidBody2D" groups=["unit"]] script = ExtResource("1_1i367") +[node name="shape" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_n7nby") +disabled = true + [node name="sprite" type="Sprite2D" parent="."] diff --git a/project.godot b/project.godot index 20188fc..3c8f60e 100644 --- a/project.godot +++ b/project.godot @@ -74,6 +74,11 @@ config/icon="res://tac/assets/icon.png" window/size/viewport_width=1280 window/size/viewport_height=720 +[physics] + +2d/default_gravity=0.0 +2d/default_gravity_vector=Vector2(0, 0) + [rendering] renderer/rendering_method="mobile"