rubysketch 0.5.23 → 0.5.24
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 +4 -4
- data/ChangeLog.md +6 -0
- data/VERSION +1 -1
- data/lib/rubysketch/all.rb +1 -1
- data/lib/rubysketch/context.rb +127 -0
- data/lib/rubysketch/easings.rb +105 -0
- data/lib/rubysketch.rb +1 -1
- data/rubysketch.gemspec +1 -1
- metadata +5 -5
- data/lib/rubysketch/window.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5538cde508d958c69978b0cdf51727303c3c509f96fae21a30b41cfabc99a9a8
|
4
|
+
data.tar.gz: 9b7fd39a1684f7fe49fbc98250c0315038419566443209fddce8701ff9683228
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f71cd9de84e98317c61ad25c013cf0d6ec2257cc884138984908ee6ecd505c7a87068798539b8491fcccad90e7a829dea8d62fb907483c46be215cea010cb074
|
7
|
+
data.tar.gz: 4758d91420fb1069ce87438ec0df5cfea7af382847f9375bc7869f48fce5ed3d21936d0af79c0c3b2a166121991f922a82944c5a89515e1b09f872fb8723b7cd
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# rubysketch ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.5.24] - 2023-07-21
|
5
|
+
|
6
|
+
- Add animate(), animateValue(), and EASINGS
|
7
|
+
- Add setTimeout(), setInterval(), and clearTimer() (also aliased as clearTimeout, clearInterval)
|
8
|
+
|
9
|
+
|
4
10
|
## [v0.5.23] - 2023-07-11
|
5
11
|
|
6
12
|
- Update dependencies
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.24
|
data/lib/rubysketch/all.rb
CHANGED
@@ -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
|
|
data/lib/rubysketch/context.rb
CHANGED
@@ -9,7 +9,134 @@ module RubySketch
|
|
9
9
|
# @private
|
10
10
|
def initialize(window)
|
11
11
|
super
|
12
|
+
@timers__, @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__.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
|
+
blocks = []
|
91
|
+
@timers__.delete_if do |_, (time, args, block)|
|
92
|
+
(now >= time).tap {|fire| blocks.push [block, args] if fire}
|
93
|
+
end
|
94
|
+
blocks.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
|
+
}
|
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 =
|
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.
|
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.
|
4
|
+
version: 0.5.24
|
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
|
+
date: 2023-07-21 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.
|
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.
|
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
|