shattered_controller 0.3 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/actor/actor.rb +91 -0
- data/lib/base.rb +28 -0
- data/lib/keyboard_input/{input.rb → key_converter.rb} +1 -1
- data/lib/keyboard_input/keyboard_input.rb +15 -6
- data/lib/runner.rb +2 -3
- data/lib/shattered_controller.rb +0 -1
- data/lib/state.rb +7 -3
- metadata +4 -4
- data/lib/auto_require.rb +0 -2
data/lib/actor/actor.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
module ShatteredController
|
2
|
+
module Actor
|
3
|
+
def self.append_features(base)
|
4
|
+
super
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
base.send(:include, InstanceMethods)
|
7
|
+
end
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
# An actor is the MVC encapsulated into one object.
|
11
|
+
# With actors, you can send requests to each of the model, view and control
|
12
|
+
# objects, and even retrieve results from the MVC objects.
|
13
|
+
#
|
14
|
+
# Here is how it works: You specify a actor in a game state with some starting
|
15
|
+
# attributes:
|
16
|
+
#
|
17
|
+
# actor :napolean, :mood => 'snobbish'
|
18
|
+
#
|
19
|
+
# The options are the same as the camera options, except they propogate through
|
20
|
+
# the MVC object(as all commands do).
|
21
|
+
#
|
22
|
+
# When obtaining a result, the result will be the a response in the following order
|
23
|
+
# - Model
|
24
|
+
# - View
|
25
|
+
# - Controller
|
26
|
+
#
|
27
|
+
# They are sorted so that you get the most useful response first.
|
28
|
+
def actor( name, options = {} )
|
29
|
+
before_init_call( :actor, name, options )
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
module InstanceMethods
|
34
|
+
|
35
|
+
def actors
|
36
|
+
return @actors || []
|
37
|
+
end
|
38
|
+
|
39
|
+
# Used by Base#actor
|
40
|
+
def actor(name=nil, options={})
|
41
|
+
raise Error, "actor needs a name" if name.nil?
|
42
|
+
actor = Actor.new(name,load_actor_classes(name))
|
43
|
+
|
44
|
+
attr_reader(name.to_sym, actor)
|
45
|
+
call_object_function_for_each_key( name.to_sym, options )
|
46
|
+
|
47
|
+
@actors ||= []
|
48
|
+
@actors << actor
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def load_actor_classes(name)
|
54
|
+
actor_options={}
|
55
|
+
['model', 'view', 'controller'].each do |type|
|
56
|
+
evaled_class = nil
|
57
|
+
begin
|
58
|
+
evaled_class = eval("#{name.to_s.camelize}#{type.camelize}")
|
59
|
+
rescue NameError
|
60
|
+
next
|
61
|
+
end
|
62
|
+
actor_options[type.to_sym] = evaled_class.new
|
63
|
+
end
|
64
|
+
raise Error, "No Model, View, or Control defined for Actor #{name}." if actor_options == {}
|
65
|
+
return actor_options
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
# An actor is a delegator to a controller game object.
|
71
|
+
class Actor
|
72
|
+
attr_reader :controller
|
73
|
+
def initialize( name, options = {} )
|
74
|
+
@actor_name = name
|
75
|
+
@controller = (options[:controller] || ShatteredController::Base.new)
|
76
|
+
@controller.model = options[:model]
|
77
|
+
@controller.view = options[:view]
|
78
|
+
@controller.view.model = options[:model] unless @controller.view.nil?
|
79
|
+
|
80
|
+
if options[:view].nil? && options[:model].nil? && @controller.nil? && !options[:testing]
|
81
|
+
raise NameError, "No model view or controller found for actor #{name}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Delegate to controller
|
86
|
+
def method_missing(name, *args, &block)
|
87
|
+
@controller.send(name, *args, &block)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/base.rb
CHANGED
@@ -4,13 +4,41 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
4
4
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
5
5
|
|
6
6
|
require 'keyboard_input/keyboard_input'
|
7
|
+
require 'actor/actor'
|
7
8
|
|
8
9
|
module ShatteredController
|
10
|
+
|
9
11
|
class Base < ShatteredSupport::Base
|
12
|
+
attr_accessor :model, :view
|
13
|
+
|
14
|
+
# Controller delegates all unknown methods to the view and model.
|
15
|
+
def method_missing(method_name, *args, &block)
|
16
|
+
raise_no_method_error = true
|
17
|
+
result = nil
|
18
|
+
[view, model].each do |delegate|
|
19
|
+
if delegate.method_defined?(method_name)
|
20
|
+
result = delegate.send(method_name, *args, &block)
|
21
|
+
raise_no_method_error = false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
raise NoMethodError, "Model, View, and Controller have no method defined named '#{method_name}'" if raise_no_method_error
|
25
|
+
return result
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def update_timer(time_elapsed)
|
30
|
+
timer.update(time_elapsed)
|
31
|
+
model.timer.update(time_elapsed)
|
32
|
+
view.timer.update(time_elapsed)
|
10
33
|
unless view.nil?
|
34
|
+
end
|
11
35
|
end
|
36
|
+
|
37
|
+
class Error < StandardError
|
38
|
+
end
|
12
39
|
end
|
13
40
|
|
14
41
|
ShatteredController::Base.class_eval do
|
15
42
|
include ShatteredController::KeyboardInput
|
43
|
+
include ShatteredController::Actor
|
16
44
|
end
|
17
45
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'key_converter'
|
5
5
|
|
6
6
|
module ShatteredController
|
7
7
|
module KeyboardInput
|
@@ -36,6 +36,14 @@ module ShatteredController
|
|
36
36
|
end
|
37
37
|
|
38
38
|
module InstanceMethods
|
39
|
+
def pre_initialize
|
40
|
+
# update our keyboard input
|
41
|
+
timer.every(:frame) do |time_elapsed|
|
42
|
+
update_input(time_elapsed, ShatteredController::Runner.environment[:input])
|
43
|
+
end
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
39
47
|
def key_types
|
40
48
|
[:pressed, :released, :held]
|
41
49
|
end
|
@@ -46,11 +54,11 @@ module ShatteredController
|
|
46
54
|
def reaction_from(options)
|
47
55
|
# Define the method to send the actions when the keys are pressed/clicked/released.
|
48
56
|
key_types.each do |reaction|
|
49
|
-
return [reaction, options[reaction],options[:action]] if !options[reaction].nil?
|
57
|
+
return [reaction, options[reaction].to_sym, options[:action]] if !options[reaction].nil?
|
50
58
|
end
|
51
|
-
raise
|
59
|
+
raise Error, "Reaction to key input must be pressed, released, or held. #{options.inspect}" if options[:reaction].nil?
|
52
60
|
end
|
53
|
-
#
|
61
|
+
# See KeyboardInput::key
|
54
62
|
def key(actions={})
|
55
63
|
key_actions << reaction_from(actions)
|
56
64
|
end
|
@@ -58,9 +66,9 @@ module ShatteredController
|
|
58
66
|
# are defined.
|
59
67
|
def key_action(reaction, action, time_elapsed)
|
60
68
|
if reaction == :held
|
61
|
-
|
69
|
+
send(action, time_elapsed)
|
62
70
|
else
|
63
|
-
|
71
|
+
send(action)
|
64
72
|
end
|
65
73
|
end
|
66
74
|
def key_actions
|
@@ -72,6 +80,7 @@ module ShatteredController
|
|
72
80
|
key_action( reaction, action, time_elapsed ) if input.key_event?(reaction,key)
|
73
81
|
end
|
74
82
|
end
|
83
|
+
|
75
84
|
end
|
76
85
|
end
|
77
86
|
end
|
data/lib/runner.rb
CHANGED
@@ -5,14 +5,13 @@ module ShatteredController
|
|
5
5
|
class Runner
|
6
6
|
def initialize( options = {} )
|
7
7
|
@@environment ||= options
|
8
|
-
@@environment[:input] = ShatteredController::
|
8
|
+
@@environment[:input] = ShatteredController::KeyConverter.new(@@environment[:input])
|
9
9
|
end
|
10
10
|
#Every time this exits, a game dies.
|
11
11
|
def start_game
|
12
12
|
each_frame do |time_elapsed|
|
13
|
-
@@environment[:state].
|
13
|
+
@@environment[:state].update_timers(time_elapsed)
|
14
14
|
@@environment[:input].flush
|
15
|
-
@@environment[:state].update_actors time_elapsed
|
16
15
|
end
|
17
16
|
end
|
18
17
|
def each_frame
|
data/lib/shattered_controller.rb
CHANGED
data/lib/state.rb
CHANGED
@@ -35,7 +35,8 @@ module ShatteredController
|
|
35
35
|
before_init_set( "self", { :"sky" => [type, options[:material]] })
|
36
36
|
end
|
37
37
|
end
|
38
|
-
class State <
|
38
|
+
class State < ShatteredController::Base
|
39
|
+
|
39
40
|
def pre_initialize
|
40
41
|
ShatteredSupport::Configuration.environment[:state] = self
|
41
42
|
super
|
@@ -47,8 +48,11 @@ module ShatteredController
|
|
47
48
|
call_object_function_for_each_key(:camera, args[0])
|
48
49
|
end
|
49
50
|
|
50
|
-
|
51
|
-
|
51
|
+
# This is called every frame by the main game loop. All update events are now
|
52
|
+
# run through Timers.
|
53
|
+
def update_timers(time_elapsed)
|
54
|
+
update_timer(time_elapsed)
|
55
|
+
actors.each { |actor| actor.update_timer(time_elapsed) }
|
52
56
|
end
|
53
57
|
|
54
58
|
def unload!
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: shattered_controller
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version:
|
7
|
-
date: 2006-
|
6
|
+
version: 0.3.1
|
7
|
+
date: 2006-05-16
|
8
8
|
summary: "Shattered Controller: Controls the game states and objects in Shattered."
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -26,14 +26,14 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
26
26
|
platform: ruby
|
27
27
|
authors: []
|
28
28
|
files:
|
29
|
-
- lib/auto_require.rb
|
30
29
|
- lib/base.rb
|
31
30
|
- lib/mock_camera.rb
|
32
31
|
- lib/runner.rb
|
33
32
|
- lib/shattered_controller.rb
|
34
33
|
- lib/shattered_controller_tester.rb
|
35
34
|
- lib/state.rb
|
36
|
-
- lib/
|
35
|
+
- lib/actor/actor.rb
|
36
|
+
- lib/keyboard_input/key_converter.rb
|
37
37
|
- lib/keyboard_input/keyboard_input.rb
|
38
38
|
test_files: []
|
39
39
|
rdoc_options: []
|
data/lib/auto_require.rb
DELETED