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:
|
||||
# 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)
|
||||
|
|
28
core/unit.gd
28
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,17 +40,22 @@ 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:
|
||||
target_position = pos
|
||||
|
|
|
@ -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="."]
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue