particlefx2d 0.3.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +21 -0
  5. data/.ruby-version +1 -0
  6. data/.yardopts +1 -0
  7. data/CHANGELOG.md +25 -0
  8. data/CODE_OF_CONDUCT.md +84 -0
  9. data/Gemfile +8 -0
  10. data/Gemfile.lock +67 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +174 -0
  13. data/Rakefile +19 -0
  14. data/bin/console +15 -0
  15. data/bin/setup +8 -0
  16. data/example/images/fx_blue_swirling_smoke.png +0 -0
  17. data/example/images/fx_square_burst.png +0 -0
  18. data/example/images/fx_white_red_smoke.png +0 -0
  19. data/example/ruby2d/fx_blue_swirling_smoke.rb +39 -0
  20. data/example/ruby2d/fx_square_burst.rb +41 -0
  21. data/example/ruby2d/fx_white_red_smoke.rb +37 -0
  22. data/lib/particlefx2d/emitter.rb +163 -0
  23. data/lib/particlefx2d/images/particle.png +0 -0
  24. data/lib/particlefx2d/particle.rb +173 -0
  25. data/lib/particlefx2d/private/color.rb +88 -0
  26. data/lib/particlefx2d/private/vector2.rb +85 -0
  27. data/lib/particlefx2d/renderer.rb +34 -0
  28. data/lib/particlefx2d/renderer_factory.rb +37 -0
  29. data/lib/particlefx2d/ruby2d/canvas_renderer_factory.rb +63 -0
  30. data/lib/particlefx2d/ruby2d/particle_circle.rb +38 -0
  31. data/lib/particlefx2d/ruby2d/particle_image.rb +45 -0
  32. data/lib/particlefx2d/ruby2d/shape_renderer.rb +52 -0
  33. data/lib/particlefx2d/ruby2d/shape_renderer_factory.rb +30 -0
  34. data/lib/particlefx2d/version.rb +6 -0
  35. data/lib/particlefx2d.rb +9 -0
  36. data/lib/particlefx_ruby2d.rb +14 -0
  37. data/particlefx2d.gemspec +32 -0
  38. data/sig/particlefx2d.rbs +4 -0
  39. data/spec/spec_helper.rb +15 -0
  40. data/spec/unit/particlefx2d_spec.rb +7 -0
  41. metadata +170 -0
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'shape_renderer'
4
+
5
+ module ParticleFX2D
6
+ module Ruby2D
7
+ #
8
+ # A particle shape that is based on the Ruby2D _Image_.
9
+ class ParticleImage < ::Ruby2D::Image
10
+ include ShapeRenderer
11
+
12
+ # This class method is used to identify the image file to load.
13
+ # Create a subclass and override this method to define your own
14
+ # particle shapes based on image files.
15
+ def self.image_path
16
+ "#{File.dirname(__FILE__)}/../images/particle.png"
17
+ end
18
+
19
+ # Called by the emitter for each particle that it manages. Creates an instance
20
+ # of _ParticleImage_ using #image_path to obtain the file to load as image and
21
+ # intialized with the particle's position, size and colour.
22
+ #
23
+ # @param [ParticleFX2D::Particle] particle
24
+ #
25
+ def self.for(particle)
26
+ s = ParticleImage.new image_path, width: particle.size, height: particle.size
27
+ s.remove
28
+ s
29
+ end
30
+
31
+ # Sets the images's position using the incoming centre coordinates
32
+ # offset by the shape's mid-size.
33
+ def center!(centre_x, centre_y)
34
+ self.x = centre_x - (width / 2)
35
+ self.y = centre_y - (height / 2)
36
+ end
37
+
38
+ # Sets the image size using the particle size and calls #super
39
+ def draw_particle(particle)
40
+ self.width = self.height = particle.size
41
+ super
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../renderer_factory'
4
+
5
+ module ParticleFX2D
6
+ module Ruby2D
7
+ # The base definition for a Ruby2D shape-based renderer that can be peered to
8
+ # a particle managed by the ParticleFX2D _Emitter_. Include this when defining
9
+ # Ruby2D shape-specific classes to provide the Emitter to render
10
+ # the particle.
11
+ #
12
+ # This approach requires a shape per particle.
13
+ module ShapeRenderer
14
+ include ParticleFX2D::Renderer
15
+
16
+ # Show the particle. Used when a particle is activated.
17
+ def show_particle(_particle)
18
+ add
19
+ end
20
+
21
+ # Hide the particle. Used when a particle is deactivated.
22
+ def hide_particle(_particle)
23
+ remove
24
+ end
25
+
26
+ # Updates the shape's properties; no explicit drawing needed.
27
+ def draw_particle(particle)
28
+ center!(particle.x, particle.y)
29
+ color!(particle.color)
30
+ end
31
+
32
+ private
33
+
34
+ # Set the shape's center position. Must be implemented per shape.
35
+ # @raise [StandardError] because this method is unimplemented.
36
+ def center!(_centre_x, _centre_y)
37
+ raise StandardError('unimplemented')
38
+ end
39
+
40
+ # Set the shape's color.
41
+ #
42
+ # @param [Object] particle_color A colour object with +r+, +g+, +b+, +a+ members,
43
+ # where each component is in the range [0.0..1.0].
44
+ def color!(particle_color)
45
+ color.r = particle_color.r
46
+ color.g = particle_color.g
47
+ color.b = particle_color.b
48
+ color.opacity = particle_color.opacity
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../renderer_factory'
4
+
5
+ module ParticleFX2D
6
+ module Ruby2D
7
+ #
8
+ # Use an instance of this class to provide
9
+ # an _Emitter_ with a renderer factory.
10
+ class ShapeRendererFactory
11
+ include RendererFactory
12
+
13
+ #
14
+ # Instantiate a shape renderer factory.
15
+ #
16
+ # @param [ShapeRenderer] renderer_class Specify the object that will be used to create
17
+ # the particle renderers. e.g. _ParticleCircle_.
18
+ def initialize(renderer_class)
19
+ @renderer_class = renderer_class
20
+ end
21
+
22
+ # Return a particle renderer.
23
+ #
24
+ # @return [Renderer] for each particle
25
+ def renderer_for(particle)
26
+ @renderer_class.for(particle)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ParticleFX2D
4
+ # Current version.
5
+ VERSION = '0.3.0'
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'particlefx2d/version'
4
+ require_relative 'particlefx2d/emitter'
5
+ require_relative 'particlefx2d/renderer_factory'
6
+
7
+ # 2D particle effects API for use with any Ruby graphics API.
8
+ module ParticleFX2D
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'particlefx2d'
4
+ require_relative 'particlefx2d/ruby2d/particle_circle'
5
+ require_relative 'particlefx2d/ruby2d/particle_image'
6
+ require_relative 'particlefx2d/ruby2d/shape_renderer_factory'
7
+ require_relative 'particlefx2d/ruby2d/canvas_renderer_factory'
8
+
9
+ module ParticleFX2D
10
+ # This module defines the Ruby2D-specific particle shapes
11
+ # that can be peered with ParticleFX2D's particle effects.
12
+ module Ruby2D
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/particlefx2d/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'particlefx2d'
7
+ spec.version = ParticleFX2D::VERSION
8
+ spec.authors = ['nogginly']
9
+ spec.email = ['nogginly@icloud.com']
10
+
11
+ spec.summary = '2D particle effects API for use with any Ruby graphics API.'
12
+ spec.homepage = 'https://github.com/nogginly/particlefx2d'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = '>= 2.7.0'
15
+
16
+ spec.files = `git ls-files`.split("\n")
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['rubygems_mfa_required'] = 'true'
22
+
23
+ # no deployment dependencies
24
+
25
+ # development
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'rubocop'
29
+ spec.add_development_dependency 'rubocop-rake'
30
+ spec.add_development_dependency 'rubocop-rspec'
31
+ spec.add_development_dependency 'yard'
32
+ end
@@ -0,0 +1,4 @@
1
+ module ParticleFX2D
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'particlefx2d'
4
+
5
+ RSpec.configure do |config|
6
+ # Enable flags like --only-failures and --next-failure
7
+ config.example_status_persistence_file_path = '.rspec_status'
8
+
9
+ # Disable RSpec exposing methods globally on `Module` and `main`
10
+ config.disable_monkey_patching!
11
+
12
+ config.expect_with :rspec do |c|
13
+ c.syntax = :expect
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe ParticleFX2D do
4
+ it 'has a version number' do
5
+ expect(ParticleFX2D::VERSION).not_to be nil
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: particlefx2d
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - nogginly
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - nogginly@icloud.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".rubocop.yml"
107
+ - ".ruby-version"
108
+ - ".yardopts"
109
+ - CHANGELOG.md
110
+ - CODE_OF_CONDUCT.md
111
+ - Gemfile
112
+ - Gemfile.lock
113
+ - LICENSE.txt
114
+ - README.md
115
+ - Rakefile
116
+ - bin/console
117
+ - bin/setup
118
+ - example/images/fx_blue_swirling_smoke.png
119
+ - example/images/fx_square_burst.png
120
+ - example/images/fx_white_red_smoke.png
121
+ - example/ruby2d/fx_blue_swirling_smoke.rb
122
+ - example/ruby2d/fx_square_burst.rb
123
+ - example/ruby2d/fx_white_red_smoke.rb
124
+ - lib/particlefx2d.rb
125
+ - lib/particlefx2d/emitter.rb
126
+ - lib/particlefx2d/images/particle.png
127
+ - lib/particlefx2d/particle.rb
128
+ - lib/particlefx2d/private/color.rb
129
+ - lib/particlefx2d/private/vector2.rb
130
+ - lib/particlefx2d/renderer.rb
131
+ - lib/particlefx2d/renderer_factory.rb
132
+ - lib/particlefx2d/ruby2d/canvas_renderer_factory.rb
133
+ - lib/particlefx2d/ruby2d/particle_circle.rb
134
+ - lib/particlefx2d/ruby2d/particle_image.rb
135
+ - lib/particlefx2d/ruby2d/shape_renderer.rb
136
+ - lib/particlefx2d/ruby2d/shape_renderer_factory.rb
137
+ - lib/particlefx2d/version.rb
138
+ - lib/particlefx_ruby2d.rb
139
+ - particlefx2d.gemspec
140
+ - sig/particlefx2d.rbs
141
+ - spec/spec_helper.rb
142
+ - spec/unit/particlefx2d_spec.rb
143
+ homepage: https://github.com/nogginly/particlefx2d
144
+ licenses:
145
+ - MIT
146
+ metadata:
147
+ homepage_uri: https://github.com/nogginly/particlefx2d
148
+ rubygems_mfa_required: 'true'
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: 2.7.0
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubygems_version: 3.3.7
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: 2D particle effects API for use with any Ruby graphics API.
168
+ test_files:
169
+ - spec/spec_helper.rb
170
+ - spec/unit/particlefx2d_spec.rb