okami 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ require 'gosu'
2
+ require 'okami/window'
3
+ require 'okami/keyboard'
4
+ require 'okami/mouse'
@@ -0,0 +1,20 @@
1
+ ## The image of the hitmask, white is hitpoints, black is not
2
+ require 'texplay'
3
+
4
+ class Okami::HitMask
5
+ def initialize mask, parent
6
+ @hit_mask = mask
7
+ @parent = parent
8
+ end
9
+
10
+ def hit_point? x, y
11
+ c = @hit_mask.get_pixel( x - @parent.x, y - @parent.y )
12
+ return false unless c
13
+ return c[1] > 0.9 # quick 'n dirty
14
+ end
15
+
16
+ def hit_line x1, y1, x2, y2
17
+ hit_vertex = @hit_mask.line x1, y1, x2, y2, trace: { :until_color => :white, :tolerance => 0.1 }
18
+ hit_vertex || false
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ class Okami::Image < Gosu::Image
2
+ @tileable = true
3
+ @load_path = ""
4
+
5
+ class << self
6
+ attr_accessor :tileable, :load_path
7
+
8
+ Images = {}
9
+ ImageTiles = {}
10
+
11
+ def new path, tileable=@tileable, *src_rect
12
+ super $window, @load_path + path, tileable, *src_rect
13
+ end
14
+ alias load new
15
+
16
+ def load_tiles path, tile_width, tile_height, tileable=@tileable
17
+ super $window, @load_path + path, tile_width, tile_height, tileable
18
+ end
19
+ alias new_tiles load_tiles
20
+
21
+ ## Require will only load the image the first time it is called.
22
+ def require path, tileable=@tileable, *src_rect
23
+ Images[ @load_path + path + src_rect.to_s ] ||= load path, tileable, *src_rect
24
+ end
25
+ alias [] require
26
+
27
+ def require_tiles path, tile_width, tile_height, tileable=@tileable
28
+ ImageTiles[ "size:#{tile_width},#{tile_height}&" + @load_path + path ] ||= load_tiles path, tile_width, tile_height, tileable
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,157 @@
1
+ require 'okami/operating_system'
2
+
3
+ module Okami::Keyboard
4
+ DefaultKeySymbols = {
5
+ Gosu::KbUp => :up,
6
+ Gosu::KbDown => :down,
7
+ Gosu::KbLeft => :left,
8
+ Gosu::KbRight => :right,
9
+
10
+ Gosu::KbSpace => :space,
11
+ Gosu::KbReturn => :return,
12
+ Gosu::KbBackspace => :backspace,
13
+ Gosu::KbLeftShift => :left_shift,
14
+ Gosu::KbRightShift => :right_shift,
15
+ Gosu::KbLeftControl => :left_ctrl,
16
+ Gosu::KbRightControl => :right_ctrl,
17
+ Gosu::KbEscape => :escape,
18
+ Gosu::KbLeftAlt => :left_alt,
19
+ Gosu::KbRightAlt => :right_alt,
20
+ Gosu::KbTab => :tab,
21
+
22
+ Gosu::Kb0 => 0,
23
+ Gosu::Kb1 => 1,
24
+ Gosu::Kb2 => 2,
25
+ Gosu::Kb3 => 3,
26
+ Gosu::Kb4 => 4,
27
+ Gosu::Kb5 => 5,
28
+ Gosu::Kb6 => 6,
29
+ Gosu::Kb7 => 7,
30
+ Gosu::Kb8 => 8,
31
+ Gosu::Kb9 => 9,
32
+
33
+ Gosu::KbF1 => :f1,
34
+ Gosu::KbF2 => :f2,
35
+ Gosu::KbF3 => :f3,
36
+ Gosu::KbF4 => :f4,
37
+ Gosu::KbF5 => :f5,
38
+ Gosu::KbF6 => :f6,
39
+ Gosu::KbF7 => :f7,
40
+ Gosu::KbF8 => :f8,
41
+ Gosu::KbF9 => :f9,
42
+ Gosu::KbF10 => :f10,
43
+ Gosu::KbF11 => :f11,
44
+ Gosu::KbF12 => :f12,
45
+
46
+ Gosu::KbA => :a,
47
+ Gosu::KbB => :b,
48
+ Gosu::KbC => :c,
49
+ Gosu::KbD => :d,
50
+ Gosu::KbE => :e,
51
+ Gosu::KbF => :f,
52
+ Gosu::KbG => :g,
53
+ Gosu::KbH => :h,
54
+ Gosu::KbI => :i,
55
+ Gosu::KbJ => :j,
56
+ Gosu::KbK => :k,
57
+ Gosu::KbL => :l,
58
+ Gosu::KbM => :m,
59
+ Gosu::KbN => :n,
60
+ Gosu::KbO => :o,
61
+ Gosu::KbP => :p,
62
+ Gosu::KbQ => :q,
63
+ Gosu::KbR => :r,
64
+ Gosu::KbS => :s,
65
+ Gosu::KbT => :t,
66
+ Gosu::KbU => :u,
67
+ Gosu::KbV => :v,
68
+ Gosu::KbW => :w,
69
+ Gosu::KbX => :x,
70
+ Gosu::KbY => :y,
71
+ Gosu::KbZ => :z
72
+ }
73
+
74
+ if OS.mac?
75
+ DefaultKeySymbols[55] = :left_cmd
76
+ DefaultKeySymbols[54] = :right_cmd
77
+ end
78
+
79
+ DefaultKeySymbols.freeze
80
+
81
+ @@key_symbols = DefaultKeySymbols.dup
82
+ @@key_down_listeners = {}
83
+ @@key_up_listeners = {}
84
+
85
+ class << self
86
+ def key_symbols; @@key_symbols end
87
+ def key_symbols= hash; @@key_symbols = hash end
88
+
89
+ def add_key_down_listener listener_method
90
+ @@key_down_listeners[ listener_method.receiver ] = listener_method
91
+ end
92
+
93
+ def add_key_up_listener listener_method
94
+ @@key_up_listeners[ listener_method.receiver ] = listener_method
95
+ end
96
+
97
+ def remove_key_up_listener listener
98
+ if listener.class == Method
99
+ key_up_listener = @@key_up_listeners.key listener
100
+ @@key_up_listeners.delete key_up_listener
101
+ else
102
+ @@key_up_listeners.delete listener
103
+ end
104
+ end
105
+
106
+ def remove_key_down_listener listener
107
+ if listener.class == Method
108
+ key_down_listener = @@key_down_listeners.key listener
109
+ @@key_down_listeners.delete key_down_listener
110
+ else
111
+ @@key_down_listeners.delete listener
112
+ end
113
+ end
114
+
115
+ def key_down? key_symbol
116
+ case key_symbol
117
+ when :any_key; any_key_down? *@@key_symbols.values
118
+ when :alt; any_key_down? :left_alt, :right_alt
119
+ when :shift; any_key_down? :left_shift, :right_shift
120
+ when :ctrl; any_key_down? :left_ctrl, :right_ctrl
121
+ when :cmd; any_key_down? :left_cmd, :right_cmd
122
+ else
123
+ $window.button_down? @@key_symbols.key( key_symbol )
124
+ end
125
+
126
+ end
127
+
128
+ ## Returns true if all key_symbols is down
129
+ def keys_down? *key_symbols
130
+ key_symbols.each do |key_symbol|
131
+ return false unless key_down? key_symbol
132
+ end
133
+ return true
134
+ end
135
+
136
+ ## Returns true if one of the key_symbols is down
137
+ def any_key_down? *key_symbols
138
+ key_symbols << :any_key if key_symbols.empty?
139
+ key_symbols.each do |key_symbol|
140
+ return true if key_down? key_symbol
141
+ end
142
+ return false
143
+ end
144
+ alias any_of_keys_down? any_key_down?
145
+
146
+ def button_down id
147
+ key = @@key_symbols[id]
148
+ @@key_down_listeners.each { |listener, method| method.call key } if key
149
+ end
150
+
151
+ def button_up id
152
+ key = @@key_symbols[id]
153
+ @@key_up_listeners.each { |listener, method| method.call key } if key
154
+ end
155
+ end
156
+
157
+ end
@@ -0,0 +1,106 @@
1
+ module Okami::Mouse
2
+ DefaultKeySymbols = {
3
+ Gosu::MsLeft => :left,
4
+ Gosu::MsRight => :right,
5
+ Gosu::MsMiddle => :middle,
6
+ Gosu::MsWheelUp => :wheel_up,
7
+ Gosu::MsWheelDown => :wheel_down
8
+ }.freeze
9
+
10
+ @@key_symbols = DefaultKeySymbols.dup
11
+ @@key_down_listeners = {}
12
+ @@key_up_listeners = {}
13
+
14
+ class << self
15
+ def key_symbols; @@key_symbols end
16
+ def key_symbols= hash; @@key_symbols = hash end
17
+
18
+ def x; $window.mouse_x end
19
+ def y; $window.mouse_y end
20
+ def x=value; $window.mouse_x = value end
21
+ def y=value; $window.mouse_y = value end
22
+
23
+ def onscreen?
24
+ if x > 0
25
+ if y > 0
26
+ if x < $window.width
27
+ if y < $window.height
28
+ return true
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ return false
35
+ end
36
+
37
+ def offscreen?
38
+ not onscreen?
39
+ end
40
+
41
+ def show; $window.cursor_visible = true end
42
+ def hide; $window.cursor_visible = false end
43
+
44
+ def add_key_down_listener listener_method
45
+ @@key_down_listeners[ listener_method.receiver ] = listener_method
46
+ end
47
+
48
+ def add_key_up_listener listener_method
49
+ @@key_up_listeners[ listener_method.receiver ] = listener_method
50
+ end
51
+
52
+ def remove_listener listener
53
+ case listener.class
54
+ when Method
55
+ key_up_listener = @@key_up_listeners.key listener
56
+ key_down_listener = @@key_down_listeners.key listener
57
+
58
+ @@key_up_listeners.delete key_up_listener
59
+ @@key_down_listeners.delete key_down_listener
60
+ else
61
+ @@key_down_listeners.delete listener
62
+ @@key_up_listeners.delete listener
63
+ end
64
+ end
65
+
66
+ def key_down? key_symbol
67
+ case key_symbol
68
+ when :any_key; any_key_down? *@@key_symbols.values
69
+ else; $window.button_down? @@key_symbols.key( key_symbol )
70
+ end
71
+ end
72
+
73
+ ## Returns true if all key_symbols is down
74
+ def keys_down? *key_symbols
75
+ key_symbols.each do |key_symbol|
76
+ return false unless key_down? key_symbol
77
+ end
78
+ return nil if key_symbols.empty?
79
+ return true
80
+ end
81
+
82
+ ## Returns true if one of the key_symbols is down
83
+ def any_key_down? *key_symbols
84
+ key_symbols << :any_key if key_symbols.empty?
85
+ key_symbols.each do |key_symbol|
86
+ return true if key_down? key_symbol
87
+ end
88
+ return nil if key_symbols.empty?
89
+ return false
90
+ end
91
+ alias any_of_keys_down? any_key_down?
92
+
93
+ def button_down id
94
+ key = @@key_symbols[id]
95
+ return unless key
96
+ @@key_down_listeners.each { |listener, method| method.call key }
97
+ end
98
+
99
+ def button_up id
100
+ key = @@key_symbols[id]
101
+ return unless key
102
+ @@key_up_listeners.each { |listener, method| method.call key }
103
+ end
104
+ end
105
+
106
+ end
@@ -0,0 +1,16 @@
1
+ module Okami
2
+ MouseTrap = Struct.new(:captured)
3
+ class << MouseTrap
4
+ def capture
5
+ @captured ? false : @captured = true
6
+ end
7
+
8
+ def release
9
+ @captured = false
10
+ return true
11
+ end
12
+
13
+ def captured?; !!@captured end
14
+ def released?; !@captured end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module OS
2
+ @@system =
3
+ case RUBY_PLATFORM
4
+ when /darwin/i then :mac
5
+ when /mswin/i then :windows
6
+ when /linux/i then :linux
7
+ else :unknown
8
+ end
9
+
10
+ class << self
11
+ def system; @@system end
12
+ def to_sym; @@system end
13
+ def to_s; @@system.to_s.capitalize end
14
+ def mac?; @@system == :mac end
15
+ def windows?; @@system == :windows end
16
+ def linux?; @@system == :linux end
17
+ def unknown?; @@system == :unknown end
18
+ end
19
+ end
@@ -0,0 +1,151 @@
1
+ class Okami::Sprite
2
+ Modes = [:forward, :loop, :backward, :backward_loop, :ping_pong]
3
+
4
+ attr_reader :current_image, :images, :last_frame_index
5
+
6
+ def initialize options={}
7
+ @images = options[:images]
8
+
9
+ @last_frame_index = @images.length - 1
10
+ @add = ( options[:fps] || 0 ) / 60.0
11
+ self.mode = options[:mode] || :loop
12
+
13
+ case @direction
14
+ when :forward then @frame_index = 0
15
+ when :backward then @frame_index = @last_frame_index+0.99
16
+ end
17
+
18
+ update_current_image
19
+ end
20
+
21
+ def fps; @add * 60 end
22
+ def fps= fps; @add = fps / 60.0 end
23
+
24
+ attr_reader :frame_index
25
+ def frame_index= i
26
+ @frame_index = i
27
+ @frame_index = @last_frame_index if @frame_index > @last_frame_index
28
+ @frame_index = 0 if @frame_index < 0
29
+ update_current_image
30
+ end
31
+
32
+
33
+ ## Draw it just like a Gosu::Image !
34
+ def draw *args; @current_image.draw *args end
35
+ def draw_as_quad *args; @current_image.draw_as_quad *args end
36
+ def draw_rot *args; @current_image.draw_rot *args end
37
+
38
+
39
+ def update
40
+ case @direction
41
+ when :forward then @frame_index += @add
42
+ when :backward then @frame_index -= @add
43
+ end
44
+
45
+ @update_method.call
46
+ update_current_image
47
+ end
48
+
49
+
50
+ def finished?
51
+ case @mode
52
+ when :forward; @frame_index == @last_frame_index
53
+ when :backward; @frame_index == 0
54
+ end
55
+ end
56
+ alias animation_finished? finished?
57
+
58
+ attr_reader :mode
59
+ def mode= symbol
60
+
61
+ case symbol
62
+ when :loop
63
+ @direction = :forward
64
+ use_update method :update_loop
65
+
66
+ when :backward_loop
67
+ @direction = :backward
68
+ use_update method :update_backward_loop
69
+
70
+ when :forward
71
+ @direction = :forward
72
+ use_update method :update_forward
73
+
74
+ when :backward
75
+ @direction = :backward
76
+ use_update method :update_backward
77
+
78
+ when :ping_pong
79
+ @direction ||= :forward
80
+ use_update method :update_ping_pong
81
+
82
+ else
83
+ puts "Supported AnimatedSprite modes:"
84
+ puts self.class.modes
85
+ raise ArgumentError, "AnimatedSprite, mode #{symbol.inspect} not supported"
86
+ end
87
+
88
+ @mode = symbol
89
+ end
90
+
91
+
92
+
93
+ protected
94
+
95
+
96
+
97
+ def use_update method; @update_method = method end
98
+
99
+ def update_current_image
100
+ @current_image = @images[ @frame_index ]
101
+ end
102
+
103
+ def update_forward
104
+ @frame_index = @last_frame_index if @frame_index > @last_frame_index
105
+ end
106
+
107
+ def update_loop
108
+ @frame_index = 0 if @frame_index >= @last_frame_index
109
+ end
110
+
111
+ def update_backward
112
+ @frame_index = 0 if @frame_index < 0
113
+ end
114
+
115
+ def update_backward_loop
116
+ @frame_index = @last_frame_index+0.99 if @frame_index < 0
117
+ end
118
+
119
+ def update_ping_pong
120
+ case @direction
121
+ when :forward
122
+ if @frame_index >= @last_frame_index
123
+ @direction = :backward
124
+ @frame_index = @last_frame_index
125
+ end
126
+
127
+ when :backward
128
+ if @frame_index < 0
129
+ @frame_index = 1
130
+ @direction = :forward
131
+ end
132
+
133
+ end
134
+ end
135
+ end
136
+
137
+ =begin
138
+ ## Example ##
139
+ a = AnimatedSprite.new images: [1, 2, 3, 4, 5, 6, 7, 8], fps: 60, :mode => :forward
140
+ loop do
141
+ #if rand(10) == 1
142
+ # modes = AnimatedSprite.modes
143
+ # a.mode = modes[rand(modes.length)]
144
+ # puts a.mode
145
+ #end
146
+ p a.current_image
147
+ p a.finished?
148
+ a.update
149
+ sleep 0.3
150
+ end
151
+ =end
@@ -0,0 +1,59 @@
1
+ module Okami
2
+ def self.method_missing *args
3
+ Gosu.send *args
4
+ end
5
+
6
+ def self.const_missing const
7
+ Gosu.const_get const
8
+ end
9
+
10
+ class Window < Gosu::Window
11
+ include Gosu
12
+ include Okami
13
+ attr_accessor :cursor_visible
14
+
15
+ def initialize *args
16
+ @prev_t = Gosu::milliseconds
17
+ $window = super *args
18
+ end
19
+
20
+ def show_cursor; @cursor_visible = true end
21
+ def hide_cursor; @cursor_visible = false end
22
+ def needs_cursor?; @cursor_visible end
23
+
24
+ def button_down id
25
+ Okami::Keyboard.button_down id
26
+ Okami::Mouse.button_down id
27
+ end
28
+
29
+ def button_up id
30
+ Okami::Keyboard.button_up id
31
+ Okami::Mouse.button_up id
32
+ end
33
+
34
+ def retrofy
35
+ Gosu::enable_undocumented_retrofication \
36
+ rescue puts "Unable to use Gosu::enable_undocumented_retrofication"
37
+ end
38
+
39
+ def calculate_dt
40
+ @t = Gosu::milliseconds
41
+ @dt = (@t-@prev_t)/1000.0
42
+ @prev_t = @t
43
+ end
44
+
45
+ def self.inherited(subclass)
46
+ def subclass.method_added(name)
47
+ if name == :update
48
+ return if caller.first.match(/^(.+?):(\d+)(?::in `(.*)')?/)[1].match /eval/i
49
+ class_eval "def update_hook\n calculate_dt\n update_without_hook\nend"
50
+ class_eval "alias update_without_hook update"
51
+ class_eval "alias update update_hook"
52
+ end
53
+ end
54
+ end
55
+
56
+
57
+ end
58
+ end
59
+
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: okami
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Bue Grønlund
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: gosu
16
+ requirement: &70258649056920 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70258649056920
25
+ - !ruby/object:Gem::Dependency
26
+ name: texplay
27
+ requirement: &70258649056300 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70258649056300
36
+ description: Gosu Interface with fancy functionality for simplicity.
37
+ email: aerotune@gmail.com
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - lib/okami.rb
43
+ - lib/okami/window.rb
44
+ - lib/okami/keyboard.rb
45
+ - lib/okami/mouse.rb
46
+ - lib/okami/mouse_trap.rb
47
+ - lib/okami/image.rb
48
+ - lib/okami/hit_mask.rb
49
+ - lib/okami/sprite.rb
50
+ - lib/okami/operating_system.rb
51
+ homepage: https://github.com/Aerotune/Okami
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.8.10
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Okami minimal Gosu!
75
+ test_files: []