enemy.gd 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. extends RigidBody
  2. # member variables here, example:
  3. # var a=2
  4. # var b="textvar"
  5. const STATE_WALKING = 0
  6. const STATE_DYING = 1
  7. var prev_advance = false
  8. var deaccel = 20.0
  9. var accel = 5
  10. var max_speed = 2
  11. var rot_dir = 4
  12. var rot_speed = 1
  13. var dying=false
  14. func _integrate_forces(state):
  15. var delta = state.get_step()
  16. var lv = state.get_linear_velocity()
  17. var g = state.get_total_gravity()
  18. lv += g * delta #apply gravity
  19. var up = -g.normalized()
  20. if (dying):
  21. state.set_linear_velocity(lv)
  22. return
  23. for i in range(state.get_contact_count()):
  24. var cc = state.get_contact_collider_object(i)
  25. var dp = state.get_contact_local_normal(i)
  26. if (cc):
  27. if (cc extends preload("res://bullet.gd") and not cc.disabled):
  28. set_mode(MODE_RIGID)
  29. dying=true
  30. #lv=s.get_contact_local_normal(i)*400
  31. state.set_angular_velocity( -dp.cross(up).normalized() *33.0)
  32. get_node("AnimationPlayer").play("impact")
  33. get_node("AnimationPlayer").queue("explode")
  34. set_friction(true)
  35. cc.disabled=true
  36. get_node("sound").play("hit")
  37. return
  38. var col_floor = get_node("Armature/ray_floor").is_colliding()
  39. var col_wall = get_node("Armature/ray_wall").is_colliding()
  40. var advance = not col_wall and col_floor
  41. var dir = get_node("Armature").get_transform().basis[2].normalized()
  42. var deaccel_dir = dir
  43. if (advance):
  44. if (dir.dot(lv) < max_speed):
  45. lv+=dir * accel * delta
  46. deaccel_dir = dir.cross(g).normalized()
  47. else:
  48. if (prev_advance):
  49. rot_dir = 1 #randf() * 2.0 -1.0
  50. dir = Matrix3(up,rot_dir * rot_speed * delta).xform(dir)
  51. get_node("Armature").set_transform( Transform().looking_at(-dir,up) )
  52. var dspeed = deaccel_dir.dot(lv)
  53. dspeed -= deaccel * delta
  54. if (dspeed<0):
  55. dspeed=0
  56. lv = lv - deaccel_dir*deaccel_dir.dot(lv) + deaccel_dir*dspeed
  57. state.set_linear_velocity(lv)
  58. prev_advance=advance
  59. func _ready():
  60. # Initalization here
  61. pass