rubysketch 0.5.23 → 0.5.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db5c56e16498e5154331831f3bf4998b3b100f2ad3d3eb1f788ae47737565f30
4
- data.tar.gz: f727f500188243a395e6fb650b3abbfd490c2e9f1c57086e18f004dacc38e684
3
+ metadata.gz: 41b147fcb3fd31ea85f6b29b30681a0280140ded656677ade8bddf91399af6b8
4
+ data.tar.gz: 3cc93b88d182703d4c08750029058e0911fe3a17f9c98aa6f951482552c8f1b6
5
5
  SHA512:
6
- metadata.gz: cf517cd8f127348737c9bcdae738e450bf8115752e9e5d6cc02318c2d2735333ff8023c413a1e940639f025fa85630c3481b67d70169868e9cc1b9c301515ed8
7
- data.tar.gz: da8c7932841db2db82eede5d6bfbe4f0040e745b3d284ca58c041089b9cceff582b58800fd00d468a8efba62f62f6046623c900bb78dea8610d0aedbaca8aaa4
6
+ metadata.gz: 68665dc8c90267229151102218044d4a95f9a7fbdae5ed61dd8a16cdc9ef14b65b0b582e491bb5be7576618594721ad101e0923245dcb8ed20f004ed658c9c85
7
+ data.tar.gz: 94bdd58eda1690e820446a8b58fe2628110ec00d5093515416b9f0e64c2f31d9c545f075d436123abce715359cfe46f39a1d08f3125a1616248b15be2eead5eb
data/ChangeLog.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # rubysketch ChangeLog
2
2
 
3
3
 
4
+ ## [v0.5.25] - 2023-07-22
5
+
6
+ - Freeze EASINGS
7
+ - Fix that clearTimer() fails clearing timer in very rare cases
8
+
9
+
10
+ ## [v0.5.24] - 2023-07-21
11
+
12
+ - Add animate(), animateValue(), and EASINGS
13
+ - Add setTimeout(), setInterval(), and clearTimer() (also aliased as clearTimeout, clearInterval)
14
+
15
+
4
16
  ## [v0.5.23] - 2023-07-11
5
17
 
6
18
  - Update dependencies
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.23
1
+ 0.5.25
@@ -2,11 +2,11 @@ require 'beeps'
2
2
  require 'processing/all'
3
3
 
4
4
  require 'rubysketch/extension'
5
- require 'rubysketch/window'
6
5
  require 'rubysketch/helper'
7
6
 
8
7
  require 'rubysketch/sprite'
9
8
  require 'rubysketch/sound'
9
+ require 'rubysketch/easings'
10
10
  require 'rubysketch/context'
11
11
 
12
12
 
@@ -9,7 +9,134 @@ module RubySketch
9
9
  # @private
10
10
  def initialize(window)
11
11
  super
12
+ @timers__, @firingTimers__, @nextTimerID__ = {}, {}, 0
13
+
12
14
  @layer__ = window.add_overlay SpriteLayer.new
