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.
- data/README.md +11 -6
- data/bin/teien +16 -2
- data/lib/teien/ai.rb +27 -0
- data/lib/teien/animation.rb +34 -0
- data/lib/teien/animation_operator.rb +6 -0
- data/lib/teien/controller.rb +30 -0
- data/lib/teien/dispatcher.rb +22 -0
- data/lib/teien/event.rb +60 -0
- data/lib/teien/event_router.rb +118 -0
- data/lib/teien/garden.rb +60 -172
- data/lib/teien/garden_base.rb +117 -0
- data/lib/teien/garden_object.rb +119 -136
- data/lib/teien/model.rb +34 -0
- data/lib/teien/network.rb +108 -0
- data/lib/teien/object_info.rb +21 -0
- data/lib/teien/physics.rb +47 -39
- data/lib/teien/physics_object.rb +57 -0
- data/lib/teien/physics_object_factory.rb +170 -0
- data/lib/teien/proxy_garden.rb +118 -0
- data/lib/teien/remote_info.rb +20 -0
- data/lib/teien/sky_dome.rb +15 -0
- data/lib/teien/smooth_mover.rb +31 -42
- data/lib/teien/synchronizer.rb +26 -0
- data/lib/teien/tools.rb +30 -2
- data/lib/teien/user_interface.rb +58 -5
- data/lib/teien/version.rb +1 -1
- data/lib/teien/view.rb +52 -33
- data/lib/teien/view_object.rb +67 -0
- data/lib/teien/view_object_factory.rb +210 -0
- data/lib/teien.rb +62 -14
- data/sample/actor/app/ais/actor_ai.rb +112 -0
- data/sample/actor/app/controllers/actor_controller.rb +182 -0
- data/sample/actor/app/helpers/sinbad/sinbad.rb +176 -0
- data/sample/actor/app/helpers/sinbad/sinbad_state.rb +224 -0
- data/sample/actor/app/helpers/user_event.rb +75 -0
- data/sample/actor/app/models/actor_model.rb +108 -0
- data/sample/actor/config/plugins.cfg +19 -0
- data/sample/actor/config/resources.cfg +24 -0
- data/sample/hello_garden/app/controllers/hello_garden_controller.rb +90 -0
- data/sample/hello_garden/app/helpers/user_event.rb +12 -0
- data/sample/{standalone/hello_garden/hello_garden.rb → hello_garden/app/models/hello_garden_model.rb} +29 -83
- data/sample/{standalone/hello_garden → hello_garden/config}/plugins.cfg +0 -0
- data/sample/{standalone/hello_garden → hello_garden/config}/resources.cfg +0 -0
- data/sample/hello_garden/run +6 -0
- data/teien.gemspec +2 -1
- metadata +52 -15
- data/lib/teien/light_object.rb +0 -36
- data/lib/teien/object_factory.rb +0 -308
- 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
|
+
|