rubysketch 0.5.28 → 0.5.31

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a27c613bb9a268367ce581b9b4caa9e89d546f763680ec8b9b408bdadaed0c16
4
- data.tar.gz: b0503752020cc76e453922183b34c78d049c2c3b4665438cc024286cadf679c5
3
+ metadata.gz: ee4bec833e545d64ac7822c59d7b52e92a507ac23d909fd6143f15dace1ed8c4
4
+ data.tar.gz: 8151adda147364200efe13a96b2fce82b00c01fa25cb84c69f4de6ba5d9a6a4d
5
5
  SHA512:
6
- metadata.gz: 43c0549b9f6b9381351dad8204a389cf96e80da008d9b0c4a656ad67749a5736a9aff196378905cd42ef012df46e09a49c16f6176882a01cf292cab03056e315
7
- data.tar.gz: a66d891ae5a36ba98adb5611f5c5ed7c79f517dcf12a44d2debdcd175dbc2e7e4a8673358ea532712d5a02858f72452139677eb632913f390b6bfbf64ab27c8d
6
+ metadata.gz: d85c90842181d311cee151604fc1c38edc6d5b2d1caba4d3c9f206f512d98b5f93ced450f8ec6aaa760781bdfc61c8d92644cdc2f2b4811c63b7f81f70091ca2
7
+ data.tar.gz: 94978e5eadf6fbd607c4762adec4049df1930123be74c5cee46dfb582c0ec76f907f8a3e214cc162d779a9b96bc12a4904cd054f60ecae921db3abdb57a5ff0c
data/ChangeLog.md CHANGED
@@ -1,6 +1,23 @@
1
1
  # rubysketch ChangeLog
2
2
 
3
3
 
4
+ ## [v0.5.31] - 2023-10-25
5
+
6
+ - Add toon.rb
7
+
8
+
9
+ ## [v0.5.30] - 2023-08-24
10
+
11
+ - Fix failed test
12
+
13
+
14
+ ## [v0.5.29] - 2023-08-23
15
+
16
+ - Add Sprite#contact_end()
17
+ - Sprite.new() can take 'physics:' keyword parameter
18
+ - Fix that calling clearInterval() inside interval timer block would be ignored
19
+
20
+
4
21
  ## [v0.5.28] - 2023-07-30
5
22
 
6
23
  - Update dependencies
@@ -8,7 +25,7 @@
8
25
 
9
26
  ## [v0.5.27] - 2023-07-30
10
27
 
11
- - add vibrate()
28
+ - Add vibrate()
12
29
 
13
30
 
14
31
  ## [v0.5.26] - 2023-07-26
@@ -46,12 +63,12 @@
46
63
 
47
64
  ## [v0.5.20] - 2023-07-09
48
65
 
49
- - fix that calling mousePressed() without block removes mousePressed block
66
+ - Fix that calling mousePressed() without block removes mousePressed block
50
67
 
51
68
 
52
69
  ## [v0.5.19] - 2023-06-27
53
70
 
54
- - add loadSound() and RubySketch::Sound class
71
+ - Add loadSound() and RubySketch::Sound class
55
72
 
56
73
 
57
74
  ## [v0.5.18] - 2023-06-22
@@ -93,8 +110,8 @@
93
110
 
94
111
  ## [v0.5.11] - 2023-05-26
95
112
 
96
- - add left, top, right, and bottom accessors to Sprite class
97
- - add show(), hide(), and hidden?() to Sprite class
113
+ - Add left, top, right, and bottom accessors to Sprite class
114
+ - Add show(), hide(), and hidden?() to Sprite class
98
115
 
99
116
 
100
117
  ## [v0.5.10] - 2023-05-21
@@ -161,19 +178,19 @@
161
178
 
162
179
  ## [v0.5.2] - 2023-03-02
163
180
 
164
- - depend to processing-0.5.2 gem
181
+ - Depend to processing-0.5.2 gem
165
182
 
166
183
 
167
184
  ## [v0.5.1] - 2023-03-01
168
185
 
169
- - fix bugs
186
+ - Fix bugs
170
187
 
171
188
 
172
189
  ## [v0.5.0] - 2023-02-09
173
190
 
174
- - add Sprite class
191
+ - Add Sprite class
175
192
 
176
193
 
177
194
  ## [v0.4.0] - 2023-02-08
178
195
 
