teien 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
+