shattered 0.5.0.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/INSTALL.txt +5 -0
- data/License.txt +18 -0
- data/Manifest.txt +175 -0
- data/README.txt +39 -0
- data/Rakefile +6 -0
- data/app_generators/actor/USAGE +6 -0
- data/app_generators/actor/actor_generator.rb +51 -0
- data/app_generators/actor/templates/actor.rb +4 -0
- data/app_generators/actor/templates/spec.rb +11 -0
- data/app_generators/actor/templates/unit_test.rb +9 -0
- data/app_generators/commands/console.rb +6 -0
- data/{lib/rails_generator/generators/applications/shattered_app → app_generators/shattered}/USAGE +1 -1
- data/app_generators/shattered/shattered_generator.rb +67 -0
- data/{lib → app_generators/shattered}/templates/Rakefile +4 -4
- data/app_generators/shattered/templates/configs/game.controls +16 -0
- data/app_generators/shattered/templates/configs/ogre_plugins.linux.cfg +12 -0
- data/app_generators/shattered/templates/configs/ogre_plugins.osx.cfg +12 -0
- data/{lib → app_generators/shattered}/templates/configs/ogre_plugins.windows.cfg +2 -2
- data/app_generators/shattered/templates/game.rb +50 -0
- data/{lib → app_generators/shattered}/templates/media/basic.rmaterial +0 -0
- data/app_generators/shattered/templates/spec/game_spec.rb +5 -0
- data/app_generators/shattered/templates/spec/spec_helper.rb +12 -0
- data/bin/shattered +39 -0
- data/config/hoe.rb +77 -0
- data/config/requirements.rb +15 -0
- data/lib/shattered.rb +40 -0
- data/lib/shattered_game/actor.rb +6 -0
- data/lib/shattered_game/game.rb +285 -0
- data/lib/{tasks → shattered_game/rake_tasks}/framework.rake +19 -24
- data/lib/{tasks → shattered_game/rake_tasks}/log.rake +0 -0
- data/lib/{tasks → shattered_game/rake_tasks}/misc.rake +1 -2
- data/lib/{tasks → shattered_game/rake_tasks}/pre_namespace_aliases.rake +0 -0
- data/lib/{tasks → shattered_game/rake_tasks}/shattered.rb +0 -0
- data/lib/shattered_game/rake_tasks/spec.rake +9 -0
- data/lib/{tasks → shattered_game/rake_tasks}/statistics.rake +0 -0
- data/lib/shattered_game/required.rb +2 -0
- data/lib/shattered_game/version.rb +9 -0
- data/lib/shattered_model/controls.rb +67 -0
- data/lib/shattered_model/input.rb +171 -0
- data/lib/shattered_model/key_converter.rb +44 -0
- data/lib/shattered_model/required.rb +4 -0
- data/lib/shattered_model/shattered_model.rb +28 -0
- data/lib/shattered_model/timed_event.rb +120 -0
- data/lib/shattered_model/timer.rb +78 -0
- data/lib/shattered_support/core_ext.rb +1 -0
- data/lib/shattered_support/core_ext/class.rb +3 -0
- data/lib/shattered_support/core_ext/class/attribute_accessors.rb +44 -0
- data/lib/shattered_support/core_ext/class/inheritable_attributes.rb +115 -0
- data/lib/shattered_support/core_ext/class/removal.rb +24 -0
- data/lib/shattered_support/core_ext/dir.rb +5 -0
- data/lib/shattered_support/core_ext/dir/search.rb +25 -0
- data/lib/shattered_support/core_ext/file.rb +5 -0
- data/lib/shattered_support/core_ext/file/search.rb +64 -0
- data/lib/shattered_support/core_ext/numeric.rb +5 -0
- data/lib/shattered_support/core_ext/numeric/time.rb +72 -0
- data/lib/shattered_support/core_ext/string.rb +13 -0
- data/lib/shattered_support/core_ext/string/access.rb +58 -0
- data/lib/shattered_support/core_ext/string/conversions.rb +19 -0
- data/lib/shattered_support/core_ext/string/inflections.rb +64 -0
- data/lib/shattered_support/core_ext/string/iterators.rb +17 -0
- data/lib/shattered_support/core_ext/string/starts_ends_with.rb +20 -0
- data/lib/shattered_support/error.rb +12 -0
- data/lib/shattered_support/inflections.rb +53 -0
- data/lib/shattered_support/inflector.rb +178 -0
- data/lib/shattered_support/pre_initialize.rb +153 -0
- data/lib/shattered_support/required.rb +9 -0
- data/lib/shattered_support/unload.rb +18 -0
- data/lib/shattered_view/camera.rb +7 -0
- data/lib/shattered_view/ogrerb/base.rb +28 -0
- data/lib/shattered_view/ogrerb/camera.rb +14 -0
- data/lib/shattered_view/ogrerb/key_manager.rb +54 -0
- data/lib/shattered_view/ogrerb/light.rb +25 -0
- data/lib/shattered_view/ogrerb/material.rb +5 -0
- data/lib/shattered_view/ogrerb/mesh_instance.rb +85 -0
- data/lib/shattered_view/ogrerb/mouse_manager.rb +109 -0
- data/lib/shattered_view/ogrerb/particle_system.rb +24 -0
- data/lib/shattered_view/ogrerb/rgb.rb +6 -0
- data/lib/shattered_view/ogrerb/rmaterial.rb +87 -0
- data/lib/shattered_view/ogrerb/scene_node.rb +76 -0
- data/lib/shattered_view/ogrerb/vector.rb +243 -0
- data/lib/shattered_view/ogrerb/window_event.rb +14 -0
- data/lib/shattered_view/resources.rb +64 -0
- data/lib/shattered_view/shattered_view.rb +248 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +30 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rcov.rake +7 -0
- data/tasks/testing.rake +46 -0
- data/tasks/website.rake +15 -0
- data/test/acceptance/Rakefile +10 -0
- data/test/acceptance/config/game.controls +17 -0
- data/test/acceptance/config/ogre_plugins.linux.cfg +12 -0
- data/test/acceptance/config/ogre_plugins.osx.cfg +12 -0
- data/test/acceptance/config/ogre_plugins.windows.cfg +14 -0
- data/test/acceptance/config/ogrerb_defaults.save +8 -0
- data/test/acceptance/game.rb +120 -0
- data/test/acceptance/lib/acceptance_test.rb +20 -0
- data/test/acceptance/lib/console.rb +54 -0
- data/test/acceptance/lib/input_test.rb +8 -0
- data/test/acceptance/lib/label.rb +30 -0
- data/test/acceptance/lib/light_test.rb +60 -0
- data/test/acceptance/lib/mesh_test.rb +69 -0
- data/test/acceptance/lib/particle_test.rb +9 -0
- data/test/acceptance/media/GreenSkin.jpg +0 -0
- data/test/acceptance/media/Ogre.material +86 -0
- data/test/acceptance/media/WeirdEye.png +0 -0
- data/test/acceptance/media/basic.rmaterial +18 -0
- data/test/acceptance/media/console.fontdef +7 -0
- data/test/acceptance/media/console.material +13 -0
- data/test/acceptance/media/console.png +0 -0
- data/test/acceptance/media/console.ttf +0 -0
- data/test/acceptance/media/dirt01.png +0 -0
- data/test/acceptance/media/fountain.material +19 -0
- data/test/acceptance/media/fountain.particle +40 -0
- data/test/acceptance/media/fountain.png +0 -0
- data/test/acceptance/media/fountaincolors.png +0 -0
- data/test/acceptance/media/ogre.mesh +0 -0
- data/test/acceptance/media/spheremap.png +0 -0
- data/test/acceptance/media/win.png +0 -0
- data/test/acceptance/spec/spec_helper.rb +7 -0
- data/test/integration/actor_generator_test.rb +43 -0
- data/test/integration/shattered_generator_test.rb +43 -0
- data/test/integration/test_helper.rb +20 -0
- data/test/ogre_test_defaults.save +8 -0
- data/test/ogre_test_plugins.linux.cfg +12 -0
- data/test/ogre_test_plugins.osx.cfg +12 -0
- data/test/ogre_test_plugins.windows.cfg +14 -0
- data/test/test_helper.rb +109 -0
- data/test/unit/shattered_game/actor_test.rb +9 -0
- data/test/unit/shattered_game/game_test.rb +49 -0
- data/test/unit/shattered_game/runner_test.rb +56 -0
- data/test/unit/shattered_model/controls/mouse.controls +4 -0
- data/test/unit/shattered_model/controls/player.controls +4 -0
- data/test/unit/shattered_model/controls/too_many_delims.controls +1 -0
- data/test/unit/shattered_model/key_controls_test.rb +89 -0
- data/test/unit/shattered_model/key_converter_test.rb +37 -0
- data/test/unit/shattered_model/keyboard_input_test.rb +32 -0
- data/test/unit/shattered_model/mouse_controls_test.rb +50 -0
- data/test/unit/shattered_model/mouse_input_test.rb +61 -0
- data/test/unit/shattered_model/shattered_model_test.rb +117 -0
- data/test/unit/shattered_model/timed_event_test.rb +79 -0
- data/test/unit/shattered_model/timer_test.rb +325 -0
- data/{lib/rails_generator/generators/components/actor/templates/actor.rb → test/unit/shattered_support/directory_test/file.test} +0 -0
- data/test/unit/shattered_support/numeric_ext_test.rb +38 -0
- data/test/unit/shattered_support/pre_initialize_test.rb +63 -0
- data/test/unit/shattered_support/shattered_support_test.rb +39 -0
- data/test/unit/shattered_support/unload_test.rb +17 -0
- data/test/unit/shattered_view/light_test.rb +38 -0
- data/test/unit/shattered_view/material_test.rb +41 -0
- data/test/unit/shattered_view/media_test/basic.rmaterial +18 -0
- data/{lib/templates/configs/empty.log → test/unit/shattered_view/media_test/beltch.ogg} +0 -0
- data/test/unit/shattered_view/media_test/test.mesh +0 -0
- data/test/unit/shattered_view/mesh_test.rb +59 -0
- data/test/unit/shattered_view/node_test.rb +11 -0
- data/test/unit/shattered_view/ogrerb/camera_test.rb +12 -0
- data/test/unit/shattered_view/ogrerb/key_manager_test.rb +42 -0
- data/test/unit/shattered_view/ogrerb/media/basic.rmaterial +18 -0
- data/test/unit/shattered_view/ogrerb/media/test.mesh +0 -0
- data/test/unit/shattered_view/ogrerb/media/test.rmaterial +1 -0
- data/test/unit/shattered_view/ogrerb/mesh_instance_test.rb +74 -0
- data/test/unit/shattered_view/ogrerb/mouse_manager_test.rb +104 -0
- data/test/unit/shattered_view/ogrerb/ogrerb.log +51 -0
- data/test/unit/shattered_view/ogrerb/resolve_ogrerb_test.rb +13 -0
- data/test/unit/shattered_view/ogrerb/rgb_test.rb +10 -0
- data/test/unit/shattered_view/ogrerb/rmaterial_test.rb +28 -0
- data/test/unit/shattered_view/ogrerb/scene_type_test.rb +12 -0
- data/test/unit/shattered_view/ogrerb/vector_test.rb +206 -0
- data/test/unit/shattered_view/particle_test.rb +23 -0
- data/test/unit/shattered_view/resources_test.rb +45 -0
- data/test/unit/shattered_view/test_helper.rb +1 -0
- data/test/unit/shattered_view/window_event_test.rb +19 -0
- data/test/unit/test_helper.rb +1 -0
- metadata +205 -121
- data/bin/console +0 -4
- data/bin/destroy +0 -9
- data/bin/generate +0 -7
- data/bin/runner +0 -9
- data/bin/shatter +0 -22
- data/lib/commands/console.rb +0 -23
- data/lib/game_loader.rb +0 -118
- data/lib/rails_generator.rb +0 -43
- data/lib/rails_generator/base.rb +0 -203
- data/lib/rails_generator/commands.rb +0 -519
- data/lib/rails_generator/generators/applications/shattered_app/shattered_app_generator.rb +0 -103
- data/lib/rails_generator/generators/components/actor/actor_generator.rb +0 -22
- data/lib/rails_generator/generators/components/model/USAGE +0 -17
- data/lib/rails_generator/generators/components/model/model_generator.rb +0 -22
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -5
- data/lib/rails_generator/generators/components/model/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -11
- data/lib/rails_generator/generators/components/state/USAGE +0 -30
- data/lib/rails_generator/generators/components/state/state_generator.rb +0 -19
- data/lib/rails_generator/generators/components/state/templates/state.rb +0 -20
- data/lib/rails_generator/generators/components/view/USAGE +0 -30
- data/lib/rails_generator/generators/components/view/templates/material +0 -4
- data/lib/rails_generator/generators/components/view/templates/view.rb +0 -7
- data/lib/rails_generator/generators/components/view/view_generator.rb +0 -28
- data/lib/rails_generator/lookup.rb +0 -209
- data/lib/rails_generator/manifest.rb +0 -53
- data/lib/rails_generator/options.rb +0 -143
- data/lib/rails_generator/scripts.rb +0 -83
- data/lib/rails_generator/scripts/destroy.rb +0 -7
- data/lib/rails_generator/scripts/generate.rb +0 -7
- data/lib/rails_generator/scripts/update.rb +0 -12
- data/lib/rails_generator/simple_logger.rb +0 -46
- data/lib/rails_generator/spec.rb +0 -44
- data/lib/shatter.rb +0 -7
- data/lib/tasks/documentation.rake +0 -46
- data/lib/tasks/testing.rake +0 -102
- data/lib/templates/MIT-LICENSE +0 -20
- data/lib/templates/README +0 -35
- data/lib/templates/configs/boot.rb +0 -35
- data/lib/templates/configs/ogre.cfg +0 -4
- data/lib/templates/configs/runner.rb +0 -5
- data/lib/templates/doc/README_FOR_APP +0 -2
- data/lib/templates/environments/environment.rb +0 -10
- data/lib/templates/media/default.mesh +0 -0
- data/lib/templates/media/default.png +0 -0
- data/lib/templates/media/offset_map.rmaterial +0 -117
- data/lib/templates/test/test_helper.rb +0 -5
@@ -1,43 +1,38 @@
|
|
1
1
|
namespace :shattered do
|
2
2
|
namespace :freeze do
|
3
|
-
desc "Lock this application to the current gems (by unpacking them into vendor/
|
3
|
+
desc "Lock this application to the current gems (by unpacking them into vendor/Shattered)"
|
4
4
|
task :gems do
|
5
|
-
deps = %w(shatter shattered_pack shattered_ogre)
|
6
5
|
require 'rubygems'
|
7
6
|
Gem.manage_gems
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
unless shattered
|
16
|
-
puts "No rails gem #{version} is installed. Do 'gem list rails' to see what you have available."
|
7
|
+
|
8
|
+
version = ENV['VERSION'] || Gem.cache.search('shattered').sort_by { |g| g.version }[-1].version
|
9
|
+
|
10
|
+
gems = Gem.cache.search('shattered', "= #{version}")
|
11
|
+
|
12
|
+
if gems.length == 0
|
13
|
+
puts "No shattered gem #{version} is installed. Do 'gem list shattered' to see what you have available."
|
17
14
|
exit
|
18
15
|
end
|
19
|
-
|
20
|
-
puts "Freezing to the gems for
|
16
|
+
|
17
|
+
puts "Freezing to the gems for shattered #{gems[0].version}"
|
21
18
|
rm_rf "vendor/shattered"
|
22
19
|
mkdir_p "vendor/shattered"
|
23
20
|
|
24
21
|
chdir("vendor/shattered") do
|
25
|
-
|
26
|
-
|
22
|
+
gems.reverse.each do |g|
|
23
|
+
puts g.name
|
24
|
+
Gem::GemRunner.new.run(["unpack", "-v", "#{g.version}", "#{g.name}"])
|
27
25
|
mv(Dir.glob("#{g.name}*").first, g.name)
|
28
26
|
end
|
29
|
-
|
30
|
-
Gem::GemRunner.new.run(["unpack", "-v", "=#{version}", "rails"])
|
31
|
-
FileUtils.mv(Dir.glob("rails*").first, "railties")
|
27
|
+
mv(Dir.glob("shattered_ruby").first, "shatter")
|
32
28
|
end
|
33
|
-
end
|
34
|
-
|
29
|
+
end
|
35
30
|
desc "Lock to latest Shattered Edge or a specific revision with REVISION=X (ex: REVISION=4021) or a tag with TAG=Y (ex: TAG=rel_1-1-0)"
|
36
31
|
task :edge do
|
37
32
|
$verbose = false
|
38
33
|
`svn --version` rescue nil
|
39
34
|
unless !$?.nil? && $?.success?
|
40
|
-
$stderr.puts "ERROR: Must have subversion (svn) available in the PATH to lock this application to Edge
|
35
|
+
$stderr.puts "ERROR: Must have subversion (svn) available in the PATH to lock this application to Edge Shattered"
|
41
36
|
exit 1
|
42
37
|
end
|
43
38
|
|
@@ -60,8 +55,8 @@ namespace :shattered do
|
|
60
55
|
touch "vendor/shattered/REVISION_#{ENV['REVISION']}"
|
61
56
|
end
|
62
57
|
|
63
|
-
for framework in %w(
|
64
|
-
system "svn export #{shattered_svn}/#{framework} vendor/shattered/#{framework}" + (ENV['REVISION'] ? " -r #{ENV['REVISION']}" : "")
|
58
|
+
for framework in %w( shatter shattered_pack shattered_support shattered_ogrerb )
|
59
|
+
system "svn export #{shattered_svn}/trunk/#{framework} vendor/shattered/#{framework}" + (ENV['REVISION'] ? " -r #{ENV['REVISION']}" : "")
|
65
60
|
end
|
66
61
|
end
|
67
62
|
end
|
@@ -75,7 +70,7 @@ namespace :shattered do
|
|
75
70
|
task :update => [ "update:scripts", "update:javascripts", "update:configs" ]
|
76
71
|
|
77
72
|
namespace :update do
|
78
|
-
desc "Update boot/config.rb from your current
|
73
|
+
desc "Update boot/config.rb from your current Shattered install"
|
79
74
|
task :configs do
|
80
75
|
require 'railties_path'
|
81
76
|
FileUtils.cp(RAILTIES_PATH + '/environments/boot.rb', SHATTERED_ROOT + '/config/boot.rb')
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Shattered
|
2
|
+
module Input
|
3
|
+
class ControlsParseError < StandardError; end
|
4
|
+
class FileNotFoundError < StandardError; end
|
5
|
+
|
6
|
+
#Handles parsing and mapping of controls
|
7
|
+
class Controls
|
8
|
+
attr_accessor :actions, :file
|
9
|
+
|
10
|
+
#Constructor
|
11
|
+
def initialize(file)
|
12
|
+
@file = file
|
13
|
+
end
|
14
|
+
|
15
|
+
#setter for path, which is static
|
16
|
+
def path=(newpath)
|
17
|
+
@@path = newpath
|
18
|
+
end
|
19
|
+
|
20
|
+
#getter for path, which is static
|
21
|
+
def path
|
22
|
+
@@path ||= File.join(SHATTERED_ROOT,"config")
|
23
|
+
end
|
24
|
+
|
25
|
+
#parses the file and sets the action map
|
26
|
+
def parse
|
27
|
+
fullpath = File.join(path, @file)
|
28
|
+
fullpath+= ".controls" unless (File.exists? fullpath) || file.ends_with(".controls")
|
29
|
+
file = File.open(fullpath, "r")
|
30
|
+
|
31
|
+
@actions = {}
|
32
|
+
file.readlines.each_with_index do |line, line_number|
|
33
|
+
line = (line.split("#"))[0] #comments
|
34
|
+
next if line.strip.length == 0 #blank lines
|
35
|
+
|
36
|
+
action_details = line.split("=>").collect {|x| x.strip}
|
37
|
+
if(action_details.length == 2)
|
38
|
+
action, condition = action_details
|
39
|
+
elsif(action_details.length > 2)
|
40
|
+
raise ControlsParseError.new("Error loading '#{line}' in #{fullpath}:#{line_number+1}. Too many =>'s.")
|
41
|
+
elsif(action_details.length < 2)
|
42
|
+
raise ControlsParseError.new("Problem parsing '#{line}' in #{fullpath}:#{line_number+1}. Badly formed keymap.")
|
43
|
+
end
|
44
|
+
@actions[condition] = action
|
45
|
+
end
|
46
|
+
file.close
|
47
|
+
end
|
48
|
+
|
49
|
+
# returns true if the controls are on, false otherwise
|
50
|
+
def active?
|
51
|
+
@active ||= false
|
52
|
+
end
|
53
|
+
|
54
|
+
# turns the controls on
|
55
|
+
def on
|
56
|
+
parse if @actions.nil?
|
57
|
+
@active = true
|
58
|
+
end
|
59
|
+
|
60
|
+
# turns the controls off
|
61
|
+
def off
|
62
|
+
@active = false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
@@ -0,0 +1,171 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'key_converter'
|
5
|
+
require 'controls'
|
6
|
+
|
7
|
+
|
8
|
+
class Symbol
|
9
|
+
def to_mouse_id
|
10
|
+
if self == :left
|
11
|
+
return 0
|
12
|
+
elsif self == :right
|
13
|
+
return 1
|
14
|
+
elsif self == :middle
|
15
|
+
return 2
|
16
|
+
end
|
17
|
+
raise Exception.new("Could not convert symbol #{self} to mouse button")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module Shattered
|
22
|
+
module Input #:nodoc:
|
23
|
+
def self.append_features(base)
|
24
|
+
super
|
25
|
+
base.extend(ClassMethods)
|
26
|
+
base.send(:include, InstanceMethods)
|
27
|
+
base.send(:include, PreInitialize)
|
28
|
+
end
|
29
|
+
module ClassMethods
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module InstanceMethods
|
34
|
+
|
35
|
+
# Example Usage:
|
36
|
+
# game.rb:
|
37
|
+
#
|
38
|
+
# class Game < Shattered::Game
|
39
|
+
# def initialize
|
40
|
+
# ...
|
41
|
+
# player = Player.new # Where player includes Shattered::Model
|
42
|
+
# player.controls.on # this is the same as 'player.controls("player.controls").on'
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# player.controls:
|
47
|
+
# # command => condition
|
48
|
+
# levitate => hold :a
|
49
|
+
#
|
50
|
+
# # Note that both the command and the condition are instance_eval'ed
|
51
|
+
#
|
52
|
+
# You can turn off an actor's controls by calling:
|
53
|
+
# player.controls.off
|
54
|
+
#
|
55
|
+
# Controls default as off.
|
56
|
+
#
|
57
|
+
# Note 1: Controls are only expected to be 'method => action' pairs, they are not meant
|
58
|
+
# logic at all, even though they can.
|
59
|
+
#
|
60
|
+
# Note 2: Controls are meant to be user edittable - a user interface for defining keys.
|
61
|
+
def controls(*args)
|
62
|
+
file = args[0]
|
63
|
+
if(file.nil? && @controls.nil?)
|
64
|
+
file = self.class.to_s.underscore
|
65
|
+
end
|
66
|
+
|
67
|
+
@controls = Controls.new(file) if @controls.nil?
|
68
|
+
@controls = Controls.new(file) if !file.nil? && (file != @controls.file)
|
69
|
+
|
70
|
+
return @controls
|
71
|
+
end
|
72
|
+
|
73
|
+
# update_input takes the input object, and sends the actor every key event this frame.
|
74
|
+
def update_input #:nodoc:
|
75
|
+
if !@controls.nil? && @controls.active?
|
76
|
+
@controls.actions.each do |condition, action|
|
77
|
+
if(keyboard_listener.instance_eval(condition))
|
78
|
+
instance_eval(action)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Retrieve the game's keyboard singleton
|
85
|
+
def keyboard_listener
|
86
|
+
Game.instance.keyboard_listener
|
87
|
+
end
|
88
|
+
|
89
|
+
# Simulate a key press, release or hold event
|
90
|
+
def key_event(params = {})
|
91
|
+
lookup_reaction, keys = reaction_from(params)
|
92
|
+
lookup_key = keys[0]
|
93
|
+
key_actions.each do |reaction, key, action, params|
|
94
|
+
key_action(reaction, action, 0, params) if key == lookup_key && lookup_reaction == reaction
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# This is a wrapper around OIS's mouse object.
|
100
|
+
# It will allow us to query the mouse for presses, releases, and holds.
|
101
|
+
class Mouse #:nodoc:
|
102
|
+
def initialize( ois_mouse )
|
103
|
+
@ois_mouse = ois_mouse
|
104
|
+
end
|
105
|
+
|
106
|
+
def press( mouse_button )
|
107
|
+
@ois_mouse.pressed? value_of(mouse_button)
|
108
|
+
end
|
109
|
+
|
110
|
+
def release( mouse_button )
|
111
|
+
@ois_mouse.released? value_of(mouse_button)
|
112
|
+
end
|
113
|
+
|
114
|
+
def hold( mouse_button )
|
115
|
+
@ois_mouse.held? value_of(mouse_button)
|
116
|
+
end
|
117
|
+
|
118
|
+
def move
|
119
|
+
return true if((@ois_mouse.x != 0) || (@ois_mouse.y != 0))
|
120
|
+
return false
|
121
|
+
end
|
122
|
+
|
123
|
+
def scroll
|
124
|
+
return true if(@ois_mouse.scrolled != 0)
|
125
|
+
return false
|
126
|
+
end
|
127
|
+
|
128
|
+
def value_of(mouse_button)
|
129
|
+
return mouse_button if mouse_button.is_a? Fixnum
|
130
|
+
return mouse_button.to_mouse_id
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# This is a wrapper around Ogre's input listener.
|
135
|
+
# It allows us to query the status of each device every frame.
|
136
|
+
class Keyboard #:nodoc:
|
137
|
+
|
138
|
+
def initialize( keyboard, mouse )
|
139
|
+
@ogre_input = keyboard
|
140
|
+
@mouse = Mouse.new mouse
|
141
|
+
end
|
142
|
+
|
143
|
+
def hold( key_symbol )
|
144
|
+
@ogre_input.key_held?(Converter.convert(key_symbol))
|
145
|
+
end
|
146
|
+
|
147
|
+
def press( key_symbol )
|
148
|
+
pressed = @ogre_input.key_pressed?(Converter.convert(key_symbol))
|
149
|
+
if(pressed)
|
150
|
+
Game.instance.log.debug("#{key_symbol} pressed!")
|
151
|
+
return true
|
152
|
+
else
|
153
|
+
return false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def release( key_symbol )
|
158
|
+
@ogre_input.key_released?(Converter.convert(key_symbol))
|
159
|
+
end
|
160
|
+
|
161
|
+
def flush
|
162
|
+
@ogre_input.flush
|
163
|
+
end
|
164
|
+
|
165
|
+
def mouse
|
166
|
+
@mouse
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Shattered
|
2
|
+
module Input
|
3
|
+
# Converts from OIS constants to more readable symbols.
|
4
|
+
class Converter
|
5
|
+
|
6
|
+
def self.back_conversions
|
7
|
+
@@back_conversions ||= nil
|
8
|
+
if @@back_conversions.nil?
|
9
|
+
@@back_conversions = conversions.invert
|
10
|
+
@@back_conversions[",".to_sym] = OIS::KC_COMMA
|
11
|
+
@@back_conversions[".".to_sym] = OIS::KC_PERIOD
|
12
|
+
end
|
13
|
+
return @@back_conversions
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.conversions
|
17
|
+
begin
|
18
|
+
return @@conversions
|
19
|
+
rescue NameError
|
20
|
+
end
|
21
|
+
@@conversions = {}
|
22
|
+
OIS.constants.each do |constant|
|
23
|
+
kc_evaled = eval("OIS::#{constant}")
|
24
|
+
@@conversions[kc_evaled] = symbolize(constant[3..-1].downcase) if constant.to_s =~ /^KC_/
|
25
|
+
end
|
26
|
+
return @@conversions
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.convert( kc_character )
|
30
|
+
return self.conversions[kc_character] if kc_character.is_a? Fixnum
|
31
|
+
return self.back_conversions[kc_character.to_sym]
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def self.symbolize( name )
|
37
|
+
exceptions = { 'pgdown' => :page_down,
|
38
|
+
'pgup' => :page_up }
|
39
|
+
return name.to_sym if exceptions[name] == nil
|
40
|
+
return exceptions[name]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Shattered
|
2
|
+
# Models encompass all of the game play logic and the game specific data.
|
3
|
+
#
|
4
|
+
# Models are useful for unit tests and for making game rules.
|
5
|
+
# They are where all logic (AI/collisions/etc) go.
|
6
|
+
#
|
7
|
+
# They can also specify keyboard input.
|
8
|
+
|
9
|
+
module Model
|
10
|
+
def self.append_features(base)
|
11
|
+
super
|
12
|
+
base.send(:include, Timer)
|
13
|
+
base.send(:include, Input)
|
14
|
+
base.send(:timer, :every => :frame, :action => :update_input)
|
15
|
+
|
16
|
+
base.send(:include, InstanceMethods)
|
17
|
+
base.send(:timer, :every => :frame, :action => :update_time_elapsed)
|
18
|
+
end
|
19
|
+
|
20
|
+
module InstanceMethods
|
21
|
+
attr_reader :time_elapsed
|
22
|
+
def update_time_elapsed(te)
|
23
|
+
@time_elapsed = te
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Shattered
|
2
|
+
module Timer #:nodoc:all
|
3
|
+
|
4
|
+
class Timer
|
5
|
+
attr_reader :events_remaining
|
6
|
+
def initialize(context)
|
7
|
+
@events_remaining = []
|
8
|
+
@context = context
|
9
|
+
@@timers ||= []
|
10
|
+
@@timers << self
|
11
|
+
end
|
12
|
+
|
13
|
+
def in(seconds, options = {}, &block)
|
14
|
+
event = TimedEvent.new(@context, seconds, options, &block)
|
15
|
+
@events_remaining << event
|
16
|
+
return event
|
17
|
+
end
|
18
|
+
def every(seconds, options = {}, &block)
|
19
|
+
event = ContinuousTimedEvent.new(@context, seconds, options, &block)
|
20
|
+
@events_remaining << event
|
21
|
+
return event
|
22
|
+
end
|
23
|
+
def update(time_elapsed)
|
24
|
+
events_for_update = @events_remaining.dup
|
25
|
+
events_for_update.each do |event|
|
26
|
+
event.update(time_elapsed)
|
27
|
+
@events_remaining.delete(event) if event.processed?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#Updates all timers
|
32
|
+
def self.update(time_elapsed)
|
33
|
+
@@timers.each do |timer|
|
34
|
+
timer.update time_elapsed
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Call this to remove a timer
|
39
|
+
def destroy
|
40
|
+
@@timers.delete self
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class TimedEvent
|
45
|
+
attr_accessor :time_remaining
|
46
|
+
def initialize(context, seconds, options={}, &block)
|
47
|
+
@context=context
|
48
|
+
@event = block
|
49
|
+
@options = options
|
50
|
+
if(seconds != :frame)
|
51
|
+
@time_remaining = seconds
|
52
|
+
@initial_time = @time_remaining
|
53
|
+
else
|
54
|
+
@time_remaining = 0
|
55
|
+
@initial_time = 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
def update(time_elapsed)
|
59
|
+
return if processed? || stopped?
|
60
|
+
@time_remaining -= time_elapsed
|
61
|
+
if time_up?
|
62
|
+
process_event
|
63
|
+
@processed=true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
def processed?
|
67
|
+
return @processed == true
|
68
|
+
end
|
69
|
+
def reset
|
70
|
+
@time_remaining = @initial_time
|
71
|
+
end
|
72
|
+
# Stop the timer
|
73
|
+
def stop
|
74
|
+
@stopped = true
|
75
|
+
end
|
76
|
+
def stopped?
|
77
|
+
!@stopped.nil?
|
78
|
+
end
|
79
|
+
private
|
80
|
+
def process_event
|
81
|
+
@event.call(@initial_time - @time_remaining) if satisfies_condition?
|
82
|
+
end
|
83
|
+
def time_up?
|
84
|
+
return @time_remaining <= 0
|
85
|
+
end
|
86
|
+
def satisfies_condition?
|
87
|
+
return true if(@options[:if].nil? && @options[:unless].nil?)
|
88
|
+
unless @options[:if].nil?
|
89
|
+
result=@options[:if]
|
90
|
+
result=@context.send(result) if(result.is_a? Symbol)
|
91
|
+
return result
|
92
|
+
end
|
93
|
+
unless @options[:unless].nil?
|
94
|
+
result=@options[:unless]
|
95
|
+
result=@context.send(result) if(result.is_a? Symbol)
|
96
|
+
return !result
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class ContinuousTimedEvent < TimedEvent
|
102
|
+
def update(time_elapsed)
|
103
|
+
return if stopped?
|
104
|
+
@time_remaining -= time_elapsed
|
105
|
+
if(time_up?)
|
106
|
+
process_event
|
107
|
+
reset
|
108
|
+
end
|
109
|
+
end
|
110
|
+
def reset
|
111
|
+
@time_remaining += @initial_time
|
112
|
+
@time_remaining = 0 if @time_remaining < 0
|
113
|
+
end
|
114
|
+
def processed?
|
115
|
+
false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|