179
- - first version
196
+ - First version
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.28
1
+ 0.5.31
data/examples/toon.rb ADDED
@@ -0,0 +1,181 @@
1
+ %w[xot rucy beeps rays reflex processing 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'
6
+ using RubySketch
7
+
8
+
9
+ class Canvas < Sprite
10
+
11
+ def initialize(width, height, scale: 1)
12
+ super 0, 0, width, height
13
+
14
+ @width, @height, @scale = width, height, scale
15
+ @images, @frame = [], 0
16
+
17
+ brushSize 1
18
+ brushColor 0, 0, 0, 255
19
+
20
+ self.draw do
21
+ drawImage self.image, 0, 0, self.width * self.scale, self.height * self.scale
22
+ end
23
+
24
+ self.mousePressed {brushStarted self.mouseX / self.scale, self.mouseY / self.scale}
25
+ self.mouseReleased {brushEnded self.mouseX / self.scale, self.mouseY / self.scale}
26
+ self.mouseDragged {brushMoved self.mouseX / self.scale, self.mouseY / self.scale}
27
+ end
28
+
29
+ attr_reader :width, :height, :scale
30
+
31
+ def image()
32
+ @images.insert @frame, createImage(width, height) if @frame >= @images.size
33
+ @images[@frame]
34
+ end
35
+
36
+ def play()
37
+ setInterval 0.2, id: :play do
38
+ @frame += 1
39
+ @frame = 0 if @frame >= @images.size
40
+ end
41
+ end
42
+
43
+ def stop()
44
+ clearInterval :play
45
+ end
46
+
47
+ def nextFrame()
48
+ @frame += 1
49
+ end
50
+
51
+ def prevFrame()
52
+ @frame -= 1
53
+ @frame = 0 if @frame < 0
54
+ end
55
+
56
+ def brushSize(size)
57
+ @brushSize = size
58
+ end
59
+
60
+ def brushColor(r, g, b, a = 255)
61
+ @brushColor = [r, g, b, a]
62
+ end
63
+
64
+ def drawPoint(x, y)
65
+ image.beginDraw do |g|
66
+ g.noFill
67
+ g.strokeWeight @brushSize
68
+ g.stroke *@brushColor
69
+ g.point x, y
70
+ end
71
+ end
72
+
73
+ def drawLine(x1, y1, x2, y2)
74
+ image.beginDraw do |g|
75
+ g.noFill
76
+ g.strokeWeight @brushSize
77
+ g.stroke *@brushColor
78
+ g.line x1, y1, x2, y2
79
+ end
80
+ end
81
+
82
+ def brushStarted(x, y)
83
+ drawPoint x, y
84
+ @prevPoint = [x, y]
85
+ end
86
+
87
+ def brushEnded(x, y)
88
+ @prevPoint = nil
89
+ end
90
+
91
+ def brushMoved(x, y)
92
+ return unless @prevPoint
93
+ drawLine *@prevPoint, x, y
94
+ @prevPoint = [x, y]
95
+ end
96
+
97
+ private
98
+
99
+ def createImage(w, h)
100
+ createGraphics(w, h).tap do |g|
101
+ g.beginDraw do
102
+ g.background 255
103
+ end
104
+ end
105
+ end
106
+
107
+ end# Canvas
108
+
109
+
110
+ class Button < Sprite
111
+
112
+ def initialize(label, x = 0, y = 0, w = 100, h = 44, rgb: [200, 200, 200], &block)
113
+ super x, y, w, h
114
+
115
+ draw do
116
+ round, offset = 12, 8
117
+ ww, hh = self.w, self.h - offset
118
+ yy = mousePressed ? 6 : 0
119
+
120
+ fill *rgb.map {_1 - 32}
121
+ rect 0, offset, ww, hh, round
122
+
123
+ fill *rgb
124
+ rect 0, yy, ww, hh, round
125
+
126
+ textAlign CENTER, CENTER
127
+ fill 0
128
+ text label, 0, yy, ww, hh
129
+ end
130
+
131
+ mouseClicked do
132
+ block.call
133
+ end
134
+ end
135
+
136
+ end# Button
137
+
138
+
139
+ class App
140
+
141
+ MARGIN = 10
142
+
143
+ def initialize()
144
+ setTitle 'Toon!'
145
+ size 800, 600
146
+ noStroke
147
+
148
+ @canvas = Canvas.new 160, 120, scale: 3
149
+ @buttons = [
150
+ Button.new('Play', rgb: [240, 180, 180]) {@canvas.play},
151
+ Button.new('Stop', rgb: [240, 180, 180]) {@canvas.stop},
152
+ Button.new('Next', rgb: [180, 240, 180]) {@canvas.nextFrame},
153
+ Button.new('Previous', rgb: [180, 240, 180]) {@canvas.prevFrame},
154
+ Button.new('Brush 1px', rgb: [180, 180, 240]) {@canvas.brushSize 1},
155
+ Button.new('Brush 3px', rgb: [180, 180, 240]) {@canvas.brushSize 3},
156
+ Button.new('Brush 5px', rgb: [180, 180, 240]) {@canvas.brushSize 5},
157
+ ]
158
+ @sprites = [@canvas, *@buttons]
159
+ @sprites.each {addSprite _1}
160
+ end
161
+
162
+ def draw()
163
+ background 100
164
+ sprite *@sprites
165
+ end
166
+
167
+ def resized()
168
+ @buttons.first.pos = [MARGIN, MARGIN]
169
+ @buttons.each_cons(2) {_2.pos = [MARGIN, _1.bottom + MARGIN]}
170
+
171
+ @canvas.pos = [@buttons.first.right + MARGIN, MARGIN]
172
+ @canvas.right = windowWidth
173
+ @canvas.bottom = windowHeight
174
+ end
175
+
176
+ end# App
177
+
178
+
179
+ setup {$app = App.new}
180
+ draw {$app.draw}
181
+ windowResized {$app.resized if $app}
@@ -59,8 +59,8 @@ module RubySketch
59
59
  now, nextTime = Time.now.to_f, startTime + seconds
60
60
  nextTime = now if nextTime < now
61
61
  setTimeout__ id, nextTime do
62
- block.call(*args)
63
62
  setInterval__ id, nextTime, seconds, args, &block
63
+ block.call(*args)
64
64
  end
65
65
  end
66
66
 
@@ -37,7 +37,7 @@ module RubySketch
37
37
  #
38
38
  def initialize(
39
39
  x = 0, y = 0, w = nil, h = nil, image: nil, offset: nil,
40
- context: nil)
40
+ physics: true, context: nil)
41
41
 
