okami 0.0.0

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.
@@ -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: []