okami 0.0.993 → 0.1.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.
- data/lib/okami.rb +17 -7
- data/lib/okami/drawable.rb +73 -0
- data/lib/okami/image.rb +11 -42
- data/lib/okami/image_cache.rb +18 -0
- data/lib/okami/image_tiles_cache.rb +17 -0
- data/lib/okami/keyboard.rb +1 -1
- data/lib/okami/os.rb +1 -1
- data/lib/okami/sprite.rb +42 -38
- data/lib/okami/window.rb +1 -10
- data/lib/okami/wrapping_angle.rb +44 -0
- metadata +5 -1
data/lib/okami.rb
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
require 'gosu'
|
2
|
-
|
3
|
-
|
4
|
-
require_relative 'okami/
|
5
|
-
require_relative 'okami/
|
6
|
-
require_relative 'okami/
|
7
|
-
require_relative 'okami/
|
8
|
-
require_relative 'okami/
|
2
|
+
|
3
|
+
module Okami
|
4
|
+
require_relative 'okami/window'
|
5
|
+
require_relative 'okami/keyboard'
|
6
|
+
require_relative 'okami/mouse'
|
7
|
+
require_relative 'okami/mouse_trap'
|
8
|
+
require_relative 'okami/hit_mask'
|
9
|
+
require_relative 'okami/image'
|
10
|
+
require_relative 'okami/image_tiles_cache'
|
11
|
+
require_relative 'okami/image_cache'
|
12
|
+
require_relative 'okami/sprite'
|
13
|
+
|
14
|
+
def self.retrofy
|
15
|
+
Gosu::enable_undocumented_retrofication \
|
16
|
+
rescue puts "Unable to use Gosu::enable_undocumented_retrofication"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative 'wrapping_angle'
|
2
|
+
|
3
|
+
module Okami::Drawable
|
4
|
+
@default_center_x = 0
|
5
|
+
@default_center_y = 0
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :default_center_x, :default_center_y
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :x, :y, :z
|
12
|
+
attr_accessor :center_x, :center_y
|
13
|
+
attr_accessor :color, :draw_mode
|
14
|
+
|
15
|
+
def init_drawable
|
16
|
+
@factor_x = 1
|
17
|
+
@factor_y = 1
|
18
|
+
self.center_x = Okami::Drawable.default_center_x
|
19
|
+
self.center_y = Okami::Drawable.default_center_y
|
20
|
+
@x = 0
|
21
|
+
@y = 0
|
22
|
+
@z = 0
|
23
|
+
@wrapping_angle = WrappingAngle.new
|
24
|
+
@wrapping_angle.degrees = 0
|
25
|
+
@degrees = @wrapping_angle.degrees
|
26
|
+
@color = 0xFFFFFFFF
|
27
|
+
@draw_mode = :default
|
28
|
+
@color = Gosu::Color.argb(255, 255, 255, 255)
|
29
|
+
@alpha = 1.0
|
30
|
+
end
|
31
|
+
|
32
|
+
def draw
|
33
|
+
@image.draw_rot @x, @y, @z, @degrees, @center_x, @center_y, @factor_x, @factor_y, @color, @draw_mode
|
34
|
+
end
|
35
|
+
|
36
|
+
def rotate_radians a; @wrapping_angle.rotate_radians a; @degrees = @wrapping_angle.degrees end
|
37
|
+
def rotate_fraction a; @wrapping_angle.rotate_fraction a; @degrees = @wrapping_angle.degrees end
|
38
|
+
def rotate_degrees a; @wrapping_angle.rotate_degrees a; @degrees = @wrapping_angle.degrees end
|
39
|
+
|
40
|
+
def radians; @wrapping_angle.radians end
|
41
|
+
def fraction; @wrapping_angle.fraction end
|
42
|
+
def degrees; @wrapping_angle.degrees end
|
43
|
+
|
44
|
+
def radians= a; @wrapping_angle.radians = a; @degrees = @wrapping_angle.degrees end
|
45
|
+
def fraction= a; @wrapping_angle.fraction = a; @degrees = @wrapping_angle.degrees end
|
46
|
+
def degrees= a; @wrapping_angle.degrees = a; @degrees = @wrapping_angle.degrees end
|
47
|
+
|
48
|
+
attr_reader :alpha
|
49
|
+
def alpha=a
|
50
|
+
@alpha = a
|
51
|
+
@color.alpha = a*255
|
52
|
+
end
|
53
|
+
|
54
|
+
def argb= a, r, g, b
|
55
|
+
@color.alpha = a * 255
|
56
|
+
@color.red = r * 255
|
57
|
+
@color.green = g * 255
|
58
|
+
@color.blue = b * 255
|
59
|
+
end
|
60
|
+
|
61
|
+
def rgba= r, g, b, a
|
62
|
+
@color.red = r * 255
|
63
|
+
@color.green = g * 255
|
64
|
+
@color.blue = b * 255
|
65
|
+
@color.alpha = a * 255
|
66
|
+
end
|
67
|
+
|
68
|
+
def rgb=
|
69
|
+
@color.red = r * 255
|
70
|
+
@color.green = g * 255
|
71
|
+
@color.blue = b * 255
|
72
|
+
end
|
73
|
+
end
|
data/lib/okami/image.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
|
-
|
1
|
+
require_relative 'drawable'
|
2
|
+
|
3
|
+
class Okami::Image
|
4
|
+
include Okami::Drawable
|
5
|
+
|
6
|
+
def initialize image_path
|
7
|
+
@image = Okami::ImageCache[image_path]
|
8
|
+
init_drawable
|
9
|
+
end
|
10
|
+
|
2
11
|
@tileable = true
|
3
12
|
@load_path = ""
|
4
13
|
|
5
14
|
class << self
|
6
|
-
Images = {}
|
7
|
-
ImageTiles = {}
|
8
|
-
|
9
15
|
# Set this for a default value for wether the images should be tileable or not
|
10
16
|
attr_accessor :tileable
|
11
17
|
# The directory to load the images from
|
@@ -15,42 +21,5 @@ class Okami::Image < Gosu::Image
|
|
15
21
|
val << "/" unless val[-1] == "/"
|
16
22
|
@load_path = val
|
17
23
|
end
|
18
|
-
|
19
|
-
## Doesn't have anything to do with the caching, is the same as Gosu::Image.new
|
20
|
-
def new path, tileable=@tileable, *src_rect
|
21
|
-
super $window, @load_path + path, tileable, *src_rect
|
22
|
-
end
|
23
|
-
alias load new
|
24
|
-
|
25
|
-
## Doesn't have anything to do with the caching, is the same as Gosu::Image.load_tiles
|
26
|
-
def load_tiles path, tile_width, tile_height, tileable=@tileable
|
27
|
-
super $window, @load_path + path, tile_width, tile_height, tileable
|
28
|
-
end
|
29
|
-
|
30
|
-
## Will cache the images so they're only loaded once.
|
31
|
-
def require path, tileable=@tileable, *src_rect
|
32
|
-
Images[ @load_path + path + src_rect.to_s ] ||= load path, tileable, *src_rect
|
33
|
-
end
|
34
|
-
alias [] require
|
35
|
-
|
36
|
-
def require_tiles path, tile_width, tile_height, tileable=@tileable
|
37
|
-
ImageTiles[ "size:#{tile_width},#{tile_height}&" + @load_path + path ] ||= load_tiles path, tile_width, tile_height, tileable
|
38
|
-
end
|
39
|
-
|
40
|
-
## Will update the cache
|
41
|
-
def reload path, tileable=@tileable, *src_rect
|
42
|
-
Images[ @load_path + path + src_rect.to_s ] = load path, tileable, *src_rect
|
43
|
-
end
|
44
|
-
alias [] require
|
45
|
-
|
46
|
-
def reload_tiles path, tile_width, tile_height, tileable=@tileable
|
47
|
-
ImageTiles[ "size:#{tile_width},#{tile_height}&" + @load_path + path ] = load_tiles path, tile_width, tile_height, tileable
|
48
|
-
end
|
49
|
-
|
50
|
-
def retrofy
|
51
|
-
Gosu::enable_undocumented_retrofication \
|
52
|
-
rescue puts "Unable to use Gosu::enable_undocumented_retrofication"
|
53
|
-
end
|
54
|
-
|
55
24
|
end
|
56
|
-
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Okami::Images = {}
|
2
|
+
|
3
|
+
class Okami::ImageCache
|
4
|
+
class << self
|
5
|
+
## Will cache the images so they're only loaded once.
|
6
|
+
def require path, tileable=Okami::Image.tileable, *src_rect
|
7
|
+
path = Okami::Image.load_path + path
|
8
|
+
Okami::Images[ path + src_rect.to_s ] ||= Gosu::Image.new $window, path, tileable, *src_rect
|
9
|
+
end
|
10
|
+
alias [] require
|
11
|
+
|
12
|
+
## Will load and cache even if it's already cached
|
13
|
+
def load path, tileable=Okami::Image.tileable, *src_rect
|
14
|
+
path = Okami::Image.load_path + path
|
15
|
+
Okami::Images[ path + src_rect.to_s ] = Gosu::Image.new $window, path, tileable, *src_rect
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Okami::ImageTiles = {}
|
2
|
+
|
3
|
+
class Okami::ImageTilesCache
|
4
|
+
class << self
|
5
|
+
def require path, tile_width, tile_height, tileable=Okami::Image.tileable
|
6
|
+
path = Okami::Image.load_path + path
|
7
|
+
Okami::ImageTiles[ "size:#{tile_width},#{tile_height}&" + path ] ||= Gosu::Image.load_tiles $window, path, tile_width, tile_height, tileable
|
8
|
+
end
|
9
|
+
alias [] require
|
10
|
+
|
11
|
+
## Will load and cache even if it's already cached
|
12
|
+
def load path, tile_width, tile_height, tileable=Okami::Image.tileable
|
13
|
+
path = Okami::Image.load_path + path
|
14
|
+
Okami::ImageTiles[ "size:#{tile_width},#{tile_height}&" + path ] = Gosu::Image.load_tiles $window, path, tile_width, tile_height, tileable
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/okami/keyboard.rb
CHANGED
data/lib/okami/os.rb
CHANGED
data/lib/okami/sprite.rb
CHANGED
@@ -1,39 +1,31 @@
|
|
1
|
+
require_relative 'drawable'
|
2
|
+
|
1
3
|
class Okami::Sprite
|
2
|
-
|
4
|
+
include Okami::Drawable
|
5
|
+
AnimationModes = [:forward, :loop, :backward, :backward_loop, :ping_pong]
|
3
6
|
|
4
|
-
attr_reader :
|
7
|
+
attr_reader :image, :images, :last_frame_index
|
5
8
|
|
6
9
|
def initialize options
|
7
10
|
raise_possible_errors options
|
11
|
+
options[:animation_mode] ||= :loop
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
@last_frame_index = @images.length - 1
|
12
|
-
@add = ( options[:fps] || 0 ) / 60.0
|
13
|
-
@direction = options[:direction]
|
14
|
-
self.mode = options[:mode] || :loop
|
15
|
-
|
16
|
-
case @direction
|
17
|
-
when :forward then @frame_index = 0
|
18
|
-
when :backward then @frame_index = @last_frame_index+0.999
|
13
|
+
options.each do |key, value|
|
14
|
+
send "#{key}=", value
|
19
15
|
end
|
20
16
|
|
17
|
+
set_initial_frame_index
|
18
|
+
init_drawable
|
21
19
|
update_current_image
|
22
20
|
end
|
23
21
|
|
24
|
-
def fps;
|
25
|
-
def fps=
|
26
|
-
|
27
|
-
## Draw it just like a Gosu::Image !
|
28
|
-
def draw *args; @current_image.draw *args end
|
29
|
-
def draw_as_quad *args; @current_image.draw_as_quad *args end
|
30
|
-
def draw_rot *args; @current_image.draw_rot *args end
|
31
|
-
|
22
|
+
def fps; @delta_frame_index * 60.0 end
|
23
|
+
def fps=fps; @delta_frame_index = fps / 60.0 end
|
32
24
|
|
33
25
|
def update
|
34
26
|
case @direction
|
35
|
-
when :forward then @frame_index += @
|
36
|
-
when :backward then @frame_index -= @
|
27
|
+
when :forward then @frame_index += @delta_frame_index*$window.dt*60.0
|
28
|
+
when :backward then @frame_index -= @delta_frame_index*$window.dt*60.0
|
37
29
|
end
|
38
30
|
|
39
31
|
@update_method.call
|
@@ -42,15 +34,15 @@ class Okami::Sprite
|
|
42
34
|
|
43
35
|
|
44
36
|
def finished?
|
45
|
-
case @
|
37
|
+
case @animation_mode
|
46
38
|
when :forward; @frame_index == @last_frame_index
|
47
39
|
when :backward; @frame_index == 0
|
48
40
|
end
|
49
41
|
end
|
50
42
|
alias animation_finished? finished?
|
51
43
|
|
52
|
-
attr_reader :
|
53
|
-
def
|
44
|
+
attr_reader :animation_mode
|
45
|
+
def animation_mode= symbol
|
54
46
|
case symbol
|
55
47
|
when :loop
|
56
48
|
@direction = :forward
|
@@ -73,12 +65,12 @@ class Okami::Sprite
|
|
73
65
|
use_update method :update_ping_pong
|
74
66
|
|
75
67
|
else
|
76
|
-
puts "Supported AnimatedSprite modes:"
|
77
|
-
puts
|
78
|
-
raise ArgumentError, "AnimatedSprite,
|
68
|
+
puts "Supported AnimatedSprite animation modes:"
|
69
|
+
puts AnimationModes
|
70
|
+
raise ArgumentError, "AnimatedSprite, animation_mode #{symbol.inspect} not supported"
|
79
71
|
end
|
80
72
|
|
81
|
-
@
|
73
|
+
@animation_mode = symbol
|
82
74
|
end
|
83
75
|
|
84
76
|
attr_reader :frame_index
|
@@ -93,14 +85,28 @@ class Okami::Sprite
|
|
93
85
|
(rand()*@images.length)
|
94
86
|
end
|
95
87
|
|
88
|
+
protected
|
96
89
|
|
90
|
+
def images=images
|
91
|
+
@images = images
|
92
|
+
@last_frame_index = @images.length - 1
|
93
|
+
end
|
97
94
|
|
98
|
-
|
95
|
+
def direction=direction
|
96
|
+
@direction = direction
|
97
|
+
end
|
99
98
|
|
99
|
+
private
|
100
100
|
|
101
|
+
def set_initial_frame_index
|
102
|
+
case @direction
|
103
|
+
when :forward then @frame_index = 0
|
104
|
+
when :backward then @frame_index = @last_frame_index+0.999
|
105
|
+
end
|
106
|
+
end
|
101
107
|
|
102
108
|
def use_update method; @update_method = method end
|
103
|
-
def update_current_image; @
|
109
|
+
def update_current_image; @image = @images[@frame_index] end
|
104
110
|
|
105
111
|
def update_loop; @frame_index %= @images.length end
|
106
112
|
def update_backward_loop; @frame_index %= @images.length end
|
@@ -112,20 +118,18 @@ class Okami::Sprite
|
|
112
118
|
def update_forward
|
113
119
|
@frame_index = @last_frame_index if @frame_index > @last_frame_index
|
114
120
|
end
|
115
|
-
|
116
|
-
|
117
|
-
|
121
|
+
|
118
122
|
def update_ping_pong
|
119
123
|
case @direction
|
120
124
|
when :forward
|
121
|
-
if @frame_index >= @last_frame_index
|
125
|
+
if @frame_index >= @last_frame_index+0.5
|
122
126
|
@direction = :backward
|
123
|
-
@frame_index = @last_frame_index
|
127
|
+
@frame_index = @last_frame_index+0.5
|
124
128
|
end
|
125
129
|
|
126
130
|
when :backward
|
127
|
-
if @frame_index < 0
|
128
|
-
@frame_index = 0
|
131
|
+
if @frame_index < 0.5
|
132
|
+
@frame_index = 0.5
|
129
133
|
@direction = :forward
|
130
134
|
end
|
131
135
|
|
data/lib/okami/window.rb
CHANGED
@@ -21,16 +21,7 @@ module Okami
|
|
21
21
|
Okami::Mouse.button_up id
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
color = case color
|
26
|
-
when :white then 0xFFFFFFFF
|
27
|
-
when :black then 0xFF000000
|
28
|
-
when Symbol
|
29
|
-
raise ArgumentError, "Unknown color #{color.inspect}"
|
30
|
-
else
|
31
|
-
color
|
32
|
-
end
|
33
|
-
|
24
|
+
def fill color, z=0
|
34
25
|
draw_quad 0, 0, color,
|
35
26
|
width, 0, color,
|
36
27
|
0, height, color,
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class WrappingAngle
|
2
|
+
Tau = Math::PI * 2
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@c = Complex(0,1)
|
6
|
+
end
|
7
|
+
|
8
|
+
def rotate_radians a; @c *= Complex(0,1)**(a/Tau * 4) end
|
9
|
+
def rotate_fraction a; @c *= Complex(0,1)**(a*4) end
|
10
|
+
def rotate_degrees a; @c *= Complex(0,1)**(a/90.0) end
|
11
|
+
|
12
|
+
def radians; @c.angle end
|
13
|
+
def fraction; @c.angle / Tau end
|
14
|
+
def degrees; @c.angle / Tau * 360 end
|
15
|
+
|
16
|
+
def radians= a; @c = Complex(0,1)**(a/Tau * 4) end
|
17
|
+
def fraction= a; @c = Complex(0,1)**(a*4.0) end
|
18
|
+
def degrees= a; @c = Complex(0,1)**(a/90.0) end
|
19
|
+
|
20
|
+
### Displaying
|
21
|
+
|
22
|
+
begin
|
23
|
+
require 'fraction'
|
24
|
+
def pretty_angle unit=@standard_unit
|
25
|
+
case unit
|
26
|
+
when :degrees
|
27
|
+
"#{angle(:degrees).round}°"
|
28
|
+
when :fraction, :radians
|
29
|
+
nom, den = angle(:fraction).fraction
|
30
|
+
return "0τ" if nom == 0
|
31
|
+
return "#{nom}/#{den}τ"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
def pretty_angle unit=@standard_unit
|
36
|
+
case unit
|
37
|
+
when :degrees; "#{angle(:degrees).round}°"
|
38
|
+
when :radians; "#{angle(:radians)} radians"
|
39
|
+
when :fraction; "#{angle(:fraction)}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: okami
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -50,14 +50,18 @@ extensions: []
|
|
50
50
|
extra_rdoc_files: []
|
51
51
|
files:
|
52
52
|
- lib/okami.rb
|
53
|
+
- lib/okami/drawable.rb
|
53
54
|
- lib/okami/window.rb
|
54
55
|
- lib/okami/keyboard.rb
|
55
56
|
- lib/okami/mouse.rb
|
56
57
|
- lib/okami/mouse_trap.rb
|
57
58
|
- lib/okami/image.rb
|
59
|
+
- lib/okami/image_cache.rb
|
60
|
+
- lib/okami/image_tiles_cache.rb
|
58
61
|
- lib/okami/hit_mask.rb
|
59
62
|
- lib/okami/sprite.rb
|
60
63
|
- lib/okami/os.rb
|
64
|
+
- lib/okami/wrapping_angle.rb
|
61
65
|
homepage: https://github.com/Aerotune/Okami
|
62
66
|
licenses: []
|
63
67
|
post_install_message:
|