From 2ff9042c96d69e4699fce3e0985e4dd3dfcd6009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20H=C3=BCbner?= Date: Thu, 10 Aug 2017 20:55:15 +0200 Subject: [PATCH] kinematic stuff also steering behaviours testing stuff --- EnemyGrunt.gd | 32 +++++++++++++---- Kinematic.gd | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 Kinematic.gd diff --git a/EnemyGrunt.gd b/EnemyGrunt.gd index 2db49ad..fba7047 100644 --- a/EnemyGrunt.gd +++ b/EnemyGrunt.gd @@ -1,17 +1,37 @@ extends KinematicBody2D +const km = preload("Kinematic.gd") + +var grunt_max_speed = 64 # pixels per second +var grunt_arrive_radius = 64 var grunt_rot_speed = deg2rad(22.5) # degrees per second -var current_target = null + +var cur_kinematic +var s_seek +var s_arrive func _ready(): - var t = get_tree() - var r = t.get_root() - var n = r.get_node("Game/MinimapControl") - n.register_entity(self) + var t = get_tree().get_root().get_node("Game/MinimapControl").register_entity(self) + set_fixed_process(true) set_process(true) + + cur_kinematic = km.Kinematic.new(self, grunt_max_speed) + s_seek = km.Seek.new(self) + s_arrive = km.Arrive.new(self, grunt_arrive_radius) + + var player = get_tree().get_root().get_node("Game/Player") + s_seek.set_target(player) + s_arrive.set_target(player) func type(): return "EnemyGrunt" +func _fixed_process(delta): + s_seek.update() + s_arrive.update() + cur_kinematic.update(s_seek, delta) + cur_kinematic.update(s_arrive, delta) + func _process(delta): - rotate(grunt_rot_speed * delta) + pass + # rotate(grunt_rot_speed * delta) diff --git a/Kinematic.gd b/Kinematic.gd new file mode 100644 index 0000000..c61b341 --- /dev/null +++ b/Kinematic.gd @@ -0,0 +1,98 @@ +extends Script + +class Kinematic: + + var owner + var velocity = Vector2(0, 0) # velocity to apply to position + var orientation = Vector2(0, 0) # current orientation + var rotation = 0.0 # radians to rotate + + # per instance custom + var max_speed + + func _init(o, m): + owner = o + max_speed = m + + func get_position(): + return owner.get_global_pos() + + func get_orientation(): + return velocity.normalized() + + func update(steering, delta): + + owner.move(velocity * delta) + owner.set_rot(velocity.normalized().angle()) + # owner.rotate(rotation * delta) + velocity += steering.velocity * delta + rotation += steering.rotation * delta + + # clip at kinematic + if velocity.length() > max_speed: + velocity = velocity.normalized() * max_speed + +class Seek: + + var owner + var target + var max_rot_speed = deg2rad(64) # degrees per second + + # output here + var velocity = Vector2(0, 0) + var rotation = 0 + + func _init(o): + owner = o + + func update(): + var tr = target.get_ref() + if tr: + # update velocity + velocity = tr.get_global_pos() - owner.get_global_pos() + # update orientation + #if velocity.length() > 0: + # rotation = clamp(velocity.normalized().angle(), -max_rot_speed, max_rot_speed) + else: + target = null + + func set_target(t): + target = weakref(t) + +class Arrive: + + var owner + var target + var velocity = Vector2(0, 0) + var rotation = 0 + + # custom + var radius = 0 + var time_to_target = 1 + + func _init(o, r): + owner = o + radius = r + + func update(): + var tr = target.get_ref() + if tr: + if velocity.length() < radius: + velocity.x = 0 + velocity.y = 0 + velocity /= time_to_target + else: + target = null + + func set_target(t): + target = weakref(t) + +class Flee: + func init(): + pass + + func get_steering(): + pass + +func _ready(): + pass