kinematic stuff also steering behaviours testing stuff

This commit is contained in:
Robin Hübner 2017-08-10 20:55:15 +02:00
parent 52f1bb3bdd
commit 2ff9042c96
2 changed files with 124 additions and 6 deletions

View File

@ -1,17 +1,37 @@
extends KinematicBody2D 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 grunt_rot_speed = deg2rad(22.5) # degrees per second
var current_target = null
var cur_kinematic
var s_seek
var s_arrive
func _ready(): func _ready():
var t = get_tree() var t = get_tree().get_root().get_node("Game/MinimapControl").register_entity(self)
var r = t.get_root() set_fixed_process(true)
var n = r.get_node("Game/MinimapControl")
n.register_entity(self)
set_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(): func type():
return "EnemyGrunt" 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): func _process(delta):
rotate(grunt_rot_speed * delta) pass
# rotate(grunt_rot_speed * delta)

98
Kinematic.gd Normal file
View File

@ -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