rubysketch 0.3.21 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,101 @@
1
+ module RubySketch
2
+
3
+
4
+ class Sprite
5
+
6
+ extend Forwardable
7
+
8
+ def initialize(x = 0, y = 0, w = nil, h = nil, image: nil, offset: nil, dynamic: false)
9
+ w ||= image&.width || 0
10
+ h ||= image&.height || 0
11
+ raise 'invalid size' unless w >= 0 && h >= 0
12
+
13
+ @image__, @offset__ = image, offset
14
+ @view__ = View.new self, x: x, y: y, w: w, h: h, back: :white, dynamic: dynamic
15
+ end
16
+
17
+ def_delegators :@view__,
18
+ :x, :x=,
19
+ :y, :y=,
20
+ :w, :h,
21
+ :width, :height,
22
+ :dynamic?, :dynamic=,
23
+ :density, :density=,
24
+ :friction, :friction=,
25
+ :restitution, :restitution=
26
+
27
+ def update(&block)
28
+ @view__.update = block
29
+ end
30
+
31
+ def contact(&block)
32
+ @view__.contact = block
33
+ end
34
+
35
+ def position()
36
+ @view__.position.toVector
37
+ end
38
+
39
+ def position=(vector)
40
+ @view__.position = vector.getInternal__
41
+ end
42
+
43
+ def size()
44
+ @view__.size.toVector
45
+ end
46
+
47
+ def image()
48
+ @image__
49
+ end
50
+
51
+ def offset()
52
+ @offset__
53
+ end
54
+
55
+ def velocity()
56
+ @view__.velocity.toVector
57
+ end
58
+
59
+ def velocity=(vector)
60
+ @view__.velocity = vector.getInternal__
61
+ end
62
+
63
+ alias pos position
64
+ alias pos= position=
65
+ alias vel velocity
66
+ alias vel= velocity=
67
+ alias dens density
68
+ alias dens= density=
69
+ alias fric friction
70
+ alias fric= friction
71
+ alias rest restitution
72
+ alias rest= restitution=
73
+
74
+ # @private
75
+ def getInternal__()
76
+ @view__
77
+ end
78
+
79
+ class View < Reflex::View
80
+ attr_accessor :update, :contact
81
+ attr_reader :sprite
82
+
83
+ def initialize(sprite, *a, **k, &b)
84
+ @sprite = sprite
85
+ super(*a, **k, &b)
86
+ end
87
+
88
+ def on_update(e)
89
+ @update.call if @update
90
+ end
91
+
92
+ def on_contact(e)
93
+ v = e.view
94
+ @contact.call v.sprite, e.action if @contact && v.is_a?(View)
95
+ end
96
+ end
97
+
98
+ end# Sprite
99
+
100
+
101
+ end# RubySketch
data/lib/rubysketch.rb CHANGED
@@ -1,12 +1,30 @@
1
- require 'set'
2
- require 'digest/sha1'
3
- require 'pathname'
4
- require 'tmpdir'
5
- require 'open-uri'
6
-
7
- require 'reflex'
8
- require 'rubysketch/module'
9
- require 'rubysketch/app'
10
- require 'rubysketch/window'
11
- require 'rubysketch/processing'
12
- require 'rubysketch/glsl'
1
+ require 'rubysketch/all'
2
+
3
+
4
+ module RubySketch
5
+ WINDOW = Processing::Window.new {start}
6
+ CONTEXT = RubySketch::Context.new WINDOW
7
+
8
+ refine Object do
9
+ (CONTEXT.methods - Object.instance_methods).each do |method|
10
+ define_method method do |*args, **kwargs, &block|
11
+ CONTEXT.__send__ method, *args, **kwargs, &block
12
+ end
13
+ end
14
+ end
15
+ end# RubySketch
16
+
17
+
18
+ begin
19
+ w, c = RubySketch::WINDOW, RubySketch::CONTEXT
20
+
21
+ c.class.constants.each do |const|
22
+ self.class.const_set const, c.class.const_get(const)
23
+ end
24
+
25
+ w.__send__ :begin_draw
26
+ at_exit do
27
+ w.__send__ :end_draw
28
+ Processing::App.new {w.show}.start if c.hasDrawBlock__ && !$!
29
+ end
30
+ end
data/rubysketch.gemspec CHANGED
@@ -4,7 +4,7 @@
4
4
  File.expand_path('lib', __dir__)
