teien 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/README.md +11 -6
  2. data/bin/teien +16 -2
  3. data/lib/teien/ai.rb +27 -0
  4. data/lib/teien/animation.rb +34 -0
  5. data/lib/teien/animation_operator.rb +6 -0
  6. data/lib/teien/controller.rb +30 -0
  7. data/lib/teien/dispatcher.rb +22 -0
  8. data/lib/teien/event.rb +60 -0
  9. data/lib/teien/event_router.rb +118 -0
  10. data/lib/teien/garden.rb +60 -172
  11. data/lib/teien/garden_base.rb +117 -0
  12. data/lib/teien/garden_object.rb +119 -136
  13. data/lib/teien/model.rb +34 -0
  14. data/lib/teien/network.rb +108 -0
  15. data/lib/teien/object_info.rb +21 -0
  16. data/lib/teien/physics.rb +47 -39
  17. data/lib/teien/physics_object.rb +57 -0
  18. data/lib/teien/physics_object_factory.rb +170 -0
  19. data/lib/teien/proxy_garden.rb +118 -0
  20. data/lib/teien/remote_info.rb +20 -0
  21. data/lib/teien/sky_dome.rb +15 -0
  22. data/lib/teien/smooth_mover.rb +31 -42
  23. data/lib/teien/synchronizer.rb +26 -0
  24. data/lib/teien/tools.rb +30 -2
  25. data/lib/teien/user_interface.rb +58 -5
  26. data/lib/teien/version.rb +1 -1
  27. data/lib/teien/view.rb +52 -33
  28. data/lib/teien/view_object.rb +67 -0
  29. data/lib/teien/view_object_factory.rb +210 -0
  30. data/lib/teien.rb +62 -14
  31. data/sample/actor/app/ais/actor_ai.rb +112 -0
  32. data/sample/actor/app/controllers/actor_controller.rb +182 -0
  33. data/sample/actor/app/helpers/sinbad/sinbad.rb +176 -0
  34. data/sample/actor/app/helpers/sinbad/sinbad_state.rb +224 -0
  35. data/sample/actor/app/helpers/user_event.rb +75 -0
  36. data/sample/actor/app/models/actor_model.rb +108 -0
  37. data/sample/actor/config/plugins.cfg +19 -0
  38. data/sample/actor/config/resources.cfg +24 -0
  39. data/sample/hello_garden/app/controllers/hello_garden_controller.rb +90 -0
  40. data/sample/hello_garden/app/helpers/user_event.rb +12 -0
  41. data/sample/{standalone/hello_garden/hello_garden.rb → hello_garden/app/models/hello_garden_model.rb} +29 -83
  42. data/sample/{standalone/hello_garden → hello_garden/config}/plugins.cfg +0 -0
  43. data/sample/{standalone/hello_garden → hello_garden/config}/resources.cfg +0 -0
  44. data/sample/hello_garden/run +6 -0
  45. data/teien.gemspec +2 -1
  46. metadata +52 -15
  47. data/lib/teien/light_object.rb +0 -36
  48. data/lib/teien/object_factory.rb +0 -308
  49. data/sample/standalone/hello_garden/run +0 -5
