8639cecf4c
The scripts were streamlined using more or less the following conventions: - space after a comma in lists of arguments - space around weak operators (+, -), no space around strong operators (*, /) - space after a comment start (#) - removed trailing spaces or tabs, apart from those that delimit the function indentation level (those could be removed too but since they are added automatically by the editor when typing code, keeping them for now) - function blocks separate by two newlines The scene files were resaved with the (current) 2.0 format, and some scenes that were in XML format were converted to SCN, to be consistent across all demos.
78 lines
1.8 KiB
GDScript
78 lines
1.8 KiB
GDScript
|
|
extends RigidBody
|
|
|
|
# member variables
|
|
const STATE_WALKING = 0
|
|
const STATE_DYING = 1
|
|
|
|
var prev_advance = false
|
|
var deaccel = 20.0
|
|
var accel = 5
|
|
var max_speed = 2
|
|
var rot_dir = 4
|
|
var rot_speed = 1
|
|
|
|
var dying = false
|
|
|
|
|
|
func _integrate_forces(state):
|
|
var delta = state.get_step()
|
|
var lv = state.get_linear_velocity()
|
|
var g = state.get_total_gravity()
|
|
|
|
lv += g*delta # apply gravity
|
|
var up = -g.normalized()
|
|
|
|
if (dying):
|
|
state.set_linear_velocity(lv)
|
|
return
|
|
|
|
for i in range(state.get_contact_count()):
|
|
var cc = state.get_contact_collider_object(i)
|
|
var dp = state.get_contact_local_normal(i)
|
|
|
|
if (cc):
|
|
if (cc extends preload("res://bullet.gd") and not cc.disabled):
|
|
set_mode(MODE_RIGID)
|
|
dying = true
|
|
#lv = s.get_contact_local_normal(i)*400
|
|
state.set_angular_velocity(-dp.cross(up).normalized()*33.0)
|
|
get_node("AnimationPlayer").play("impact")
|
|
get_node("AnimationPlayer").queue("explode")
|
|
set_friction(1)
|
|
cc.disabled = true
|
|
get_node("sound").play("hit")
|
|
return
|
|
|
|
var col_floor = get_node("Armature/ray_floor").is_colliding()
|
|
var col_wall = get_node("Armature/ray_wall").is_colliding()
|
|
|
|
var advance = not col_wall and col_floor
|
|
|
|
var dir = get_node("Armature").get_transform().basis[2].normalized()
|
|
var deaccel_dir = dir
|
|
|
|
if (advance):
|
|
if (dir.dot(lv) < max_speed):
|
|
lv += dir*accel*delta
|
|
deaccel_dir = dir.cross(g).normalized()
|
|
else:
|
|
if (prev_advance):
|
|
rot_dir = 1 # randf()*2.0 - 1.0
|
|
|
|
dir = Matrix3(up, rot_dir*rot_speed*delta).xform(dir)
|
|
get_node("Armature").set_transform(Transform().looking_at(-dir, up))
|
|
|
|
var dspeed = deaccel_dir.dot(lv)
|
|
dspeed -= deaccel*delta
|
|
if (dspeed < 0):
|
|
dspeed = 0
|
|
|
|
lv = lv - deaccel_dir*deaccel_dir.dot(lv) + deaccel_dir*dspeed
|
|
|
|
state.set_linear_velocity(lv)
|
|
prev_advance = advance
|
|
|
|
|
|
func _die():
|
|
queue_free()
|