5
5
  .tap {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
6
6
 
7
- require 'rubysketch/module'
7
+ require 'rubysketch/extension'
8
8
 
9
9
 
10
10
  Gem::Specification.new do |s|
@@ -12,24 +12,31 @@ Gem::Specification.new do |s|
12
12
  patterns.map {|pat| Dir.glob(pat).to_a}.flatten
13
13
  end
14
14
 
15
- mod = RubySketch::Module
16
- name = mod.name.downcase
15
+ ext = RubySketch::Extension
16
+ name = ext.name.downcase
17
17
  rdocs = glob.call *%w[README]
18
18
 
19
19
  s.name = name
20
- s.summary = 'Processing like Creative Coding Framework.'
21
- s.description = 'Creative Coding Framework have API compatible to Processing API or p5.js.'
22
- s.version = mod.version
20
+ s.summary = 'A game engine based on the Processing API.'
21
+ s.description = 'A game engine based on the Processing API.'
22
+ s.version = ext.version
23
23
 
24
24
  s.authors = %w[xordog]
25
25
  s.email = 'xordog@gmail.com'
26
26
  s.homepage = "https://github.com/xord/rubysketch"
27
27
 
28
28
  s.platform = Gem::Platform::RUBY
29
- s.required_ruby_version = '>= 2.6.0'
29
+ s.required_ruby_version = '>= 2.7.0'
30
30
 
31
- s.add_runtime_dependency 'reflexion', '~> 0.1.28'
31
+ s.add_runtime_dependency 'xot', '~> 0.1.32'
32
+ s.add_runtime_dependency 'rucy', '~> 0.1.32'
33
+ s.add_runtime_dependency 'beeps', '~> 0.1.32'
34
+ s.add_runtime_dependency 'rays', '~> 0.1.32'
35
+ s.add_runtime_dependency 'reflexion', '~> 0.1.32'
36
+ s.add_runtime_dependency 'processing', '~> 0.5.1'
32
37
 
38
+ s.add_development_dependency 'rake'
39
+ s.add_development_dependency 'test-unit'
33
40
  s.add_development_dependency 'yard'
34
41
 
35
42
  s.files = `git ls-files`.split $/
@@ -8,8 +8,4 @@
8
8
 
9
9
  + (void) start: (NSString*) path;
10
10
 
11
- + (void) setActiveReflexViewController: (id) reflexViewController;
12
-
13
- + (void) resetActiveReflexViewController;
14
-
15
11
  @end
@@ -0,0 +1,25 @@
1
+ // -*- mode: objc -*-
2
+ #import <CRuby.h>
3
+ #import "RubyProcessing.h"
4
+ #import "RubySketch.h"
5
+
6
+
7
+ @implementation RubySketch
8
+
9
+ + (void) setup
10
+ {
11
+ static BOOL done = NO;
12
+ if (done) return;
13
+ done = YES;
14
+
15
+ [RubyProcessing setup];
16
+ [CRuby addLibrary:@"RubySketch" bundle:[NSBundle bundleForClass:RubySketch.class]];
17
+ }
18
+
19
+ + (void) start: (NSString*) path
20
+ {
21
+ [CRuby evaluate:@"raise 'already started' unless require 'rubysketch'\n"];
22
+ [RubyProcessing start: path];
23
+ }
24
+
25
+ @end
data/test/helper.rb CHANGED
@@ -1,19 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
 
4
- %w[../xot ../rucy ../rays ../reflex .]
5
- .map {|s| File.expand_path "../../#{s}/lib", __FILE__}
4
+ %w[../xot ../rucy ../rays ../reflex ../processing .]
5
+ .map {|s| File.expand_path "../#{s}/lib", __dir__}
6
6
  .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
7
7
 
8
8
  require 'test/unit'
9
9
  require 'xot/test'
10
- require 'rubysketch'
10
+ require 'rubysketch/all'
11
11
 
12
12
  include Xot::Test
13
-
14
-
15
- def assert_equal_vector(v1, v2, delta = 0.000001)
16
- assert_in_delta v1.x, v2.x, delta
17
- assert_in_delta v1.y, v2.y, delta
18
- assert_in_delta v1.z, v2.z, delta
19
- end
@@ -0,0 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ require_relative 'helper'
5
+
6
+
7
+ class TestSprite < Test::Unit::TestCase
8
+
9
+ def sprite(*args, **kwargs)
10
+ RubySketch::Sprite.new(*args, **kwargs)
11
+ end
12
+
13
+ def vec(*args, **kwargs)
14
+ Processing::Vector.new(*args, **kwargs)
15
+ end
16
+
17
+ def test_initialize()
18
+ assert_equal 0, sprite.x
19
+ assert_equal 0, sprite.y
20
+ assert_equal vec(0, 0), sprite.pos
21
+ end
22
+
23
+ end# TestSprite
metadata CHANGED
@@ -1,29 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysketch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.21
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-04 00:00:00.000000000 Z
11
+ date: 2023-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: xot
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.32
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.32
27
+ - !ruby/object:Gem::Dependency
28
+ name: rucy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.32
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.32
41
+ - !ruby/object:Gem::Dependency
42
+ name: beeps
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.32
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.32
55
+ - !ruby/object:Gem::Dependency
56
+ name: rays
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.32
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.32
13
69
  - !ruby/object:Gem::Dependency
14
70
  name: reflexion
15
71
  requirement: !ruby/object:Gem::Requirement
16
72
  requirements:
17
73
  - - "~>"
18
74
  - !ruby/object:Gem::Version
19
- version: 0.1.28
75
+ version: 0.1.32
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.1.32
83
+ - !ruby/object:Gem::Dependency
84
+ name: processing
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.5.1
20
90
  type: :runtime
21
91
  prerelease: false
22
92
  version_requirements: !ruby/object:Gem::Requirement
23
93
  requirements:
24
94
  - - "~>"
25
95
  - !ruby/object:Gem::Version
26
- version: 0.1.28
96
+ version: 0.5.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: test-unit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
27
125
  - !ruby/object:Gem::Dependency
28
126
  name: yard
29
127
  requirement: !ruby/object:Gem::Requirement
@@ -38,14 +136,16 @@ dependencies:
38
136
  - - ">="
39
137
  - !ruby/object:Gem::Version
40
138
  version: '0'
41
- description: Creative Coding Framework have API compatible to Processing API or p5.js.
139
+ description: A game engine based on the Processing API.
42
140
  email: xordog@gmail.com
43
141
  executables: []
44
142
  extensions: []
45
143
  extra_rdoc_files: []
46
144
  files:
47
- - ".github/workflows/release.yml"
145
+ - ".github/workflows/release-gem.yml"
146
+ - ".github/workflows/tag.yml"
48
147
  - ".github/workflows/test.yml"
148
+ - ".github/workflows/utils.rb"
49
149
  - ".gitignore"
50
150
  - ".yardopts"
51
151
  - ChangeLog.md
@@ -55,28 +155,19 @@ files:
55
155
  - Rakefile
56
156
  - RubySketch.podspec
57
157
  - VERSION
58
- - examples/breakout.rb
59
- - examples/camera.rb
60
- - examples/clock.rb
61
- - examples/delay_camera.rb
62
- - examples/glsl.rb
63
158
  - examples/hello.rb
64
- - examples/image.rb
65
- - examples/shapes.rb
66
- - lib/rubysketch-glsl.rb
67
- - lib/rubysketch-processing.rb
68
159
  - lib/rubysketch.rb
69
- - lib/rubysketch/app.rb
70
- - lib/rubysketch/glsl.rb
71
- - lib/rubysketch/module.rb
72
- - lib/rubysketch/processing.rb
73
- - lib/rubysketch/window.rb
160
+ - lib/rubysketch/all.rb
161
+ - lib/rubysketch/context.rb
162
+ - lib/rubysketch/extension.rb
163
+ - lib/rubysketch/graphics_context.rb
164
+ - lib/rubysketch/helper.rb
165
+ - lib/rubysketch/sprite.rb
74
166
  - rubysketch.gemspec
75
- - src/RubySketch.h
76
- - src/RubySketch.mm
167
+ - src/RubyProcessing.h
168
+ - src/RubyProcessing.mm
77
169
  - test/helper.rb
78
- - test/processing/test_utility.rb
79
- - test/processing/test_vector.rb
170
+ - test/test_sprite.rb
80
171
  homepage: https://github.com/xord/rubysketch
81
172
  licenses: []
82
173
  metadata: {}
@@ -88,18 +179,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
179
  requirements:
89
180
  - - ">="
90
181
  - !ruby/object:Gem::Version
91
- version: 2.6.0
182
+ version: 2.7.0
92
183
  required_rubygems_version: !ruby/object:Gem::Requirement
93
184
  requirements:
94
185
  - - ">="
95
186
  - !ruby/object:Gem::Version
96
187
  version: '0'
97
188
  requirements: []
98
- rubygems_version: 3.2.33
189
+ rubygems_version: 3.4.6
99
190
  signing_key:
100
191
  specification_version: 4
101
- summary: Processing like Creative Coding Framework.
192
+ summary: A game engine based on the Processing API.
102
193
  test_files:
103
194
  - test/helper.rb
104
- - test/processing/test_utility.rb
105
- - test/processing/test_vector.rb
195
+ - test/test_sprite.rb
data/examples/breakout.rb DELETED
@@ -1,212 +0,0 @@
1
- %w[xot rays reflex rubysketch]
2
- .map {|s| File.expand_path "../../#{s}/lib", __dir__}
3
- .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
4
-
5
- require 'rubysketch-processing'
6
-
7
-
8
- PADDING = 50
9
- BRICK_COUNT = 10
10
-
11
- $objs = []
12
- $bar = nil
13
- $gameover = false
14
-
15
- setup do
16
- addWalls
17
- addBricks
18
-
19
- colorMode HSB, 360, 100, 100
20
- ellipseMode CORNER
21
- background 0
22
- noStroke
23
- fill 0, 0, 100
24
- end
25
-
26
- draw do
27
- background 0
28
- $objs.each do |o|
29
- o.update
30
- o.draw
31
- end
32
- drawTexts
33
- end
34
-
35
- mousePressed do
36
- start unless started?
37
- end
38
-
39
- mouseDragged do
40
- $bar.pos.x = mouseX - $bar.w / 2 if $bar
41
- end
42
-
43
- def start()
44
- $bar = Bar.new
45
- $objs += [$bar, Ball.new($bar)]
46
- end
47
-
48
- def started?()
49
- $bar
50
- end
51
-
52
- def gameover?()
53
- started? &&
54
- $objs.count {|o| o.kind_of? Ball} == 0
55
- end
56
-
57
- def cleared?()
58
- started? && !gameover? &&
59
- $objs.count {|o| o.kind_of? Brick} == 0
60
- end
61
-
62
- def addWalls()
63
- left = Obj.new 0, 0, 10, height
64
- top = Obj.new 0, 0, width, 10
65
- right = Obj.new width - 10, 0, 10, height
66
- bottom = Bottom.new 0, height - 10, width, 10
67
- $objs += [top, bottom, left, right]
68
- end
69
-
70
- def addBricks()
71
- brickW = (width - PADDING * 2) / BRICK_COUNT
72
- 5.times do |y|
73
- BRICK_COUNT.times do |x|
74
- xx = PADDING + brickW * x
75
- yy = PADDING + 30 * y
76
- $objs.push Brick.new(xx, yy, brickW - 5, 20, y * 60)
77
- end
78
- end
79
- end
80
-
81
- def drawTexts()
82
- push do
83
- textAlign CENTER, CENTER
84
-
85
- if !started?
86
- fill 50, 100, 100
87
- textSize 50
88
- text "BREAKOUT", 0, 0, width, height
89
- textSize 20
90
- translate 0, 100
91
- text "Tap to start!", 0, 0, width, height
92
- elsif cleared?
93
- fill 100, 80, 100
94
- textSize 50
95
- text "CLEAR!", 0, 0, width, height
96
- elsif gameover?
97
- fill 0, 20, 100
98
- textSize 50
99
- text "GAMEOVER", 0, 0, width, height
100
- end
101
- end
102
- end
103
-
104
- class Obj
105
- attr_reader :pos, :w, :h, :vel
106
-
107
- def initialize(x, y, w, h, vx = 0, vy = 0)
108
- @pos = createVector x, y
109
- @w, @h = w, h
110
- @vel = createVector vx, vy
111
- end
112
-
113
- def update()
114
- @pos.add @vel
115
- end
116
-
117
- def draw()
118
- rect @pos.x, @pos.y, @w, @h
119
- end
120
-
121
- def bounds()
122
- x, y = @pos.x, @pos.y
123
- return x, y, x + @w, y + @h
124
- end
125
-
126
- def center()
127
- createVector @pos.x + @w / 2, @pos.y + @h / 2
128
- end
129
- end
130
-
131
- class Ball < Obj
132
- def initialize(bar)
133
- super bar.pos.x, bar.pos.y - bar.h, 20, 20
134
- self.vel = createVector random(-1, 1), -1
135
- end
136
-
137
- def vel=(v)
138
- @vel = v.dup.normalize.mult 8
139
- end
140
-
141
- def update()
142
- b = bounds.dup
143
- super
144
- checkHit b
145
- end
146
-
147
- def checkHit(prevBounds)
148
- x1, y1, x2, y2 = prevBounds
149
- hitH = hitV = false
150
- hits = []
151
- $objs.each do |o|
152
- next if o == self
153
- next unless intersect? o
154
- hits.push o
155
- ox1, oy1, ox2, oy2 = o.bounds
156
- hitH ||= !overlap?(x1, x2, ox1, ox2)
157
- hitV ||= !overlap?(y1, y2, oy1, oy2)
158
- end
159
- vel.x *= -1 if hitH
160
- vel.y *= -1 if hitV
161
-
162
- hits.each {|o| hit o}
163
- end
164
-
165
- def intersect?(o)
166
- x1, y1, x2, y2 = bounds
167
- ox1, oy1, ox2, oy2 = o.bounds
168
- overlap?(x1, x2, ox1, ox2) && overlap?(y1, y2, oy1, oy2)
169
- end
170
-
171
- def overlap?(a1, a2, b1, b2)
172
- a1 <= b2 && b1 <= a2
173
- end
174
-
175
- def hit(o)
176
- case o
177
- when Bar then self.vel = center.sub o.center
178
- when Brick then $objs.delete o
179
- when Bottom then $objs.delete self unless cleared?
180
- end
181
- end
182
- end
183
-
184
- class Bar < Obj
185
- def initialize()
186
- w = 100
187
- super (width - w) / 2, height - 50, w, 20
188
- end
189
- end
190
-
191
- class Brick < Obj
192
- def initialize(x, y, w, h, hue)
193
- super x, y, w, h
194
- @hue = hue
195
- end
196
-
197
- def draw()
198
- push do
199
- fill @hue, 50, 100
200
- super
201
- end
202
- end
203
- end
204
-
205
- class Bottom < Obj
206
- def draw()
207
- push do
208
- fill 0, 0, 50
209
- super
210
- end
211
- end
212
- end