gamebox 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +6 -6
- data/lib/gamebox.rb +1 -1
- data/lib/gamebox/actors/fps.rb +6 -4
- data/lib/gamebox/core/actor.rb +23 -9
- data/lib/gamebox/core/actor_definition.rb +32 -0
- data/lib/gamebox/core/actor_view_definition.rb +28 -0
- data/lib/gamebox/core/arbiter.rb +6 -3
- data/lib/gamebox/core/behavior.rb +29 -11
- data/lib/gamebox/core/behavior_definition.rb +51 -1
- data/lib/gamebox/core/behavior_factory.rb +8 -1
- data/lib/gamebox/core/core.rb +2 -18
- data/lib/gamebox/core/director.rb +20 -9
- data/lib/gamebox/core/gamebox_dsl.rb +129 -0
- data/lib/gamebox/core/physics.rb +2 -2
- data/lib/gamebox/{stagehands/spatial_tree_stagehand.rb → core/spatial_tree.rb} +4 -3
- data/lib/gamebox/core/stage.rb +0 -39
- data/lib/gamebox/core/stage_definition.rb +28 -27
- data/lib/gamebox/lib/observable_attributes.rb +15 -0
- data/lib/gamebox/lib/vector2.rb +13 -6
- data/lib/gamebox/spec/helper.rb +2 -1
- data/lib/gamebox/version.rb +1 -1
- data/script/perf_aabb.rb +1 -1
- data/spec/actors/label_spec.rb +5 -5
- data/spec/core/behavior_factory_spec.rb +4 -4
- data/spec/core/behavior_spec.rb +3 -0
- data/spec/{stagehands/spatial_tree_stagehand_spec.rb → core/spatial_tree_spec.rb} +2 -2
- data/spec/core/stage_spec.rb +0 -1
- metadata +8 -9
- data/lib/gamebox/core/stagehand.rb +0 -14
- data/lib/gamebox/data/config/objects.yml +0 -39
data/README.md
CHANGED
@@ -30,8 +30,8 @@ The reason I wrote Gamebox is twofold: first, to aid in 48 hour game writing com
|
|
30
30
|
|
31
31
|
To create a new Gamebox project run:
|
32
32
|
|
33
|
-
```
|
34
|
-
gamebox zapper
|
33
|
+
```
|
34
|
+
$ gamebox new zapper
|
35
35
|
```
|
36
36
|
|
37
37
|
This will create the directory structure and needed files to get a basic actor up on the screen:
|
@@ -61,10 +61,10 @@ zapper
|
|
61
61
|
|
62
62
|
To run your game:
|
63
63
|
|
64
|
-
```
|
65
|
-
cd zapper
|
66
|
-
bundle
|
67
|
-
rake
|
64
|
+
```
|
65
|
+
$ cd zapper
|
66
|
+
$ bundle
|
67
|
+
$ rake
|
68
68
|
```
|
69
69
|
|
70
70
|
## Stages
|
data/lib/gamebox.rb
CHANGED
@@ -26,7 +26,7 @@ end
|
|
26
26
|
|
27
27
|
require "#{GAMEBOX_PATH}/version.rb"
|
28
28
|
require 'require_all'
|
29
|
-
directory_load_order = %w(lib core post_setup_handlers actors behaviors views
|
29
|
+
directory_load_order = %w(lib core post_setup_handlers actors behaviors views)
|
30
30
|
directory_load_order.each do |dir|
|
31
31
|
require_all "#{GAMEBOX_PATH}/#{dir}/**/*.rb"
|
32
32
|
end
|
data/lib/gamebox/actors/fps.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
define_behavior :fps_label_updater do
|
2
2
|
requires :director, :stage
|
3
3
|
setup do
|
4
4
|
@label = stage.create_actor :label, actor.attributes
|
@@ -6,10 +6,12 @@ Behavior.define :fps_label_updater do
|
|
6
6
|
@label.text = Gosu.fps
|
7
7
|
end
|
8
8
|
end
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
remove do
|
11
|
+
@label.remove
|
11
12
|
end
|
12
13
|
end
|
13
|
-
|
14
|
+
|
15
|
+
define_actor :fps do
|
14
16
|
has_behavior :fps_label_updater
|
15
17
|
end
|
data/lib/gamebox/core/actor.rb
CHANGED
@@ -20,18 +20,34 @@ class Actor
|
|
20
20
|
has_attributes opts
|
21
21
|
end
|
22
22
|
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# Adds the behavior object to the Actor. You should never use
|
24
|
+
# this method in your game.
|
25
25
|
def add_behavior(name, behavior)
|
26
26
|
@behaviors[name] = behavior
|
27
27
|
end
|
28
28
|
|
29
|
+
# Removes the behavior object from the Actor.
|
30
|
+
# Sends :remove reaction to the removed behavior.
|
31
|
+
# You should never use this method in your game.
|
29
32
|
def remove_behavior(name)
|
30
33
|
@behaviors.delete(name).tap do |behavior|
|
31
34
|
behavior.react_to :remove if behavior
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
38
|
+
# Returns true if the Actor has the named behavior.
|
39
|
+
#
|
40
|
+
# This is mostly used internally by Gamebox. You should favor
|
41
|
+
# not knowing behaviors if possible and instead look at the
|
42
|
+
# Actor's attributes via #do_or_do_not
|
43
|
+
def has_behavior?(name)
|
44
|
+
@behaviors[name]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Propogates the reaction to all behaviors of the Actor.
|
48
|
+
# Any behavior can react to these messages.
|
49
|
+
#
|
50
|
+
# @see Behavior#reacts_with
|
35
51
|
def react_to(message, *opts, &blk)
|
36
52
|
# TODO cache the values array?
|
37
53
|
@behaviors.values.each do |behavior|
|
@@ -40,20 +56,18 @@ class Actor
|
|
40
56
|
nil
|
41
57
|
end
|
42
58
|
|
43
|
-
def has_behavior?(name)
|
44
|
-
@behaviors[name]
|
45
|
-
end
|
46
|
-
|
47
59
|
def emit(event, *args)
|
48
60
|
fire event, *args
|
49
61
|
end
|
50
62
|
|
51
|
-
#
|
52
|
-
#
|
63
|
+
# Sets the Actor to no longer being alive.
|
64
|
+
#
|
65
|
+
# Sends a :remove reaction to all the Actor's behaviors.
|
66
|
+
# Emits a :remove_me event.
|
53
67
|
def remove
|
54
68
|
self.alive = false
|
55
69
|
react_to :remove
|
56
|
-
|
70
|
+
emit :remove_me
|
57
71
|
end
|
58
72
|
|
59
73
|
def input
|
@@ -5,6 +5,18 @@ class ActorDefinition
|
|
5
5
|
@attributes = []
|
6
6
|
end
|
7
7
|
|
8
|
+
# Setup default behaviors for this Actor
|
9
|
+
#
|
10
|
+
# # takes a block with method missing magic
|
11
|
+
# has_behaviors do
|
12
|
+
# shooter range: 12
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # takes a list of optionless behaviors
|
16
|
+
# has_behaviors :jumper, :shielded
|
17
|
+
#
|
18
|
+
# # takes a hash of behavior name to options
|
19
|
+
# has_behaviors shooter: {range: 12}
|
8
20
|
def has_behaviors(*behaviors, &blk)
|
9
21
|
if block_given?
|
10
22
|
collector = MethodMissingCollector.new
|
@@ -23,6 +35,13 @@ class ActorDefinition
|
|
23
35
|
end
|
24
36
|
alias has_behavior has_behaviors
|
25
37
|
|
38
|
+
# Setup observable attributes for the Actor and optionally default values
|
39
|
+
#
|
40
|
+
# # takes list of attributes (values will be nil)
|
41
|
+
# has_attributes :x, :y
|
42
|
+
#
|
43
|
+
# # takes hash of attributes with values
|
44
|
+
# has_attributes x: 5, y: 12
|
26
45
|
def has_attributes(*attributes)
|
27
46
|
attributes.each do |att|
|
28
47
|
@attributes << att
|
@@ -30,10 +49,23 @@ class ActorDefinition
|
|
30
49
|
end
|
31
50
|
alias has_attribute has_attributes
|
32
51
|
|
52
|
+
# Defines an ActorView for this Actor with the correct name.
|
53
|
+
#
|
54
|
+
# Exactly the same as calling define_actor_view with :my_actor_view.
|
55
|
+
#
|
56
|
+
# Do not call more than once.
|
57
|
+
#
|
58
|
+
# @see GameboxDSL#define_actor_view
|
33
59
|
def view(&blk)
|
34
60
|
@view_blk = blk
|
35
61
|
end
|
36
62
|
|
63
|
+
# Defines a Behavior with the Actor type as the name and adds it to the Actor.
|
64
|
+
#
|
65
|
+
# Exactly the same as calling define_behavior with :my_actor, and adding the
|
66
|
+
# behavior to the Actor.
|
67
|
+
#
|
68
|
+
# Do not call more than once.
|
37
69
|
def behavior(&blk)
|
38
70
|
@behavior_blk = blk
|
39
71
|
end
|
@@ -1,17 +1,45 @@
|
|
1
1
|
class ActorViewDefinition
|
2
2
|
attr_accessor :draw_block, :setup_block, :required_injections, :helpers_block, :source
|
3
|
+
|
4
|
+
# Sets the dependencies for this ActorView.
|
5
|
+
#
|
6
|
+
# These will be pulled from the Actor's object context at view construction time.
|
7
|
+
#
|
8
|
+
# requires :resource_manager
|
9
|
+
#
|
3
10
|
def requires(*injections_needed)
|
4
11
|
@required_injections = injections_needed
|
5
12
|
end
|
6
13
|
|
14
|
+
# Setup callback that is called when the view is constructed. The actor will
|
15
|
+
# be set before your setup block is executed.
|
16
|
+
#
|
17
|
+
# setup do
|
18
|
+
# resource_manager.load_image('something.png')
|
19
|
+
# end
|
20
|
+
#
|
7
21
|
def setup(&setup_block)
|
8
22
|
@setup_block = setup_block
|
9
23
|
end
|
10
24
|
|
25
|
+
# Draw callback that is called when the view needs to draw.
|
26
|
+
#
|
27
|
+
# draw do |screen, x_offset, y_offset, z|
|
28
|
+
# ...
|
29
|
+
# end
|
30
|
+
#
|
11
31
|
def draw(&draw_block)
|
12
32
|
@draw_block = draw_block
|
13
33
|
end
|
14
34
|
|
35
|
+
# Define methods and include modules for use by your view.
|
36
|
+
# helpers do
|
37
|
+
# include MyHelper
|
38
|
+
# def do_some_view_calc
|
39
|
+
# ...
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
#
|
15
43
|
def helpers(&helper_block)
|
16
44
|
@helpers_block = helper_block
|
17
45
|
end
|
data/lib/gamebox/core/arbiter.rb
CHANGED
@@ -3,11 +3,15 @@ module Arbiter
|
|
3
3
|
attr_reader :checks, :collisions
|
4
4
|
|
5
5
|
def register_collidable(actor)
|
6
|
-
|
6
|
+
aabb_tree.add(actor)
|
7
7
|
end
|
8
8
|
|
9
9
|
def unregister_collidable(actor)
|
10
|
-
|
10
|
+
aabb_tree.remove(actor)
|
11
|
+
end
|
12
|
+
|
13
|
+
def aabb_tree
|
14
|
+
@aabb_tree ||= SpatialTree.new(self)
|
11
15
|
end
|
12
16
|
|
13
17
|
def on_collision_of(first_objs, second_objs, &block)
|
@@ -59,7 +63,6 @@ module Arbiter
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def find_collisions
|
62
|
-
aabb_tree = stagehand(:spatial_tree)
|
63
66
|
collidable_actors = aabb_tree.moved_items.values
|
64
67
|
|
65
68
|
collisions = {}
|
@@ -4,30 +4,48 @@ class Behavior
|
|
4
4
|
|
5
5
|
attr_accessor :opts
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
# Specifies messages that your behavior is interested in and
|
8
|
+
# that you have defined methods for in your helpers block.
|
9
|
+
#
|
10
|
+
# reacts_with :remove
|
11
|
+
#
|
12
|
+
# helpers do
|
13
|
+
# def remove
|
14
|
+
# input_manager.unsubscribe_all self
|
15
|
+
# end
|
16
|
+
# end
|
15
17
|
def reacts_with(*messages_with_methods)
|
16
|
-
|
17
|
-
@message_handlers
|
18
|
+
@message_handlers ||= Set.new
|
19
|
+
@message_handlers.merge(messages_with_methods)
|
18
20
|
end
|
19
21
|
|
22
|
+
# Dispatches reactions to helper methods based on name.
|
23
|
+
# See BehaviorDefinition to see how to override this.
|
24
|
+
#
|
25
|
+
# @see BehaviorDefinition
|
26
|
+
# @see Actor#react_to
|
20
27
|
def react_to(message_type, *opts, &blk)
|
21
|
-
# TODO perf analysis, should I use a hash here?
|
22
28
|
if @message_handlers && @message_handlers.include?(message_type)
|
23
29
|
send message_type, *opts, &blk
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
33
|
+
# Builds and adds a behavior based on the name and options passed in.
|
34
|
+
#
|
35
|
+
# actor.input.when :shields_up do
|
36
|
+
# add_behavior :invincible, duration: actor.shield_charge
|
37
|
+
# end
|
38
|
+
#
|
27
39
|
def add_behavior(behavior_name, opts = {})
|
28
40
|
behavior_factory.add_behavior actor, behavior_name, opts
|
29
41
|
end
|
30
42
|
|
43
|
+
# Removes the behavior by name. Any added attributes will remain on the actor.
|
44
|
+
#
|
45
|
+
# actor.input.when :shields_down do
|
46
|
+
# remove_behavior :invincible
|
47
|
+
# end
|
48
|
+
#
|
31
49
|
def remove_behavior(behavior_name)
|
32
50
|
actor.remove_behavior(behavior_name)
|
33
51
|
end
|
@@ -1,23 +1,73 @@
|
|
1
1
|
class BehaviorDefinition
|
2
|
-
attr_accessor :setup_block, :required_injections, :react_to_block, :required_behaviors,
|
2
|
+
attr_accessor :setup_block, :remove_block, :required_injections, :react_to_block, :required_behaviors,
|
3
3
|
:helpers_block, :source
|
4
4
|
|
5
|
+
# Sets the dependencies for this Behavior.
|
6
|
+
#
|
7
|
+
# These will be pulled from the Actor's object context at view construction time.
|
8
|
+
#
|
9
|
+
# requires :input_manager, :timer_manager, :director
|
10
|
+
#
|
5
11
|
def requires(*injections_needed)
|
6
12
|
@required_injections = injections_needed
|
7
13
|
end
|
8
14
|
|
15
|
+
# Sets the behavior dependencies for this Behavior.
|
16
|
+
#
|
17
|
+
# Any behaviors listed here that are not on the actor will be constructed and added without any opts.
|
18
|
+
#
|
19
|
+
# requires_behaviors :positioned
|
20
|
+
#
|
9
21
|
def requires_behaviors(*behaviors_needed)
|
10
22
|
@required_behaviors = behaviors_needed
|
11
23
|
end
|
12
24
|
|
25
|
+
# Setup callback that is called when the behavior is added. The actor will
|
26
|
+
# be set before your setup block is executed, and the opts method will be available.
|
27
|
+
#
|
28
|
+
# setup do
|
29
|
+
# actor.has_attributes speed: opts[:speed]
|
30
|
+
# input_manager.when :down, KbSpace do
|
31
|
+
# jump
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
13
35
|
def setup(&setup_block)
|
14
36
|
@setup_block = setup_block
|
15
37
|
end
|
16
38
|
|
39
|
+
# Remove callback that is called when the behavior is removed. The actor will
|
40
|
+
# still be available.
|
41
|
+
#
|
42
|
+
# remove do
|
43
|
+
# input_manager.unsubscribe_all self
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
def remove(&remove_block)
|
47
|
+
@remove_block = remove_block
|
48
|
+
end
|
49
|
+
|
50
|
+
# Override the default react_to method of the behavior. You should probably not be doing this and should be calling #reacts_with in #setup.
|
51
|
+
#
|
52
|
+
# react_to do |message_type, *opts, &blk|
|
53
|
+
# case message_type
|
54
|
+
# when :blow_up
|
55
|
+
# ..
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# @see Behavior#reacts_with
|
17
59
|
def react_to(&react_to_block)
|
18
60
|
@react_to_block = react_to_block
|
19
61
|
end
|
20
62
|
|
63
|
+
# Define methods and include modules for use by your behavior.
|
64
|
+
# helpers do
|
65
|
+
# include MyHelper
|
66
|
+
# def jump
|
67
|
+
# ...
|
68
|
+
# end
|
69
|
+
# end
|
70
|
+
#
|
21
71
|
def helpers(&helpers_block)
|
22
72
|
@helpers_block = helpers_block
|
23
73
|
end
|
@@ -44,8 +44,15 @@ class BehaviorFactory
|
|
44
44
|
add_behavior actor, beh unless actor.has_behavior?(beh)
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
|
+
behavior.opts = opts
|
48
49
|
behavior.instance_eval &behavior_definition.setup_block if behavior_definition.setup_block
|
50
|
+
|
51
|
+
if behavior_definition.remove_block
|
52
|
+
behavior.define_singleton_method :remove, behavior_definition.remove_block
|
53
|
+
behavior.reacts_with :remove
|
54
|
+
end
|
55
|
+
|
49
56
|
actor.add_behavior behavior_name, behavior
|
50
57
|
end
|
51
58
|
end
|
data/lib/gamebox/core/core.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module Gamebox
|
2
|
+
include GameboxDSL
|
3
|
+
|
2
4
|
# Returns the global configuration object
|
3
5
|
def self.configuration
|
4
6
|
@configuration ||= Configuration.new
|
@@ -9,24 +11,6 @@ module Gamebox
|
|
9
11
|
yield configuration if block_given?
|
10
12
|
end
|
11
13
|
|
12
|
-
def define_stage(name, &blk)
|
13
|
-
Stage.define name, &blk
|
14
|
-
end
|
15
|
-
|
16
|
-
def define_behavior(name, &blk)
|
17
|
-
Behavior.define name, &blk
|
18
|
-
end
|
19
|
-
|
20
|
-
def define_actor(name, &blk)
|
21
|
-
Actor.define name, &blk
|
22
|
-
end
|
23
|
-
|
24
|
-
def define_actor_view(name, &blk)
|
25
|
-
ActorView.define name, &blk
|
26
|
-
end
|
27
|
-
|
28
|
-
# module_function :define_behavior, :define_actor, :define_actor_view
|
29
|
-
|
30
14
|
|
31
15
|
end
|
32
16
|
|
@@ -9,6 +9,8 @@ class Director
|
|
9
9
|
|
10
10
|
def clear_subscriptions
|
11
11
|
@subscriptions = Hash[@update_slots.map { |slot| [slot, []] }]
|
12
|
+
@new_subscriptions = []
|
13
|
+
@unsubscriptions = []
|
12
14
|
end
|
13
15
|
|
14
16
|
def pause
|
@@ -24,27 +26,36 @@ class Director
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def when(event=:update, &callback)
|
27
|
-
@
|
28
|
-
@subscriptions[event] << callback
|
29
|
+
@new_subscriptions << [event, callback]
|
29
30
|
end
|
30
31
|
|
31
32
|
def update(time)
|
33
|
+
@new_subscriptions.each do |(event, callback)|
|
34
|
+
@subscriptions[event] ||= []
|
35
|
+
@subscriptions[event] << callback
|
36
|
+
end
|
37
|
+
@new_subscriptions.clear
|
38
|
+
|
39
|
+
@unsubscriptions.each do |listener|
|
40
|
+
for slot in @subscriptions.keys
|
41
|
+
@subscriptions[slot].delete_if do |block|
|
42
|
+
eval('self',block.binding).equal?(listener)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
@unsubscriptions.clear
|
47
|
+
|
32
48
|
time_in_seconds = time / 1000.to_f
|
33
49
|
@update_slots.each do |slot|
|
34
50
|
@subscriptions[slot].each do |callback|
|
35
51
|
callback.call time, time_in_seconds
|
36
52
|
end
|
37
53
|
end
|
54
|
+
|
38
55
|
end
|
39
56
|
|
40
57
|
def unsubscribe_all(listener)
|
41
|
-
|
42
|
-
for slot in @subscriptions.keys
|
43
|
-
@subscriptions[slot].delete_if do |block|
|
44
|
-
eval('self',block.binding).equal?(listener)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
58
|
+
@unsubscriptions << listener
|
48
59
|
end
|
49
60
|
|
50
61
|
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module GameboxDSL
|
2
|
+
|
3
|
+
# Defines a stage; a stage is a game mode. (ie :main_menu, :play, or :credits)
|
4
|
+
#
|
5
|
+
# Raises an erorr if the stage already exists
|
6
|
+
#
|
7
|
+
# define_stage :main_menu do
|
8
|
+
# # injects your dependencies; will construct if needed
|
9
|
+
# requires :input_manager, :customer_monkey_factory
|
10
|
+
#
|
11
|
+
# # callback for stage setup
|
12
|
+
# curtain_up &block
|
13
|
+
#
|
14
|
+
# # callback for stage teardown
|
15
|
+
# curtain_down &block
|
16
|
+
#
|
17
|
+
# # redefine the renderer for this stage, Gamebox has a default Renderer
|
18
|
+
# # if unspecified
|
19
|
+
# render_with :my_custom_renderer
|
20
|
+
#
|
21
|
+
# # define any helper methods and include any needed modules
|
22
|
+
# helpers &block
|
23
|
+
#
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# @see StageDefinition
|
27
|
+
# @see Stage
|
28
|
+
def define_stage(name, &blk)
|
29
|
+
Stage.define name, &blk
|
30
|
+
end
|
31
|
+
|
32
|
+
# Defines a behavior type. (ie :jumper or :shooter)
|
33
|
+
#
|
34
|
+
# Raises an erorr if the behavior already exists
|
35
|
+
#
|
36
|
+
# define_behavior :jumper do
|
37
|
+
# # injects your dependencies; will construct if needed
|
38
|
+
# requires :input_manager, :timer_manager, :stage
|
39
|
+
#
|
40
|
+
# # adds the required behaviors to your actor if not present
|
41
|
+
# # NOTE: no options can be passed to the added behavior
|
42
|
+
# required_behaviors :positioned
|
43
|
+
#
|
44
|
+
# # callback when your behavior has been added to an actor
|
45
|
+
# # #opts will be populated with any args that were specified on behavior
|
46
|
+
# # addition
|
47
|
+
# setup &block
|
48
|
+
#
|
49
|
+
# # callback when your behavior has been removed from an actor
|
50
|
+
# remove &block
|
51
|
+
#
|
52
|
+
# # define a custom handler for reacting to your actor's messages
|
53
|
+
# # @see Behavior#reacts_with for recommended message dispatch
|
54
|
+
# react_to &block
|
55
|
+
#
|
56
|
+
# # define any helper methods and include any needed modules
|
57
|
+
# helpers &block
|
58
|
+
#
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# @see BehaviorDefinition
|
62
|
+
# @see Behavior
|
63
|
+
def define_behavior(name, &blk)
|
64
|
+
Behavior.define name, &blk
|
65
|
+
end
|
66
|
+
|
67
|
+
# Defines an actor type, (ie :plumber). Optionally adding attributes, behaviors and a view.
|
68
|
+
#
|
69
|
+
# Raises an erorr if the actor already exists
|
70
|
+
#
|
71
|
+
# define_actor :plumber do
|
72
|
+
# # define default attributes and values
|
73
|
+
# has_attribute(s) x: 7, y: 12
|
74
|
+
#
|
75
|
+
# # define default behaviors and their options options can be
|
76
|
+
# # - list of behavior names
|
77
|
+
# # - hash of behavior names to options for each behavior
|
78
|
+
# # - block form
|
79
|
+
# has_behavior :postitioned
|
80
|
+
# has_behaviors do
|
81
|
+
# jumper max: 12, double: true
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# # Allows the inlining of one behavior in this actor.
|
85
|
+
# # It is equivalent to creating a behavior with the same name as the actor,
|
86
|
+
# # and adding it to the actor.
|
87
|
+
# #
|
88
|
+
# # The block works the same as calling #define_behavior.
|
89
|
+
# behavior
|
90
|
+
#
|
91
|
+
# # Allows the inline of a view in this actor
|
92
|
+
# # It is equivalent to creating an actor view with the same name as the actor.
|
93
|
+
# #
|
94
|
+
# # The block works the same as calling #define_actor_view.
|
95
|
+
# view
|
96
|
+
#
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# @see ActorDefinition
|
100
|
+
# @see Actor
|
101
|
+
def define_actor(name, &blk)
|
102
|
+
Actor.define name, &blk
|
103
|
+
end
|
104
|
+
|
105
|
+
# Defines an actor view type. (ie :plumber_view).
|
106
|
+
# Constructed when any actor with matching name is created
|
107
|
+
# ie: :ship_view will be created and shown for any actor :ship that is created
|
108
|
+
#
|
109
|
+
# Raises an erorr if the actor view already exists
|
110
|
+
#
|
111
|
+
# define_actor :plumber_view do
|
112
|
+
# # injects your dependencies; will construct if needed
|
113
|
+
# requires :input_manager, :customer_monkey_factory
|
114
|
+
#
|
115
|
+
# # callback when your view is created
|
116
|
+
# # #actor will be available at this time
|
117
|
+
# setup &block
|
118
|
+
#
|
119
|
+
# # define any helper methods and include any needed modules
|
120
|
+
# helpers &block
|
121
|
+
#
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# @see ActorViewDefinition
|
125
|
+
# @see ActorView
|
126
|
+
def define_actor_view(name, &blk)
|
127
|
+
ActorView.define name, &blk
|
128
|
+
end
|
129
|
+
end
|
data/lib/gamebox/core/physics.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
class
|
1
|
+
class SpatialTree
|
2
2
|
extend Forwardable
|
3
3
|
def_delegators :@tree, :calculate_bb, :to_s, :each, :collisions, :query, :valid?
|
4
4
|
|
5
|
-
attr_reader :moved_items
|
5
|
+
attr_reader :moved_items, :stage
|
6
6
|
|
7
|
-
def
|
7
|
+
def initialize(stage)
|
8
|
+
@stage
|
8
9
|
@dead_actors = {}
|
9
10
|
@moved_items = {}
|
10
11
|
@tree = AABBTree.new
|
data/lib/gamebox/core/stage.rb
CHANGED
@@ -14,7 +14,6 @@ class Stage
|
|
14
14
|
def configure(backstage, opts)
|
15
15
|
viewport.reset
|
16
16
|
|
17
|
-
@stagehands = {}
|
18
17
|
@backstage = backstage
|
19
18
|
@opts = opts
|
20
19
|
renderer.clear_drawables
|
@@ -25,32 +24,6 @@ class Stage
|
|
25
24
|
end
|
26
25
|
alias :spawn :create_actor
|
27
26
|
|
28
|
-
# extract all the params from a node that are needed to construct an actor
|
29
|
-
def create_actors_from_svg svg_doc
|
30
|
-
float_keys = ["x","y"]
|
31
|
-
dynamic_actors ||= {}
|
32
|
-
layer = svg_doc.find_group_by_label("actors")
|
33
|
-
|
34
|
-
unless layer.nil?
|
35
|
-
# each image in the layer is an actor
|
36
|
-
layer.images.each do |actor_def|
|
37
|
-
klass = actor_def.game_class.to_sym
|
38
|
-
handle = actor_def.game_handle
|
39
|
-
new_opts = {}
|
40
|
-
actor_def.node.attributes.each do |k,v|
|
41
|
-
v = v.to_f if float_keys.include? k
|
42
|
-
new_opts[k.to_sym] = v
|
43
|
-
end
|
44
|
-
|
45
|
-
actor = create_actor klass, new_opts
|
46
|
-
dynamic_actors[handle.to_sym] = actor if handle
|
47
|
-
end
|
48
|
-
end
|
49
|
-
alias :spawn_from_svg :create_actors_from_svg
|
50
|
-
|
51
|
-
dynamic_actors
|
52
|
-
end
|
53
|
-
|
54
27
|
def draw(target)
|
55
28
|
renderer.draw target
|
56
29
|
end
|
@@ -58,9 +31,6 @@ class Stage
|
|
58
31
|
def update(time)
|
59
32
|
director.update time
|
60
33
|
viewport.update time
|
61
|
-
@stagehands.each do |name, stagehand|
|
62
|
-
stagehand.update time
|
63
|
-
end
|
64
34
|
find_collisions
|
65
35
|
timer_manager.update time
|
66
36
|
end
|
@@ -107,10 +77,6 @@ class Stage
|
|
107
77
|
@paused = true
|
108
78
|
end
|
109
79
|
|
110
|
-
def stagehand(stagehand_sym, opts={})
|
111
|
-
@stagehands[stagehand_sym] ||= create_stagehand(stagehand_sym, opts)
|
112
|
-
end
|
113
|
-
|
114
80
|
# pauses the current stage, creates an actor using args, unpauses on actor death
|
115
81
|
#
|
116
82
|
# Example:
|
@@ -129,11 +95,6 @@ class Stage
|
|
129
95
|
end
|
130
96
|
|
131
97
|
private
|
132
|
-
def create_stagehand(name, opts)
|
133
|
-
underscored_class = "#{name}_stagehand"
|
134
|
-
klass = ClassFinder.find underscored_class
|
135
|
-
klass.new self, opts
|
136
|
-
end
|
137
98
|
|
138
99
|
class << self
|
139
100
|
|
@@ -4,56 +4,57 @@ class StageDefinition
|
|
4
4
|
|
5
5
|
# Required objects that you need for your specific stage
|
6
6
|
# The objects will be created for you.
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# define_stage :main_menu do
|
9
|
-
#
|
9
|
+
# requires :magic_thinger
|
10
10
|
# end
|
11
11
|
def requires(*injections_needed)
|
12
|
-
# kid.construct_with *self.object_definition.component_names
|
13
12
|
@required_injections = injections_needed
|
14
13
|
end
|
15
14
|
|
16
15
|
# Define a block of code to run when your stage is and ready to play
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
16
|
+
#
|
17
|
+
# define_stage :main_menu do
|
18
|
+
# curtain_up do
|
19
|
+
# @info = load_some_info
|
20
|
+
# end
|
21
|
+
# end
|
23
22
|
def curtain_up(&curtain_up_block)
|
24
23
|
@curtain_up_block = curtain_up_block
|
25
24
|
end
|
26
25
|
|
27
26
|
# Define a block of code to run when your stage has been shutdown
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
27
|
+
#
|
28
|
+
# define_stage :main_menu do
|
29
|
+
# curtain_down do
|
30
|
+
# @info = load_some_info
|
31
|
+
# end
|
32
|
+
# end
|
34
33
|
def curtain_down(&curtain_down_block)
|
35
34
|
@curtain_down_block = curtain_down_block
|
36
35
|
end
|
37
36
|
|
38
37
|
# Replaces the default renderer with your own.
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
38
|
+
#
|
39
|
+
# define_stage :main_menu do
|
40
|
+
# render_with :my_render
|
41
|
+
# ...
|
42
|
+
# end
|
44
43
|
def render_with(render_class_name)
|
45
44
|
@renderer = render_class_name
|
46
45
|
end
|
47
46
|
|
48
47
|
# Define any helper methods / include modules here
|
49
48
|
# These will be available for curtain_up / update / draw to use.
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
49
|
+
#
|
50
|
+
# define_stage :main_menu do
|
51
|
+
# helpers do
|
52
|
+
# include MinMaxHelpers
|
53
|
+
# def calculate_thinger
|
54
|
+
# ...
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
# end
|
57
58
|
def helpers(&helpers_block)
|
58
59
|
@helpers_block = helpers_block
|
59
60
|
end
|
@@ -24,6 +24,17 @@ module ObservableAttributes
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
# Adds attributes that are not currently set.
|
28
|
+
# Takes a list of symbols or a hash of symbols => default values
|
29
|
+
#
|
30
|
+
# examples:
|
31
|
+
#
|
32
|
+
# foo.has_attributes :x, :y
|
33
|
+
# # adds x, x=, y, y= methods
|
34
|
+
# #fires events x_changed, y_changed when the values change
|
35
|
+
#
|
36
|
+
# foo.has_attributes x: 5, y: 3
|
37
|
+
# # this form provides default values if these are new attributes
|
27
38
|
def has_attributes(*names)
|
28
39
|
if names.first.is_a? Hash
|
29
40
|
names.first.each do |name, default|
|
@@ -36,6 +47,8 @@ module ObservableAttributes
|
|
36
47
|
end
|
37
48
|
end
|
38
49
|
|
50
|
+
# singular form of has_attributes
|
51
|
+
# takes the symbol name and an optional default value
|
39
52
|
def has_attribute(name, value=nil)
|
40
53
|
@evented_attributes ||= []
|
41
54
|
unless has_attribute? name
|
@@ -48,10 +61,12 @@ module ObservableAttributes
|
|
48
61
|
end
|
49
62
|
end
|
50
63
|
|
64
|
+
# Returns true if the passed in symbol is an attr on this object
|
51
65
|
def has_attribute?(name)
|
52
66
|
@evented_attributes && @evented_attributes.include?(name)
|
53
67
|
end
|
54
68
|
|
69
|
+
# Returns a new hash containing the attr keys and values
|
55
70
|
def attributes
|
56
71
|
{}.tap do |atts|
|
57
72
|
if @evented_attributes
|
data/lib/gamebox/lib/vector2.rb
CHANGED
@@ -193,6 +193,7 @@ class Vector2
|
|
193
193
|
# of error to compensate for floating point imprecision).
|
194
194
|
#
|
195
195
|
def ==( vector )
|
196
|
+
return false if vector.nil?
|
196
197
|
_nearly_equal?(@x, vector.at(0)) and _nearly_equal?(@y, vector.at(1))
|
197
198
|
end
|
198
199
|
|
@@ -201,23 +202,29 @@ class Vector2
|
|
201
202
|
# [x,y] Array.
|
202
203
|
#
|
203
204
|
def []( index )
|
204
|
-
|
205
|
+
case index
|
206
|
+
when 0
|
207
|
+
@x
|
208
|
+
when 1
|
209
|
+
@y
|
210
|
+
else
|
211
|
+
nil
|
212
|
+
end
|
205
213
|
end
|
206
214
|
|
207
215
|
alias :at :[]
|
208
216
|
|
209
217
|
|
210
218
|
def hash # :nodoc:
|
211
|
-
@hash ||=
|
212
|
-
((@y - @y.modulo(1E-10)).hash << 1) +
|
213
|
-
self.class.hash)
|
219
|
+
@hash ||= [@x, @y, self.class].hash
|
214
220
|
end
|
215
221
|
|
216
222
|
|
217
223
|
# Iterates over this vector as if it were an [x,y] Array.
|
218
224
|
#
|
219
|
-
def each
|
220
|
-
|
225
|
+
def each
|
226
|
+
yield @x
|
227
|
+
yield @y
|
221
228
|
end
|
222
229
|
|
223
230
|
|
data/lib/gamebox/spec/helper.rb
CHANGED
@@ -33,6 +33,7 @@ module GameboxSpecHelpers
|
|
33
33
|
@_req_mocks = create_mocks(*reqs)
|
34
34
|
}
|
35
35
|
let (:opts) { {} }
|
36
|
+
let (:actor) { @actor }
|
36
37
|
subject {
|
37
38
|
|
38
39
|
# TODO so much duplication here from the *Factories
|
@@ -61,7 +62,7 @@ module GameboxSpecHelpers
|
|
61
62
|
# _add_behavior actor, beh unless actor.has_behavior?(beh)
|
62
63
|
# end
|
63
64
|
# end
|
64
|
-
behavior.
|
65
|
+
behavior.opts = opts
|
65
66
|
behavior.instance_eval &@behavior_definition.setup_block if @behavior_definition.setup_block
|
66
67
|
end
|
67
68
|
}
|
data/lib/gamebox/version.rb
CHANGED
data/script/perf_aabb.rb
CHANGED
data/spec/actors/label_spec.rb
CHANGED
@@ -30,11 +30,11 @@ describe :label do
|
|
30
30
|
@font_style_factory.stubs(:build).with('fonty.ttf', 22, :red).returns(:stylish_font)
|
31
31
|
@actor.expects(:has_attributes).with(font_style: :stylish_font)
|
32
32
|
|
33
|
-
subject
|
33
|
+
subject
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'listens for text changes' do
|
37
|
-
subject
|
37
|
+
subject
|
38
38
|
@actor.stubs(text: "foo")
|
39
39
|
|
40
40
|
font_style = stub(height: 13)
|
@@ -48,7 +48,7 @@ describe :label do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'listens for font color changes' do
|
51
|
-
subject
|
51
|
+
subject
|
52
52
|
font_style = stub
|
53
53
|
font_style.expects(:color=).with(:red)
|
54
54
|
@actor.stubs(font_style: font_style, color: :red)
|
@@ -57,7 +57,7 @@ describe :label do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'listens for font name changes' do
|
60
|
-
subject
|
60
|
+
subject
|
61
61
|
@actor.stubs(text: "foo", font_name: "asimov.ttf")
|
62
62
|
|
63
63
|
font_style = stub(height: 13)
|
@@ -74,7 +74,7 @@ describe :label do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it 'listens for font size changes' do
|
77
|
-
subject
|
77
|
+
subject
|
78
78
|
@actor.stubs(text: "foo", font_size: 14)
|
79
79
|
|
80
80
|
font_style = stub(height: 13)
|
@@ -4,18 +4,18 @@ describe BehaviorFactory do
|
|
4
4
|
let(:some_behavior) { stub('some behavior', required_behaviors: []) }
|
5
5
|
let(:object_context) { mock('object context') }
|
6
6
|
let(:some_actor) { stub('some actor', add_behavior: nil, this_object_context: object_context) }
|
7
|
+
let(:some_block) { Proc.new }
|
7
8
|
|
8
9
|
before do
|
9
10
|
Behavior.define :shootable
|
10
|
-
|
11
11
|
object_context.stubs(:[]).with(:behavior).returns(some_behavior)
|
12
12
|
object_context.stubs(:in_subcontext).yields(object_context)
|
13
|
-
some_behavior.stubs(:
|
13
|
+
some_behavior.stubs(:opts=)
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#add_behavior" do
|
17
17
|
it 'creates the behavior based on the actor and symbol behavior_def' do
|
18
|
-
some_behavior.expects(:
|
18
|
+
some_behavior.expects(:opts=).with({})
|
19
19
|
|
20
20
|
subject.add_behavior some_actor, :shootable
|
21
21
|
end
|
@@ -27,7 +27,7 @@ describe BehaviorFactory do
|
|
27
27
|
|
28
28
|
it 'configures the behavior with the given opts' do
|
29
29
|
opts = {some: 'opts'}
|
30
|
-
some_behavior.expects(:
|
30
|
+
some_behavior.expects(:opts=).with(opts)
|
31
31
|
|
32
32
|
subject.add_behavior some_actor, :shootable, opts
|
33
33
|
end
|
data/spec/core/behavior_spec.rb
CHANGED
@@ -5,6 +5,9 @@ describe Behavior do
|
|
5
5
|
|
6
6
|
it 'should auto-require behaviors that it depends on'
|
7
7
|
it 'has default react_to impl'
|
8
|
+
describe "#reacts_with" do
|
9
|
+
it 'adds together reactions for multiple calls'
|
10
|
+
end
|
8
11
|
describe "#add_behavior" do
|
9
12
|
it 'uses the behavior factory to add the behavior to the actor'
|
10
13
|
end
|
data/spec/core/stage_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gamebox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: gosu
|
@@ -401,6 +401,7 @@ files:
|
|
401
401
|
- lib/gamebox/core/font_style.rb
|
402
402
|
- lib/gamebox/core/font_style_factory.rb
|
403
403
|
- lib/gamebox/core/game.rb
|
404
|
+
- lib/gamebox/core/gamebox_dsl.rb
|
404
405
|
- lib/gamebox/core/hooked_gosu_window.rb
|
405
406
|
- lib/gamebox/core/input_manager.rb
|
406
407
|
- lib/gamebox/core/input_mapper.rb
|
@@ -409,16 +410,15 @@ files:
|
|
409
410
|
- lib/gamebox/core/renderer.rb
|
410
411
|
- lib/gamebox/core/resource_manager.rb
|
411
412
|
- lib/gamebox/core/sound_manager.rb
|
413
|
+
- lib/gamebox/core/spatial_tree.rb
|
412
414
|
- lib/gamebox/core/stage.rb
|
413
415
|
- lib/gamebox/core/stage_definition.rb
|
414
416
|
- lib/gamebox/core/stage_factory.rb
|
415
417
|
- lib/gamebox/core/stage_manager.rb
|
416
|
-
- lib/gamebox/core/stagehand.rb
|
417
418
|
- lib/gamebox/core/svg_document.rb
|
418
419
|
- lib/gamebox/core/timer_manager.rb
|
419
420
|
- lib/gamebox/core/viewport.rb
|
420
421
|
- lib/gamebox/core/wrapped_screen.rb
|
421
|
-
- lib/gamebox/data/config/objects.yml
|
422
422
|
- lib/gamebox/data/fonts/Asimov.ttf
|
423
423
|
- lib/gamebox/data/fonts/GAMEBOX_FONTS_GO_HERE
|
424
424
|
- lib/gamebox/data/graphics/GAMEBOX_GRAPHICS_GO_HERE
|
@@ -448,7 +448,6 @@ files:
|
|
448
448
|
- lib/gamebox/post_setup_handlers/gamebox_debug_helpers.rb
|
449
449
|
- lib/gamebox/post_setup_handlers/pry_remote_server.rb
|
450
450
|
- lib/gamebox/spec/helper.rb
|
451
|
-
- lib/gamebox/stagehands/spatial_tree_stagehand.rb
|
452
451
|
- lib/gamebox/tasks/gamebox_tasks.rake
|
453
452
|
- lib/gamebox/version.rb
|
454
453
|
- lib/gamebox/views/graphical_actor_view.rb
|
@@ -491,6 +490,7 @@ files:
|
|
491
490
|
- spec/core/physics_manager_spec.rb
|
492
491
|
- spec/core/renderer_spec.rb
|
493
492
|
- spec/core/resource_manager_spec.rb
|
493
|
+
- spec/core/spatial_tree_spec.rb
|
494
494
|
- spec/core/stage_definition_spec.rb
|
495
495
|
- spec/core/stage_manager_spec.rb
|
496
496
|
- spec/core/stage_spec.rb
|
@@ -504,7 +504,6 @@ files:
|
|
504
504
|
- spec/fixtures/snelpling/jump/3.png
|
505
505
|
- spec/helper.rb
|
506
506
|
- spec/lib/class_finder_spec.rb
|
507
|
-
- spec/stagehands/spatial_tree_stagehand_spec.rb
|
508
507
|
- spec/views/graphical_actor_view_spec.rb
|
509
508
|
- templates/actor_template.erb
|
510
509
|
- templates/app/.gitignore
|
@@ -539,7 +538,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
539
538
|
version: '0'
|
540
539
|
segments:
|
541
540
|
- 0
|
542
|
-
hash:
|
541
|
+
hash: 3939132703427340795
|
543
542
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
544
543
|
none: false
|
545
544
|
requirements:
|
@@ -548,7 +547,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
548
547
|
version: '0'
|
549
548
|
segments:
|
550
549
|
- 0
|
551
|
-
hash:
|
550
|
+
hash: 3939132703427340795
|
552
551
|
requirements: []
|
553
552
|
rubyforge_project: gamebox
|
554
553
|
rubygems_version: 1.8.25
|
@@ -589,6 +588,7 @@ test_files:
|
|
589
588
|
- spec/core/physics_manager_spec.rb
|
590
589
|
- spec/core/renderer_spec.rb
|
591
590
|
- spec/core/resource_manager_spec.rb
|
591
|
+
- spec/core/spatial_tree_spec.rb
|
592
592
|
- spec/core/stage_definition_spec.rb
|
593
593
|
- spec/core/stage_manager_spec.rb
|
594
594
|
- spec/core/stage_spec.rb
|
@@ -602,5 +602,4 @@ test_files:
|
|
602
602
|
- spec/fixtures/snelpling/jump/3.png
|
603
603
|
- spec/helper.rb
|
604
604
|
- spec/lib/class_finder_spec.rb
|
605
|
-
- spec/stagehands/spatial_tree_stagehand_spec.rb
|
606
605
|
- spec/views/graphical_actor_view_spec.rb
|
@@ -1,39 +0,0 @@
|
|
1
|
-
game:
|
2
|
-
compose:
|
3
|
-
- wrapped_screen
|
4
|
-
- input_manager
|
5
|
-
- sound_manager
|
6
|
-
- stage_manager
|
7
|
-
resource_manager:
|
8
|
-
auto_require: false
|
9
|
-
compose:
|
10
|
-
- wrapped_screen
|
11
|
-
stage_manager:
|
12
|
-
auto_require: false
|
13
|
-
compose:
|
14
|
-
- input_manager
|
15
|
-
- resource_manager
|
16
|
-
- sound_manager
|
17
|
-
- config_manager
|
18
|
-
- actor_factory
|
19
|
-
sound_manager:
|
20
|
-
auto_require: false
|
21
|
-
compose:
|
22
|
-
- resource_manager
|
23
|
-
- config_manager
|
24
|
-
input_manager:
|
25
|
-
auto_require: false
|
26
|
-
compose:
|
27
|
-
- wrapped_screen
|
28
|
-
- config_manager
|
29
|
-
wrapped_screen:
|
30
|
-
auto_require: false
|
31
|
-
compose:
|
32
|
-
- config_manager
|
33
|
-
config_manager:
|
34
|
-
auto_require: false
|
35
|
-
actor_factory:
|
36
|
-
auto_require: false
|
37
|
-
compose:
|
38
|
-
- input_manager
|
39
|
-
- wrapped_screen
|