15
+
16
+ window.update_window = proc do
17
+ fireTimers__
18
+ Beeps.process_streams!
19
+ end
20
+ end
21
+
22
+ # Calls block after specified seconds
23
+ #
24
+ # @param [Numeric] seconds Time at which the block is called
25
+ # @param [Array] args Arguments passed to block
26
+ # @param [Object] id Timer object identifier
27
+ #
28
+ # @return [Object] Timer object identifier
29
+ #
30
+ def setTimeout(seconds = 0, *args, id: nextTimerID__, &block)
31
+ return unless block
32
+ setTimeout__ id, Time.now.to_f + seconds, args, &block
33
+ end
34
+
35
+ # Repeats block call at each interval
36
+ #
37
+ # @param [Numeric] seconds Each interval duration
38
+ # @param [Array] args Arguments passed to block
39
+ # @param [Object] id Timer object identifier
40
+ # @param [Boolean] now Wheather or not to call the block right now
41
+ #
42
+ # @return [Object] Timer object identifier
43
+ #
44
+ def setInterval(seconds = 0, *args, id: nextTimerID__, now: false, &block)
45
+ return unless block
46
+ time = Time.now.to_f
47
+ block.call *args if now
48
+ setInterval__ id, time, seconds, args, &block
49
+ end
50
+
51
+ # @private
52
+ def setTimeout__(id, time, args = [], &block)
53
+ @timers__[id] = [time, args, block]
54
+ id
55
+ end
56
+
57
+ # @private
58
+ def setInterval__(id, startTime, seconds, args = [], &block)
59
+ now, nextTime = Time.now.to_f, startTime + seconds
60
+ nextTime = now if nextTime < now
61
+ setTimeout__ id, nextTime do
62
+ block.call *args
63
+ setInterval__ id, nextTime, seconds, args, &block
64
+ end
65
+ end
66
+
67
+ # Stops timeout or interval timer by id
68
+ #
69
+ # @param [Object] id The identifier of timeout or interval timer to stop
70
+ #
71
+ # @return [nil] nil
72
+ #
73
+ def clearTimer(id)
74
+ [@timers__, @firingTimers__].each {|timers| timers.delete id}
75
+ nil
76
+ end
77
+
78
+ alias clearTimeout clearTimer
79
+ alias clearInterval clearTimer
80
+
81
+ # @private
82
+ def nextTimerID__()
83
+ @nextTimerID__ += 1
84
+ @nextTimerID__
85
+ end
86
+
87
+ # @private
88
+ def fireTimers__()
89
+ now = Time.now.to_f
90
+ @firingTimers__.clear
91
+ @timers__.delete_if do |id, (time, args, block)|
92
+ (now >= time).tap {|fire| @firingTimers__[id] = [block, args] if fire}
93
+ end
94
+ @firingTimers__.each {|_, (block, args)| block.call *args}
95
+ end
96
+
97
+ # Animate with easing functions
98
+ #
99
+ # @param [Numeric] seconds Animation duration
100
+ # @param [Object] id Timer object identifier
101
+ # @param [Symbol] easing Easing function name
102
+ #
103
+ # @return [Object] Timer object identifier
104
+ #
105
+ def animate(seconds, id: nextTimerID__, easing: :expoOut, &block)
106
+ fun = EASINGS[easing] or raise "'#{easing}' easing function not found"
107
+ start = Time.now.to_f
108
+ eachDrawBlock = lambda do
109
+ t = (Time.now.to_f - start) / seconds
110
+ if t >= 1.0
111
+ block.call fun.call(1.0), true
112
+ else
113
+ block.call fun.call(t), false
114
+ setTimeout 0, id: id, &eachDrawBlock
115
+ end
116
+ end
117
+ setTimeout 0, id: id, &eachDrawBlock
118
+ end
119
+
120
+ # Animate value with easing functions
121
+ #
122
+ # @param [Numeric] seconds Animation duration
123
+ # @param [Numeric, Vector] from Value at the beggining of the animation
124
+ # @param [Numeric, Vector] to Value at the end of the animation
125
+ # @param [Object] id Timer object identifier
126
+ # @param [Symbol] easing Easing function name
127
+ #
128
+ # @return [Object] Timer object identifier
129
+ #
130
+ def animateValue(seconds, from:, to:, id: nextTimerID__, easing: :expoOut, &block)
131
+ if from.is_a? Vector
132
+ animate seconds, id: id, easing: easing do |t, finished|
133
+ block.call Vector.lerp(from, to, t), finished
134
+ end
135
+ else
136
+ animate seconds, id: id, easing: easing do |t, finished|
137
+ block.call lerp(from, to, t), finished
138
+ end
139
+ end
13
140
  end
14
141
 
15
142
  # Creates a new sprite and add it to physics engine.
