convert units as rigid body
This commit is contained in:
parent
2b94671759
commit
4af7630109
|
@ -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:
|
static func jitter(pos: Vector2, min_dist = 0.0, max_dist = 100.0) -> Vector2:
|
||||||
# TODO uniform distribution
|
# TODO uniform distribution
|
||||||
return pos + Vector2.from_angle(randf_range(0.0, PI * 2.0)) * randf_range(min_dist, max_dist)
|
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)
|
||||||
|
|
28
core/unit.gd
28
core/unit.gd
|
@ -18,12 +18,13 @@ signal promoted
|
||||||
_check_compose()
|
_check_compose()
|
||||||
|
|
||||||
@export var hitpoints := 1
|
@export var hitpoints := 1
|
||||||
@export var rotation_offset := 0.0
|
|
||||||
|
|
||||||
var chief_ref := WeakRef.new()
|
var chief_ref := WeakRef.new()
|
||||||
|
|
||||||
var target_reached = true
|
|
||||||
var target_position := Vector2.ZERO
|
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 is_chief := false
|
||||||
var subordinates := 0
|
var subordinates := 0
|
||||||
|
|
||||||
|
@ -39,16 +40,21 @@ func _compose():
|
||||||
if player.code and not Engine.is_editor_hint():
|
if player.code and not Engine.is_editor_hint():
|
||||||
add_to_group("player:" + player.code)
|
add_to_group("player:" + player.code)
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _process(delta):
|
||||||
if not target_reached:
|
if Engine.is_editor_hint():
|
||||||
# TODO use position instead of global_position, once parented to battlefield
|
return
|
||||||
var previous = global_position
|
|
||||||
global_position += (target_position - global_position).normalized() * 100.0 * delta
|
if target_reached:
|
||||||
var diff = global_position - previous
|
target_linear_velocity = Vector2.ZERO
|
||||||
if diff.length() > 0.01:
|
else:
|
||||||
$sprite.rotation = rotation_offset + diff.angle()
|
var current_position = self.global_position
|
||||||
if global_position.distance_to(target_position) < 5.0:
|
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
|
target_reached = true
|
||||||
|
|
||||||
|
self.linear_velocity = Tools.accel(self.linear_velocity, target_linear_velocity, 0.4, delta)
|
||||||
|
|
||||||
func move_to(pos: Vector2):
|
func move_to(pos: Vector2):
|
||||||
if pos != target_position:
|
if pos != target_position:
|
||||||
|
|
|
@ -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"]
|
[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")
|
script = ExtResource("1_1i367")
|
||||||
|
|
||||||
|
[node name="shape" type="CollisionShape2D" parent="."]
|
||||||
|
shape = SubResource("CircleShape2D_n7nby")
|
||||||
|
disabled = true
|
||||||
|
|
||||||
[node name="sprite" type="Sprite2D" parent="."]
|
[node name="sprite" type="Sprite2D" parent="."]
|
||||||
|
|
|
@ -74,6 +74,11 @@ config/icon="res://tac/assets/icon.png"
|
||||||
window/size/viewport_width=1280
|
window/size/viewport_width=1280
|
||||||
window/size/viewport_height=720
|
window/size/viewport_height=720
|
||||||
|
|
||||||
|
[physics]
|
||||||
|
|
||||||
|
2d/default_gravity=0.0
|
||||||
|
2d/default_gravity_vector=Vector2(0, 0)
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
renderer/rendering_method="mobile"
|
renderer/rendering_method="mobile"
|
||||||
|
|
Loading…
Reference in a new issue