42
42
  w ||= (image&.width || 0)
43
43
  h ||= (image&.height || 0)
@@ -47,7 +47,7 @@ module RubySketch
47
47
  @context__ = context || Context.context__
48
48
  @view__ = SpriteView.new(
49
49
  self, x: x, y: y, w: w, h: h,
50
- static: true, density: 1, friction: 0, restitution: 0,
50
+ physics: physics, density: 1, friction: 0, restitution: 0,
51
51
  back: :white)
52
52
 
53
53
  self.image = image if image
@@ -842,6 +842,21 @@ module RubySketch
842
842
  #
843
843
  def contact(&block)
844
844
  @view__.contact = block if block
845
+ nil
846
+ end
847
+
848
+ # Defines contact_end block.
849
+ #
850
+ # @example Call jumping() when the player sprite leaves the ground sprite
851
+ # playerSprite.contact_end do |o|
852
+ # jumping if o == groundSprite
853
+ # end
854
+ #
855
+ # @return [nil] nil
856
+ #
857
+ def contact_end(&block)
858
+ @view__.contact_end = block if block
859
+ nil
845
860
  end
846
861
 
847
862
  # Defines contact? block.
@@ -855,6 +870,7 @@ module RubySketch
855
870
  #
856
871
  def contact?(&block)
857
872
  @view__.will_contact = block if block
873
+ nil
858
874
  end
859
875
 
860
876
  # @private
@@ -871,13 +887,13 @@ module RubySketch
871
887
  attr_accessor :update,
872
888
  :mousePressed, :mouseReleased, :mouseMoved, :mouseDragged, :mouseClicked,
873
889
  :touchStarted, :touchEnded, :touchMoved,
874
- :contact, :will_contact
890
+ :contact, :contact_end, :will_contact
875
891
 
876
892
  attr_reader :sprite, :touches
877
893
 
878
- def initialize(sprite, *a, **k, &b)
894
+ def initialize(sprite, *args, physics:, **kwargs, &block)
879
895
  @sprite = sprite
880
- super(*a, **k, &b)
896
+ super(*args, **kwargs, &block)
881
897
 
882
898
  @error = nil
883
899
  @pointer = nil
@@ -885,6 +901,8 @@ module RubySketch
885
901
  @pointersPressed = []
886
902
  @pointersReleased = []
887
903
  @touches = []
904
+
905
+ self.static = true if physics
888
906
  end
889
907
 
890
908
  def mouseX()
@@ -957,8 +975,15 @@ module RubySketch
957
975
  end