@@ -0,0 +1,105 @@
1
+ module RubySketch
2
+
3
+ pi = Math::PI
4
+ pi_div2 = pi / 2.0
5
+
6
+ c1 = 1.70158
7
+ c2 = c1 * 1.525
8
+ c3 = c1 + 1.0
9
+ c4 = pi * 2 / 3.0
10
+ c5 = pi * 2 / 4.5
11
+
12
+ n1 = 7.5625
13
+ d1 = 2.75
14
+
15
+ expoInOut = -> x {
16
+ x == 0 ? 0.0 :
17
+ x == 1 ? 1.0 :
18
+ x < 0.5 ?
19
+ 2.0 ** ( 20.0 * x - 10.0) / 2.0 :
20
+ (2.0 - 2.0 ** (-20.0 * x + 10.0)) / 2.0
21
+ }
22
+
23
+ circInOut = -> x {
24
+ x < 0.5 ?
25
+ (1.0 - Math.sqrt(1.0 - ( 2.0 * x) ** 2.0)) / 2.0 :
26
+ (1.0 + Math.sqrt(1.0 - (-2.0 * x + 2.0) ** 2.0)) / 2.0
27
+ }
28
+
29
+ backInOut = -> x {
30
+ x < 0.5 ?
31
+ ((2.0 * x) ** 2.0 * ((c2 + 1.0) * (x * 2.0) - c2)) / 2.0 :
32
+ ((2.0 * x - 2.0) ** 2.0 * ((c2 + 1.0) * (x * 2.0 - 2.0) + c2) + 2.0) / 2.0
33
+ }
34
+
35
+ elasticIn = -> x {
36
+ x == 0 ? 0.0 :
37
+ x == 1 ? 1.0 :
38
+ -(2 ** (10.0 * x - 10.0)) * Math.sin((x * 10.0 - 10.75) * c4)
39
+ }
40
+
41
+ elasticOut = -> x {
42
+ x == 0 ? 0.0 :
43
+ x == 1 ? 1.0 :
44
+ 2 ** (-10.0 * x) * Math.sin((x * 10.0 - 0.75) * c4) + 1.0
45
+ }
46
+
47
+ elasticInOut = -> x {
48
+ x == 0 ? 0.0 :
49
+ x == 1 ? 1.0 :
50
+ x < 0.5 ?
51
+ -(2 ** ( 20.0 * x - 10.0) * Math.sin((20.0 * x - 11.125) * c5)) / 2.0 :
52
+ (2 ** (-20.0 * x + 10.0) * Math.sin((20.0 * x - 11.125) * c5)) / 2.0 + 1.0
53
+ }
54
+
55
+ bounceOut = -> x {
56
+ x < 1.0 / d1 ? n1 * x ** 2 :
57
+ x < 2.0 / d1 ? n1 * (x -= 1.5 / d1) * x + 0.75 :
58
+ x < 2.5 / d1 ? n1 * (x -= 2.25 / d1) * x + 0.9375 :
59
+ n1 * (x -= 2.625 / d1) * x + 0.984375
60
+ }
61
+
62
+ bounceInOut = -> x {
63
+ x < 0.5 ?
64
+ (1.0 - bounceOut[1.0 - 2.0 * x]) / 2.0 :
65
+ (1.0 + bounceOut[2.0 * x - 1.0]) / 2.0
66
+ }
67
+
68
+ EASINGS = {
69
+ linear: -> x {x},
70
+
71
+ sineIn: -> x {1.0 - Math.cos(x * pi_div2)},
72
+ quadIn: -> x {x ** 2.0},
73
+ cubicIn: -> x {x ** 3.0},
74
+ quartIn: -> x {x ** 4.0},
75
+ quintIn: -> x {x ** 5.0},
76
+ expoIn: -> x {x == 0 ? 0.0 : 2.0 ** (10.0 * x - 10.0)},
77
+ circIn: -> x {1.0 - Math.sqrt(1.0 - x ** 2.0)},
78
+ backIn: -> x {c3 * x ** 3.0 - c1 * x ** 2.0},
79
+ elasticIn: elasticIn,
80
+ bounceIn: -> x {1.0 - bounceOut[1.0 - x]},
81
+
82
+ sineOut: -> x {Math.sin(x * pi_div2)},
83
+ quadOut: -> x {1.0 - (1.0 - x) ** 2.0},
84
+ cubicOut: -> x {1.0 - (1.0 - x) ** 3.0},
85
+ quartOut: -> x {1.0 - (1.0 - x) ** 4.0},
86
+ quintOut: -> x {1.0 - (1.0 - x) ** 5.0},
87
+ expoOut: -> x {x == 1 ? 1.0 : 1.0 - 2.0 ** (-10.0 * x)},
88
+ circOut: -> x {Math.sqrt(1.0 - (x - 1.0) ** 2.0)},
89
+ backOut: -> x {1.0 + c3 * (x - 1.0) ** 3.0 + c1 * (x - 1.0) ** 2.0},
90
+ elasticOut: elasticOut,
91
+ bounceOut: bounceOut,
92
+
93
+ sineInOut: -> x {-(Math.cos(pi * x) - 1.0) / 2.0},
94
+ quadInOut: -> x {x < 0.5 ? 2.0 * x ** 2 : 1.0 - (-2.0 * x + 2.0) ** 2.0 / 2.0},
95
+ cubicInOut: -> x {x < 0.5 ? 4.0 * x ** 3 : 1.0 - (-2.0 * x + 2.0) ** 3.0 / 2.0},
96
+ quartInOut: -> x {x < 0.5 ? 8.0 * x ** 4 : 1.0 - (-2.0 * x + 2.0) ** 4.0 / 2.0},
97
+ quintInOut: -> x {x < 0.5 ? 16.0 * x ** 5 : 1.0 - (-2.0 * x + 2.0) ** 5.0 / 2.0},
98
+ expoInOut: expoInOut,
99
+ circInOut: circInOut,
100
+ backInOut: backInOut,
101
+ elasticInOut: elasticInOut,
102
+ bounceInOut: bounceInOut
103
+ }.freeze
104
+
105
+ end# RubySketch
data/lib/rubysketch.rb CHANGED
@@ -4,7 +4,7 @@ require 'rubysketch/all'
4
4
  module RubySketch
