summaryrefslogtreecommitdiff
path: root/demos/3d/platformer/enemy.gd
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-02-09 22:10:30 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-02-09 22:10:30 -0300
commit0b806ee0fc9097fa7bda7ac0109191c9c5e0a1ac (patch)
tree276c4d099e178eb67fbd14f61d77b05e3808e9e3 /demos/3d/platformer/enemy.gd
parent0e49da1687bc8192ed210947da52c9e5c5f301bb (diff)
GODOT IS OPEN SOURCE
Diffstat (limited to 'demos/3d/platformer/enemy.gd')
-rw-r--r--demos/3d/platformer/enemy.gd94
1 files changed, 94 insertions, 0 deletions
diff --git a/demos/3d/platformer/enemy.gd b/demos/3d/platformer/enemy.gd
new file mode 100644
index 0000000000..1d0e0315d9
--- /dev/null
+++ b/demos/3d/platformer/enemy.gd
@@ -0,0 +1,94 @@
+
+extends RigidBody
+
+# member variables here, example:
+# var a=2
+# var b="textvar"
+
+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(true)
+ 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 _ready():
+ # Initalization here
+ pass
+
+