aniruby 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1b0e843e0f081ca0cc57e4e28ed4b37f43574d7d4b50220d608879357f322d44
4
+ data.tar.gz: e284a38f220483bd15cae1a0ed61f6615296d8b4257838266013d9214bfd327c
5
+ SHA512:
6
+ metadata.gz: e3339f0a1560b4b77adf2b1dadf574d88f80d8315e71c0a1e7d886e94da3ada92968486dfdb48ef06fba66fa572f9f8f1fb95ace2669afba150c233e4cda780a
7
+ data.tar.gz: 42308936cde744c37f56af5c1fe03e244f0d13634ebf52dd194408603531108e5cf4d804b0da6432f7fe7f3b2a81c02ec27ac4036b0dc51af88c75594d458078
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ lib/**/*.rb - README.md CHANGELOG.md LICENSE
data/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## 0.1.2 - 2023-08-20
11
+
12
+ ### Changed
13
+
14
+ - Downcased the gem name in the gemspec
15
+
16
+ ## 0.1.1 - 2023-08-20
17
+
18
+ ### Added
19
+
20
+ - Add .yardopts to included files
21
+
22
+ ### Fixed
23
+
24
+ - Required ruby not being used correctly in gemspec
25
+
26
+ ## 0.1.0 - 2023-08-20
27
+
28
+ Initial release
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Chadow
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # AniRuby
2
+
3
+ Make sprite animations on Gosu simple and easy.
4
+
5
+ ## Summary
6
+
7
+ This library will provide you with a nice n easy interface to do sprite animations
8
+ on [Gosu](https://www.libgosu.org/), while being as nifty as possible
9
+
10
+ The library is made in pure Ruby with no dependencies at all (except Gosu, of course)
11
+
12
+ ## Install
13
+
14
+ You can install the gem with the following command:
15
+
16
+ `gem install aniruby`
17
+
18
+ or use it with a bundle:
19
+
20
+ ```ruby
21
+ # Somewhere in a Gemfile
22
+
23
+ gem 'aniruby'
24
+ ```
25
+
26
+ ## Getting Started
27
+
28
+ Using the less code possible:
29
+
30
+ ```ruby
31
+
32
+ require 'gosu'
33
+ require 'aniruby'
34
+
35
+ class MyWindow < Gosu::Window
36
+ def initialize
37
+ super(800, 600, false)
38
+
39
+ @animation = AniRuby::Animation.new('my_spritesheet.png', 32, 32,
40
+ false, true,
41
+ 150)
42
+ end
43
+
44
+ def update
45
+ @animation.update
46
+ end
47
+
48
+ def draw
49
+ @animation.draw(0, 0)
50
+ end
51
+ end
52
+ ```
53
+
54
+ ### Explanation
55
+
56
+ When you create a animation, you'll need to have an *spritesheet*, where you have
57
+ each sprite of the animation, that's the first argument to `Animation#new`, then
58
+ you'll need the dimensions of each individual sprite on your spritesheet, in the
59
+ example provided each sprite in the spritesheet is 32x32.
60
+
61
+ That is the bare minimum, you can specify filter type (retro in gosu's API), looping
62
+ and duration (for each individual frame too!).
63
+
64
+ provided you have the initilization right, you need to `update` your animation for it
65
+ to come to live!
66
+
67
+ NOTE: `Animation#draw` mimics the API of gosu' `Image#draw`, so you can give it
68
+ much more than single coordinates. there's `Animation#draw_rot` too!
69
+
70
+ ## Roadmap
71
+
72
+ - more fine-grained control of animation
73
+ - being able to make an animation stitching `Gosu::Image`'s together
74
+ - mirroring
75
+
76
+ ## License
77
+
78
+ [MIT](LICENSE)
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+
2
+ require 'fileutils'
3
+ require "minitest/test_task"
4
+
5
+ require_relative 'lib/aniruby/version'
6
+
7
+ Minitest::TestTask.create
8
+
9
+ task :default => :build
10
+
11
+ desc 'Build the gem'
12
+ task :build do
13
+ Dir.mkdir('pkg') unless Dir.exist?('pkg')
14
+
15
+ sh 'gem build aniruby.gemspec'
16
+
17
+ FileUtils.mv("aniruby-#{AniRuby::VERSION}.gem", 'pkg')
18
+ end
19
+
20
+ desc 'Clean the build enviroment'
21
+ task :clean do
22
+ FileUtils.rm_rf('pkg')
23
+ end
24
+
25
+ desc 'Push the gem to RubyGems'
26
+ task :push do
27
+ sh "gem push pkg/aniruby-#{AniRuby::VERSION}.gem"
28
+ end
29
+
30
+ desc 'Use YARD to generate documentation'
31
+ task :doc do
32
+ sh 'yardoc'
33
+ end
@@ -0,0 +1,189 @@
1
+
2
+ module AniRuby
3
+ # Has a AniRuby::Frames colletion, with a simple counter to keep track of
4
+ # current frame plus looping and pausing functionality
5
+ class Animation
6
+ # @return [AniRuby::Frames] The collection of frames this animation uses
7
+ attr_accessor :frames
8
+ # @return [Integer] The current frame index of the animation
9
+ attr_accessor :current_frame
10
+ # @return [Boolean] The loop status of the animation
11
+ attr_accessor :loop
12
+
13
+ # Create a new animation
14
+ #
15
+ # @param spritesheet [String] Path to the spritesheet file
16
+ # @param frame_w [Integer] The width of each individual frame
17
+ # @param frame_h [Integer] The height of each individual frame
18
+ # @param retro [Boolean] If true, the animation will not be interpolated when scaled
19
+ # @param loop [Boolean] If true, the animation will loop indefinitely
20
+ # @param durations [Integer] The duration of the frames in milliseconds (500
21
+ # is half a second, 1000 a second, etc). If
22
+ # there's more than one duration, then they will
23
+ # be mapped to each frame of the animation, the
24
+ # frames with no specified duration will default to 100
25
+ #
26
+ # @return [Animation] A new animation ready to play
27
+ def initialize(spritesheet, frame_w, frame_h, retro = false, loop = true, *durations)
28
+ @frame_w = frame_w
29
+ @frame_h = frame_h
30
+
31
+ @loop = loop
32
+
33
+ @current_frame = 0
34
+ @pause = false
35
+
36
+ @frames = AniRuby::Frames.new(Gosu::Image.load_tiles(spritesheet,
37
+ @frame_w,
38
+ @frame_h,
39
+ retro: retro))
40
+
41
+ # TODO: Maybe I could shorten this, adding an extra argument to
42
+ # AniRuby::Frames
43
+ if durations.one?
44
+ @frames.each { |frame| frame.duration = durations[0]}
45
+ else
46
+ @frames.each_with_index do |frame, idx|
47
+ # Set each frame to the duration provided, if there's no provide
48
+ # duration for all frames then we'll leave it at the default
49
+ frame.duration = durations[idx] unless durations[idx].nil?
50
+ end
51
+ end
52
+ end
53
+
54
+ # Get the width of the current frame's image
55
+ #
56
+ # @return [Integer]
57
+ def width
58
+ @frames[@current_frame].sprite.width
59
+ end
60
+
61
+ # Get the height of the current frame's image
62
+ #
63
+ # @return [Integer]
64
+ def height
65
+ @frames[@current_frame].sprite.height
66
+ end
67
+
68
+ # Update the animation, advancing the frame counter. Note that this won't do
69
+ # do anything if the animation is paused or has finished
70
+ def update
71
+ return if done? || paused?
72
+
73
+ @current_frame += 1 if frame_expired?
74
+ end
75
+
76
+ # Draw the animation
77
+ #
78
+ # @param x [Integer] The X coordinate
79
+ # @param y [Integer] The Y coordinate
80
+ # @param z [Integer] The Z order
81
+ # @param scale_x [Float] The horizontal scale factor
82
+ # @param scale_y [Float] The vertical scale factor
83
+ # @param color [Gosu::Color] The color to usw when drawing
84
+ # @param mode [:default, :additive] The blending mode
85
+ #
86
+ # (see {draw_rot})
87
+ def draw(x, y, z = 0,
88
+ scale_x = 1,
89
+ scale_y = 1,
90
+ color = Gosu::Color::WHITE,
91
+ mode = :default)
92
+ frame = @frames[@current_frame]
93
+
94
+ frame.sprite.draw(x, y, z, scale_x, scale_y, color, mode)
95
+
96
+ @current_frame = 0 if @loop && done?
97
+ end
98
+
99
+ # Draw the animation rotated, with its rotational center at (x, y).
100
+ #
101
+ # @param x [Integer] The X coordinate
102
+ # @param y [Integer] The Y coordinate
103
+ # @param z [Integer] The Z order
104
+ # @param angle [Float] The angle. in degrees
105
+ # @param center_x [Float] the relative horizontal rotation origin
106
+ # @param center_y [Float] the relative vertical rotation origin
107
+ # @param scale_x [Float] The horizontal scale factor
108
+ # @param scale_y [Float] The vertical scale factor
109
+ # @param color [Gosu::Color] The color to usw when drawing
110
+ # @param mode [:default, :additive] The blending mode
111
+ #
112
+ # (see {draw})
113
+ def draw_rot(x, y, z = 0,
114
+ angle = 0,
115
+ center_x = 0.5,
116
+ center_y = 0.5,
117
+ scale_x = 1,
118
+ scale_y = 1,
119
+ color = Gosu::Color::WHITE,
120
+ mode = :default)
121
+ frame = @frames[@current_frame]
122
+
123
+ frame.sprite.draw_rot(x, y, z, angle, center_x, center_y, scale_x, scale_y, color, mode)
124
+
125
+ # Loop the animation
126
+ @current_frame = 0 if @loop && done?
127
+ end
128
+
129
+ # Pause the animation
130
+ #
131
+ # (see {resume})
132
+ def pause
133
+ @pause = true
134
+ end
135
+
136
+ # Resume the animation
137
+ #
138
+ # (see {pause})
139
+ def resume
140
+ @pause = false
141
+ end
142
+
143
+ # Set the animation to the beginning frame
144
+ def reset
145
+ @current_frame = 0
146
+ end
147
+
148
+ # Set the duration for all frames in the animation
149
+ #
150
+ # @param ms [Integer] The new duration in milliseconds
151
+ def duration(ms)
152
+ @frames.each { |frame| frame.duration = ms}
153
+ end
154
+
155
+ # Is the animation finished?
156
+ #
157
+ # @return [Boolean]
158
+ # @note This method will return true in intervals if the animation loops
159
+ def done?
160
+ true if @current_frame == @frames.size - 1
161
+ end
162
+
163
+ # Is the animation paused?
164
+ #
165
+ # @return [Boolean]
166
+ def paused?
167
+ return true if @pause
168
+
169
+ false
170
+ end
171
+
172
+ # Get the current frame
173
+ #
174
+ # @return [AniRuby::Frame]
175
+ def get_current_frame
176
+ @frames[@current_frame % @frames.size]
177
+ end
178
+
179
+ # Has the current frame's duration expired?
180
+ def frame_expired?
181
+ now = Gosu.milliseconds
182
+ @last_frame ||= now
183
+
184
+ if (now - @last_frame) > @frames[@current_frame].duration
185
+ @last_frame = now
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,16 @@
1
+
2
+ module AniRuby
3
+ # A frame has a sprite and a duration in milliseconds
4
+ class Frame
5
+ attr_accessor :duration, :sprite
6
+ attr_reader :w, :h
7
+
8
+ def initialize(sprite, duration = 100)
9
+ @sprite = sprite
10
+ @duration = duration
11
+
12
+ @w = @sprite.width
13
+ @h = @sprite.height
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+
2
+ module AniRuby
3
+ # Collection of frames, with Enumerable included to add iteration functions
4
+ class Frames
5
+ include Enumerable
6
+
7
+ # Create a new collection of frames
8
+ #
9
+ # @param sprites [Array<Gosu::Image>]
10
+ def initialize(sprites)
11
+ @frames = sprites.map do |sprite|
12
+ AniRuby::Frame.new(sprite)
13
+ end
14
+ end
15
+
16
+ # @param index [Integer]
17
+ def [](index)
18
+ @frames[index]
19
+ end
20
+
21
+ def each(&block)
22
+ @frames.each do |frame|
23
+ if block_given?
24
+ block.call(frame)
25
+ else
26
+ yield frame
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+
2
+ module AniRuby
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 2
6
+
7
+ # See https://semver.org/
8
+ VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}".freeze
9
+ end
data/lib/aniruby.rb ADDED
@@ -0,0 +1,6 @@
1
+
2
+ require_relative 'aniruby/version'
3
+
4
+ require_relative 'aniruby/frame'
5
+ require_relative 'aniruby/frames'
6
+ require_relative 'aniruby/animation'
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aniruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Chadow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gosu
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 5.17.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 5.17.0
41
+ description: |
42
+ Library for painless sprite animations on Gosu, with a easy
43
+ and nifty API, made in pure Ruby with no dependencies at all!
44
+ email:
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".yardopts"
50
+ - CHANGELOG.md
51
+ - LICENSE
52
+ - README.md
53
+ - Rakefile
54
+ - lib/aniruby.rb
55
+ - lib/aniruby/animation.rb
56
+ - lib/aniruby/frame.rb
57
+ - lib/aniruby/frames.rb
58
+ - lib/aniruby/version.rb
59
+ homepage: https://github.com/Chadowo/aniruby
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 2.5.0
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubygems_version: 3.4.19
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Make sprite animations on Gosu simple and easy
82
+ test_files: []