5
5
  w = (ENV['WIDTH'] || 500).to_i
6
6
  h = (ENV['HEIGHT'] || 500).to_i
7
- WINDOW = RubySketch::Window.new(w, h) {start}
7
+ WINDOW = Processing::Window.new(w, h) {start}
8
8
  CONTEXT = RubySketch::Context.new WINDOW
9
9
 
10
10
  refine Object do
data/rubysketch.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_runtime_dependency 'beeps', '~> 0.1.41'
31
31
  s.add_runtime_dependency 'rays', '~> 0.1.43'
32
32
  s.add_runtime_dependency 'reflexion', '~> 0.1.49'
33
- s.add_runtime_dependency 'processing', '~> 0.5.24'
33
+ s.add_runtime_dependency 'processing', '~> 0.5.25'
34
34
 
35
35
  s.add_development_dependency 'rake'
36
36
  s.add_development_dependency 'test-unit'
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.23
4
+ version: 0.5.25
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-11 00:00:00.000000000 Z
11
+ date: 2023-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xot
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.5.24
89
+ version: 0.5.25
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.24
96
+ version: 0.5.25
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -161,11 +161,11 @@ files:
161
161
  - lib/rubysketch.rb
162
162
  - lib/rubysketch/all.rb
163
163
  - lib/rubysketch/context.rb
164
+ - lib/rubysketch/easings.rb
164
165
  - lib/rubysketch/extension.rb
165
166
  - lib/rubysketch/helper.rb
166
167
  - lib/rubysketch/sound.rb
167
168
  - lib/rubysketch/sprite.rb
168
- - lib/rubysketch/window.rb
169
169
  - pod.rake
170
170
  - rubysketch.gemspec
171
171
  - src/RubySketch.h
@@ -1,14 +0,0 @@
1
- module RubySketch
2
-
3
-
4
- # @private
5
- class Window < Processing::Window
6
-
7
- def on_update(e)
8
- Beeps.process_streams!
9
- end
10
-
11
- end# Window
12
-
13
-
14
- end# RubySketch