@@ -0,0 +1,112 @@
1
+ require 'teien'
2
+ require_relative '../helpers/user_event'
3
+ require_relative '../helpers/sinbad/sinbad'
4
+
5
+ include Teien
6
+
7
+ class ActorAi < Teien::Ai
8
+ def setup(garden)
9
+ @quit = false
10
+ @actor = nil
11
+
12
+ @first_update = true
13
+ @moveTime = 1.0
14
+ @active = false
15
+ end
16
+
17
+ def update(delta)
18
+ if @first_update
19
+ event = Event::RequestControllable.new()
20
+ @garden.send_event(event)
21
+ @first_update = false
22
+ end
23
+
24
+ if @actor
25
+
26
+ if @moveTime > 0
27
+ unless @leftActive
28
+ @leftActive = true
29
+ @rightActive = false
30
+ @moveTime = 2.0
31
+ event = Event::DisableAction.new(@actor.name)
32
+ event.right = true
33
+ @garden.send_event(event)
34
+
35
+ event = Event::EnableAction.new(@actor.name)
36
+ event.left = true
37
+ @garden.send_event(event)
38
+
39
+ puts "left"
40
+ end
41
+ @moveTime -= delta
42
+ else
43
+ unless @rightActive
44
+ @rightActive = true
45
+ @leftActive = false
46
+ @moveTime = -2.0
47
+ @active = false
48
+ event = Event::DisableAction.new(@actor.name)
49
+ event.left = true
50
+ @garden.send_event(event)
51
+
52
+ event = Event::EnableAction.new(@actor.name)
53
+ event.right = true
54
+ @garden.send_event(event)
55
+ puts "right"
56
+ end
57
+ @moveTime += delta
58
+ end
59
+
60
+ event = Event::SetForwardDirection.new(@actor.name, Vector3D.new(1.0, 0.0, 0.0))
61
+ # @garden.actors[event.actor_name].set_forward_direction(event.dir)
62
+ @garden.send_event(event)
63
+ # event = Event::SetForwardDirection.new(@actor.name, Vector3D.to_self(@camera_mover.camera.get_direction()))
64
+ #
65
+
66
+ end
67
+ end
68
+
69
+ def receive_event(event, from)
70
+ case event
71
+ when Event::SyncSinbad
72
+ unless (@garden.actors[event.actor_name])
73
+ actor = Sinbad.load_event(@garden, event)
74
+ @garden.actors[event.actor_name] = actor
75
+ end
76
+ # puts "SyncSindbad: #{event.actor_name}"
77
+ when Event::ControllableObject
78
+ @actor = @garden.actors[event.actor_name]
79
+ puts event.actor_name
80
+ puts @actor
81
+
82
+ when Event::SetForwardDirection
83
+ if @garden.actors[event.actor_name]
84
+ @garden.actors[event.actor_name].set_forward_direction(event.dir)
85
+ end
86
+ when Event::EnableAction
87
+ if event.forward
88
+ @garden.actors[event.actor_name].move_forward(true)
89
+ elsif event.backward
90
+ @garden.actors[event.actor_name].move_backward(true)
91
+ elsif event.left
92
+ @garden.actors[event.actor_name].move_left(true)
93
+ elsif event.right
94
+ @garden.actors[event.actor_name].move_right(true)
95
+ elsif event.jump
96
+ @garden.actors[event.actor_name].jump(true)
97
+ end
98
+ when Event::DisableAction
99
+ if event.forward
100
+ @garden.actors[event.actor_name].move_forward(false)
101
+ elsif event.backward
102
+ @garden.actors[event.actor_name].move_backward(false)
103
+ elsif event.left
104
+ @garden.actors[event.actor_name].move_left(false)
105
+ elsif event.right
106
+ @garden.actors[event.actor_name].move_right(false)
107
+ elsif event.jump
108
+ @garden.actors[event.actor_name].jump(false)
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,182 @@
1
+ require 'teien'
2
+ require_relative '../helpers/user_event'
3
+ require_relative '../helpers/sinbad/sinbad'
4
+
5
+ include Teien
6
+
7
+ class ActorController < Teien::Controller
8
+ def setup(garden)
9
+ @quit = false
10
+ @actor = nil
11
+ @first_update = true
12
+
13
+ @camera_mover = @ui.get_camera().get_mover()
14
+ @camera_mover.set_position(Vector3D.new(0, 10, 0))
15
+ @camera_mover.look_at(Vector3D.new(0, 0, 0))
16
+
17
+ @ui.show_frame_stats(UI::TL_BOTTOMLEFT)
18
+ @ui.show_logo(UI::TL_BOTTOMRIGHT)
19
+ @ui.hide_cursor()
20
+ end
21
+
22
+ def update(delta)
23
+ if @first_update
24
+ event = Event::RequestControllable.new()
25
+ @garden.send_event(event)
26
+ @first_update = false
27
+ end
28
+
29
+ @camera_mover.update(delta)
30
+
31
+ if @actor
32
+ event = Event::SetForwardDirection.new(@actor.name, Vector3D.to_self(@camera_mover.camera.get_direction()))
33
+ @garden.send_event(event)
34
+ # @actor.set_forward_direction(event.dir)
35
+ end
36
+ end
37
+
38
+ def receive_event(event, from)
39
+ case event
40
+ when Event::SyncSinbad
41
+ unless (@garden.actors[event.actor_name])
42
+ puts "new Sindbad: #{event.actor_name}"
43
+ actor = Sinbad.load_event(@garden, event)
44
+ @garden.actors[event.actor_name] = actor
45
+ end
46
+
47
+ when Event::ControllableObject
48
+ @actor = @garden.actors[event.actor_name]
49
+ puts event.actor_name
50
+ puts @actor
51
+
52
+ @camera_mover.set_style(CameraMover::CS_TPS)
53
+ @camera_mover.set_target(@actor.object)
54
+ when Event::SetForwardDirection
55
+ if @garden.actors[event.actor_name]
56
+ @garden.actors[event.actor_name].set_forward_direction(event.dir)
57
+
58
+ # puts "Event::SetForwardDirection" if event.actor_name != @actor.name
59
+ else
60
+ puts "no actor_name"
61
+ end
62
+ when Event::EnableAction
63
+ if event.forward
64
+ @garden.actors[event.actor_name].move_forward(true)
65
+ elsif event.backward
66
+ @garden.actors[event.actor_name].move_backward(true)
67
+ elsif event.left
68
+ @garden.actors[event.actor_name].move_left(true)
69
+ elsif event.right
70
+ @garden.actors[event.actor_name].move_right(true)
71
+ elsif event.jump
72
+ @garden.actors[event.actor_name].jump(true)
73
+ end
74
+ when Event::DisableAction
75
+ if event.forward
76
+ @garden.actors[event.actor_name].move_forward(false)
77
+ elsif event.backward
78
+ @garden.actors[event.actor_name].move_backward(false)
79
+ elsif event.left
80
+ @garden.actors[event.actor_name].move_left(false)
81
+ elsif event.right
82
+ @garden.actors[event.actor_name].move_right(false)
83
+ elsif event.jump
84
+ @garden.actors[event.actor_name].jump(false)
85
+ end
86
+ end
87
+ end
88
+
89
+ #
90
+ # Ui event handlers
91
+ #
92
+ def key_pressed(keyEvent)
93
+ # puts "key_pressed"
94
+
95
+ if (keyEvent.key == UI::KC_ESCAPE)
96
+ @garden.quit()
97
+ elsif (keyEvent.key == UI::KC_E)
98
+ event = Event::EnableAction.new(@actor.name)
99
+ event.forward = true
100
+ @garden.send_event(event)
101
+ # @actor.move_forward(true)
102
+ elsif (keyEvent.key == UI::KC_D)
103
+ event = Event::EnableAction.new(@actor.name)
104
+ event.backward = true
105
+ @garden.send_event(event)
106
+ # @actor.move_backward(true)
107
+ elsif (keyEvent.key == UI::KC_S)
108
+ event = Event::EnableAction.new(@actor.name)
109
+ event.left = true
110
+ @garden.send_event(event)
111
+ # @actor.move_left(true)
112
+ elsif (keyEvent.key == UI::KC_F)
113
+ event = Event::EnableAction.new(@actor.name)
114
+ event.right = true
115
+ @garden.send_event(event)
116
+ # @actor.move_right(true)
117
+ =begin
118
+ elsif (keyEvent.key == UI::KC_R)
119
+ @actor.press_gravity()
120
+ elsif (keyEvent.key == UI::KC_V)
121
+ @actor.stop_gravity()
122
+ =end
123
+ elsif (keyEvent.key == UI::KC_SPACE)
124
+ event = Event::EnableAction.new(@actor.name)
125
+ event.jump = true
126
+ @garden.send_event(event)
127
+ # @actor.jump(true)
128
+ end
129
+
130
+ return true
131
+ end
132
+
133
+ def key_released(keyEvent)
134
+ if (keyEvent.key == UI::KC_E)
135
+ event = Event::DisableAction.new(@actor.name)
136
+ event.forward = true
137
+ @garden.send_event(event)
138
+ # @actor.move_forward(false)
139
+ elsif (keyEvent.key == UI::KC_D)
140
+ event = Event::DisableAction.new(@actor.name)
141
+ event.backward = true
142
+ @garden.send_event(event)
143
+ # @actor.move_backward(false)
144
+ elsif (keyEvent.key == UI::KC_S)
145
+ event = Event::DisableAction.new(@actor.name)
146
+ event.left = true
147
+ @garden.send_event(event)
148
+ # @actor.move_left(false)
149
+ elsif (keyEvent.key == UI::KC_F)
150
+ event = Event::DisableAction.new(@actor.name)
151
+ event.right = true
152
+ @garden.send_event(event)
153
+ # @actor.move_right(false)
154
+ elsif (keyEvent.key == UI::KC_SPACE)
155
+ event = Event::DisableAction.new(@actor.name)
156
+ event.jump = true
157
+ @garden.send_event(event)
158
+ # @actor.jump(false)
159
+ end
160
+ return true
161
+ end
162
+
163
+ def mouse_moved(evt)
164
+ @camera_mover.mouse_moved(evt)
165
+ return true
166
+ end
167
+
168
+ def mouse_pressed(mouseEvent, mouseButtonID)
169
+ =begin
170
+ if (mouseButtonID == UI::MB_Left)
171
+ @actor.action_left()
172
+ elsif (mouseButtonID == UI::MB_Right)
173
+ @actor.action_right()
174
+ end
175
+ =end
176
+ return true
177
+ end
178
+
179
+ def mouse_released(mouseEvent, mouseButtonID)
180
+ return true
181
+ end
182
+ end
@@ -0,0 +1,176 @@
1
+ require_relative "sinbad_state"
2
+
3
+ class ClosestNotMe < Bullet::ClosestRayResultCallback
4
+ def initialize(rb)
5
+ super(Bullet::BtVector3.new(0.0, 0.0, 0.0), Bullet::BtVector3.new(0.0, 0.0, 0.0))
6
+ @rigidBody = rb
7
+ end
8
+
9
+ def addSingleResult(rayResult, normalInWorldSpace)
10
+ return 1.0 if (rayResult.m_collisionObject == @rigedBody)
11
+ return super(rayResult, normalInWorldSpace)
12
+ end
13
+ end
14
+
15
+ class Sinbad
16
+ attr_accessor :garden
17
+ attr_accessor :name
18
+
19
+ attr_accessor :object
20
+ attr_accessor :mover
21
+ attr_accessor :sm_mover
22
+ attr_accessor :grav_mover
23
+ attr_accessor :state
24
+
25
+ def initialize(garden, name)
26
+ @garden = garden
27
+
28
+ @name = name
29
+ build_object()
30
+
31
+ # moves this charactor smoothly.
32
+ @sm_mover = SmoothMover.new(@object)
33
+ @sm_mover.acceleration = 50
34
+
35
+ @object.animation_info.create_operator("TopAnim", "IdeleTop", 1.0, true)
36
+ @object.animation_info.create_operator("BaseAnim", "IdleBase", 1.0, true)
37
+ @object.animation_info.create_operator("HandsAnim", "HandsRelaxed", 1.0, true)
38
+
39
+ @mover = @sm_mover
40
+ @state = SinbadState.new(self)
41
+ end
42
+
43
+ def finalize()
44
+ @garden.objects.delete(@object.name)
45
+ @object.finalize()
46
+ end
47
+
48
+ def dump_event()
49
+ return Event::SyncSinbad.new(self)
50
+ end
51
+
52
+ def self.load_event(garden, event)
53
+ actor = garden.actors[event.actor_name]
54
+ if actor == nil
55
+ actor = Sinbad.new(garden, event.actor_name)
56
+ else
57
+ actor = garden.actors[event.actor_name]
58
+ end
59
+
60
+ return actor
61
+ end
62
+
63
+ def build_object()
64
+ # sinbad
65
+ object_info = MeshBBObjectInfo.new("sinbad.mesh", Vector3D.new(1.0, 1.0, 1.0))
66
+ object_info.scale = Vector3D.new(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0)
67
+ object_info.physics_offset = Vector3D.new(0, 1.0, 0)
68
+ object_info.view_offset = Vector3D.new(0, 2.5, 0)
69
+ object_info.view_rotation = Quaternion.new(Vector3D.new(0, 1, 0), Ogre::Degree.new(180.0).value_radians)
70
+ physics_info = PhysicsInfo.new(1.0)
71
+ physics_info.angular_factor = 0
72
+ physics_info.restitution = 0.5
73
+ physics_info.friction = 0.5
74
+ physics_info.linear_damping = 0.5
75
+ physics_info.angular_damping = 0
76
+ @object = @garden.create_object(@name, object_info, physics_info)
77
+ @object.set_position(Vector3D.new(0, 0, 0))
78
+
79
+ =begin
80
+ # swords
81
+ object_info = MeshObjectInfo.new("Sword.mesh")
82
+ object_info.scale = Vector3D.new(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0)
83
+ @sword1 = @garden.create_object("SinbadSword1", object_info, PhysicsInfo.new(1.0))
84
+ @object.attach_object_to_bone("Sheath.L", @sword1)
85
+
86
+ object_info = MeshObjectInfo.new("Sword.mesh")
87
+ object_info.scale = Vector3D.new(1.0 / 2.0, 1.0 / 2.0, 1.0 / 2.0)
88
+ @sword2 = @garden.create_object("SinbadSword2", object_info, PhysicsInfo.new(1.0))
89
+ #@object.entity.attach_object_to_bone("Sheath.R", @sword2)
90
+ =end
91
+ end
92
+
93
+ def update(delta)
94
+ @state.update(delta)
95
+ end
96
+
97
+ def check_on_ground()
98
+ rayCallback = ClosestNotMe.new(@object.physics_object.rigid_body)
99
+ rayCallback.m_closestHitFraction = 1.0
100
+ src = @object.get_position() + Vector3D.new(0, 0.1, 0)
101
+ tgt = src + Vector3D.new(0, -0.2, 0)
102
+
103
+ # puts "src(#{src.x}, #{src.y}, #{src.z})"
104
+ # puts "tgt(#{tgt.x}, #{tgt.y}, #{tgt.z})"
105
+
106
+ @garden.physics.dynamics_world.ray_test(src, tgt, rayCallback)
107
+ return true if (rayCallback.has_hit())
108
+ return false
109
+ end
110
+
111
+ def set_forward_direction(dir)
112
+ @mover.set_forward_direction(dir)
113
+ end
114
+
115
+ def move_forward(bl)
116
+ @mover.move_forward(bl)
117
+ end
118
+
119
+ def move_backward(bl)
120
+ @mover.move_backward(bl)
121
+ end
122
+
123
+ def move_left(bl)
124
+ @mover.move_left(bl)
125
+ end
126
+
127
+ def move_right(bl)
128
+ @mover.move_right(bl)
129
+ end
130
+
131
+ def jump(bl)
132
+ if bl
133
+ if @state.state?("GravityFree")
134
+ elsif @state.state?("JumpLoop")
135
+ else
136
+ @state.set_state("Jump")
137
+ end
138
+ end
139
+ end
140
+
141
+ def action_left()
142
+ @object.detach_object_from_bone(@sword1)
143
+ #@state.set_state("Kick")
144
+ end
145
+
146
+ def action_right
147
+ @state.set_state("Attack")
148
+ end
149
+
150
+ def press_gravity
151
+ @state.set_state("GravityFree")
152
+ end
153
+
154
+ def release_gravity
155
+ end
156
+
157
+ def stop_gravity
158
+ @object.set_gravity(Vector3D.new(0, -9.8, 0))
159
+ @state.set_state("InAir")
160
+ end
161
+
162
+ def play_top_animation(name, loop = true)
163
+ @object.animation_info.operators["TopAnim"].name = name
164
+ @object.animation_info.operators["TopAnim"].loop = loop
165
+ end
166
+
167
+ def play_base_animation(name, loop = true)
168
+ @object.animation_info.operators["BaseAnim"].name = name
169
+ @object.animation_info.operators["BaseAnim"].loop = loop
170
+ end
171
+
172
+ def play_hands_animation(name, loop = true)
173
+ @object.animation_info.operators["HandsAnim"].name = name
174
+ @object.animation_info.operators["HnadsAnim"].loop = loop
175
+ end
176
+ end
@@ -0,0 +1,224 @@
1
+ class SinbadState
2
+ def initialize(parent)
3
+ @state = nil
4
+ @prevState = nil
5
+ @stateHash = {}
6
+ @stateHash["Stop"] = Stop.new(parent)
7
+ @stateHash["Run"] = Run.new(parent)
8
+ @stateHash["GravityFree"] = GravityFree.new(parent)
9
+ @stateHash["InAir"] = InAir.new(parent)
10
+ @stateHash["Jump"] = Jump.new(parent)
11
+ @stateHash["JumpLoop"] = JumpLoop.new(parent)
12
+ @stateHash["JumpEnd"] = JumpEnd.new(parent)
13
+ set_state("Stop")
14
+
15
+ end
16
+
17
+ def set_state(state)
18
+ nextState = @stateHash[state]
19
+ if (!@state.equal?(nextState))
20
+ @state.fini() if (@state != nil)
21
+ @prevState = @state
22
+ @state = nextState
23
+
24
+ puts state
25
+
26
+ @state.init() if(@state != nil)
27
+ return true
28
+ end
29
+ return false
30
+ end
31
+
32
+ def set_prev_state()
33
+ return false if (@prevState == nil)
34
+
35
+ @state.fini() if (@state != nil)
36
+ @state = @prevState
37
+ @prevState = nil
38
+ @state.init() if(@state != nil)
39
+ return true
40
+ end
41
+
42
+ def state?(name)
43
+ return @state == @stateHash[name]
44
+ end
45
+
46
+ def update(delta)
47
+ @state.update(delta)
48
+ end
49
+
50
+
51
+ #
52
+ # define all of this actor states.
53
+ #
54
+ class Stop
55
+ def initialize(parent)
56
+ @parent = parent
57
+ end
58
+ def init()
59
+ @parent.play_top_animation("IdleTop")
60
+ @parent.play_base_animation("IdleBase")
61
+ # @parent.object.set_damping(0.9, 0)
62
+ end
63
+ def update(delta)
64
+ unless @parent.check_on_ground()
65
+ @parent.state.set_state("InAir")
66
+ return
67
+ end
68
+
69
+ @parent.mover.update_target(delta)
70
+ if (@parent.mover.moving?())
71
+ @parent.state.set_state("Run")
72
+ end
73
+ end
74
+ def fini()
75
+ end
76
+ end
77
+
78
+ class Run
79
+ def initialize(parent)
80
+ @parent = parent
81
+ end
82
+
83
+ def init()
84
+ @parent.play_top_animation("RunTop")
85
+ @parent.play_base_animation("RunBase")
86
+ # @parent.object.set_damping(0.0, 0)
87
+ @parent.object.set_max_horizontal_velocity(17.0)
88
+ end
89
+
90
+ def update(delta)
91
+ @parent.mover.update_target(delta)
92
+ unless (@parent.mover.moving?())
93
+ @parent.state.set_state("Stop")
94
+ end
95
+ end
96
+
97
+ def fini()
98
+ end
99
+ end
100
+
101
+ class GravityFree
102
+ def initialize(parent)
103
+ @parent = parent
104
+ end
105
+
106
+ def init()
107
+ @parent.play_top_animation("IdleTop")
108
+ @parent.play_base_animation("IdleBase")
109
+ # @parent.object.set_damping(0, 0)
110
+
111
+ grav = @parent.object.get_gravity()
112
+ puts "gravity: (#{grav.x}, #{grav.y}, #{grav.z})"
113
+ @parent.object.set_gravity(Vector3D.new(0, 0, 0))
114
+
115
+ @parent.mover = @parent.grav_mover
116
+ end
117
+
118
+ def update(delta)
119
+ @parent.mover.update_target(delta)
120
+ end
121
+
122
+ def fini()
123
+ @parent.object.set_gravity(Vector3D.new(0, -9.8, 0))
124
+ @parent.mover = @parent.sm_mover
125
+ end
126
+ end
127
+
128
+ class InAir
129
+ def initialize(parent)
130
+ @parent = parent
131
+ end
132
+
133
+ def init()
134
+ @parent.play_top_animation("IdleTop")
135
+ @parent.play_base_animation("IdleBase")
136
+ # @parent.object.set_damping(0, 0)
137
+
138
+ @parent.object.set_gravity(Vector3D.new(0, -9.8, 0))
139
+ end
140
+
141
+ def update(delta)
142
+ if @parent.check_on_ground()
143
+ @parent.state.set_state("Stop")
144
+ end
145
+ end
146
+
147
+ def fini()
148
+ end
149
+ end
150
+
151
+ class Jump
152
+ def initialize(parent)
153
+ @parent = parent
154
+ end
155
+
156
+ def init()
157
+ @parent.play_top_animation("IdleTop")
158
+ @parent.play_base_animation("JumpStart")
159
+ # @parent.object.set_damping(0, 0)
160
+
161
+ @parent.object.set_gravity(Vector3D.new(0, -9.8, 0))
162
+ @parent.object.set_acceleration(Vector3D.new(0, 39.8, 0))
163
+ @timer = 0
164
+ end
165
+
166
+ def update(delta)
167
+ @timer += delta
168
+
169
+ # if @timer > @parent.object.entity.get_animation_state("JumpStart").get_length()
170
+ if @timer > 0.1
171
+ @parent.state.set_state("JumpLoop")
172
+ end
173
+ end
174
+
175
+ def fini()
176
+ end
177
+ end
178
+
179
+ class JumpLoop
180
+ def initialize(parent)
181
+ @parent = parent
182
+ end
183
+
184
+ def init()
185
+ @parent.play_top_animation("IdleTop")
186
+ @parent.play_base_animation("JumpLoop")
187
+ # @parent.object.set_damping(0, 0)
188
+ @parent.object.set_acceleration(Vector3D.new(0, 0.0, 0))
189
+ end
190
+
191
+ def update(delta)
192
+ if @parent.check_on_ground()
193
+ @parent.state.set_state("JumpEnd")
194
+ end
195
+ end
196
+
197
+ def fini()
198
+ end
199
+ end
200
+
201
+
202
+ class JumpEnd
203
+ def initialize(parent)
204
+ @parent = parent
205
+ end
206
+
207
+ def init()
208
+ @parent.play_top_animation("IdleTop")
209
+ @parent.play_base_animation("JumpEnd")
210
+ # @parent.object.set_damping(0, 0)
211
+
212
+ @parent.object.set_gravity(Vector3D.new(0, -9.8, 0))
213
+ end
214
+
215
+ def update(delta)
216
+ @parent.state.set_state("Stop")
217
+ end
218
+
219
+ def fini()
220
+ end
221
+ end
222
+
223
+ end
224
+