958
976
 
959
977
  def on_contact_begin(e)
978
+ return unless @contact
979
+ v = e.view
980
+ call_block @contact, v.sprite if v.respond_to?(:sprite)
981
+ end
982
+
983
+ def on_contact_end(e)
984
+ return unless @contact_end
960
985
  v = e.view
961
- call_block @contact, v.sprite, e.action if v.respond_to?(:sprite)
986
+ call_block @contact_end, v.sprite if v.respond_to?(:sprite)
962
987
  end
963
988
 
964
989
  def will_contact?(v)
@@ -997,7 +1022,7 @@ module RubySketch
997
1022
  end
998
1023
 
999
1024
  def mouseClicked?()
1000
- return false unless @pointer && @pointerDownStartPos
1025
+ return false unless parent && @pointer && @pointerDownStartPos
1001
1026
  [to_screen(@pointer.pos), @pointerDownStartPos]
1002
1027
  .map {|pos| Rays::Point.new pos.x, pos.y, 0}
1003
1028
  .then {|pos, startPos| (pos - startPos).length < 3}
data/rubysketch.gemspec CHANGED
@@ -26,11 +26,11 @@ Gem::Specification.new do |s|
26
26
  s.required_ruby_version = '>= 3.0.0'
27
27
 
28
28
  s.add_runtime_dependency 'xot', '~> 0.1.39'
29
- s.add_runtime_dependency 'rucy', '~> 0.1.39'
30
- s.add_runtime_dependency 'beeps', '~> 0.1.41'
31
- s.add_runtime_dependency 'rays', '~> 0.1.43'
32
- s.add_runtime_dependency 'reflexion', '~> 0.1.51'
33
- s.add_runtime_dependency 'processing', '~> 0.5.27'
29
+ s.add_runtime_dependency 'rucy', '~> 0.1.40'
30
+ s.add_runtime_dependency 'beeps', '~> 0.1.42'
31
+ s.add_runtime_dependency 'rays', '~> 0.1.44'
32
+ s.add_runtime_dependency 'reflexion', '~> 0.1.52'
33
+ s.add_runtime_dependency 'processing', '~> 0.5.28'
34
34
 
35
35
  s.add_development_dependency 'rake'
36
36
  s.add_development_dependency 'test-unit'
data/test/test_sprite.rb CHANGED
@@ -272,21 +272,31 @@ class TestSprite < Test::Unit::TestCase
272
272
  v = s.instance_variable_get :@view__
273
273
  assert_nil v.update
274
274
  assert_nil v.contact
275
+ assert_nil v.contact_end
275
276
  assert_nil v.will_contact
276
277
 
277
278
  s.update {}
278
279
  assert_not_nil v.update
279
280
  assert_nil v.contact
281
+ assert_nil v.contact_end
280
282
  assert_nil v.will_contact
281
283
 
282
284
  s.contact {}
283
285
  assert_not_nil v.update
284
286
  assert_not_nil v.contact
287
+ assert_nil v.contact_end
288
+ assert_nil v.will_contact
289
+
290
+ s.contact_end {}
291
+ assert_not_nil v.update
292
+ assert_not_nil v.contact
293
+ assert_not_nil v.contact_end
285
294
  assert_nil v.will_contact
286
295
 
287
296
  s.contact? {}
288
297
  assert_not_nil v.update
289
298
  assert_not_nil v.contact
299
+ assert_not_nil v.contact_end
290
300
  assert_not_nil v.will_contact
291
301
  end
292
302
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysketch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.28
4
+ version: 0.5.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-30 00:00:00.000000000 Z
11
+ date: 2023-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xot
@@ -30,70 +30,70 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.39
33
+ version: 0.1.40
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.39
40
+ version: 0.1.40
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: beeps
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.41
47
+ version: 0.1.42
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.1.41
54
+ version: 0.1.42
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rays
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.1.43
61
+ version: 0.1.44
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.1.43
68
+ version: 0.1.44
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: reflexion
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.1.51
75
+ version: 0.1.52
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.1.51
82
+ version: 0.1.52
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: processing
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.5.27
89
+ version: 0.5.28
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.5.27
96
+ version: 0.5.28
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -158,6 +158,7 @@ files:
158
158
  - examples/hello.rb
159
159
  - examples/physics.rb
160
160
  - examples/sprite.rb
161
+ - examples/toon.rb
161
162
  - lib/rubysketch.rb
162
163
  - lib/rubysketch/all.rb
163
164
  - lib/rubysketch/context.rb