rubysketch 0.5.2 → 0.5.4
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/.github/workflows/release-gem.yml +1 -1
- data/.github/workflows/utils.rb +2 -1
- data/ChangeLog.md +17 -0
- data/RubySketch.podspec +114 -12
- data/VERSION +1 -1
- data/examples/hello.rb +1 -1
- data/lib/rubysketch/all.rb +11 -1
- data/lib/rubysketch/context.rb +73 -13
- data/lib/rubysketch/extension.rb +1 -0
- data/lib/rubysketch/graphics_context.rb +7 -14
- data/lib/rubysketch/helper.rb +1 -0
- data/lib/rubysketch/sound.rb +86 -0
- data/lib/rubysketch/sprite.rb +356 -48
- data/lib/rubysketch/window.rb +14 -0
- data/lib/rubysketch.rb +2 -2
- data/pod.rake +35 -0
- data/rubysketch.gemspec +6 -6
- data/src/RubySketch.h +22 -0
- data/src/RubySketch.mm +92 -0
- data/test/helper.rb +3 -2
- data/test/test_sound.rb +88 -0
- data/test/test_sprite.rb +177 -5
- metadata +22 -17
- data/src/RubyProcessing.h +0 -11
- data/src/RubyProcessing.mm +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82a93ef9dac4ae855bfa85f9a076ed05c807875db70be9c5e72419137499434e
|
4
|
+
data.tar.gz: 2f432e94c80ad231f50ca11df96ecd6a13c389551f75c426e161701e25d85a23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdf7238a4d07fe88b5d1fe3d68ea6f62d9536b142afda5dad1f4c15538bae2047d4e188bbc88e0777d641650ad9c5f5864720345ad5ec950e2ff18e83f552db9
|
7
|
+
data.tar.gz: 310a71a0b3388876bd0c0910a09bb9aa12e5686e5885ec8e4b2a32cb4af629ed18a010731a77b4a8ea1a9a4be41de504098767d0d133e3344554d5078508ad29
|
data/.github/workflows/utils.rb
CHANGED
@@ -20,8 +20,9 @@ def setup_dependencies(build: true, only: nil)
|
|
20
20
|
|
21
21
|
exts.each do |ext|
|
22
22
|
gem = RENAMES[ext.to_sym].then {|s| s || ext}
|
23
|
-
clone = "git clone --depth 1 https://github.com/xord/#{ext}.git ../#{ext}"
|
24
23
|
ver = gemspec[/add_runtime_dependency.*['"]#{gem}['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/, 1]
|
24
|
+
opts = '-c advice.detachedHead=false --depth 1'
|
25
|
+
clone = "git clone #{opts} https://github.com/xord/#{ext}.git ../#{ext}"
|
25
26
|
|
26
27
|
# 'rake subtree:push' pushes all subrepos, so cloning by new tag
|
27
28
|
# often fails before tagging each new tag
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,23 @@
|
|
1
1
|
# rubysketch ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.5.4] - 2023-04-30
|
5
|
+
|
6
|
+
- Add Sprite#image=() and Sprite#offset=()
|
7
|
+
- gravity() takes vector by pixel
|
8
|
+
- Add documents for Sprite class and test it
|
9
|
+
|
10
|
+
|
11
|
+
## [v0.5.3] - 2023-04-22
|
12
|
+
|
13
|
+
- Depends on Beeps
|
14
|
+
- Update RubySketch.podspec to include beeps, rays, reflex, and processing libs
|
15
|
+
- Add RubySketch.h and RubySketch.mm
|
16
|
+
- Add Sound class and loadSound()
|
17
|
+
- Add vx, vy accessors and will_contact? callback to Sprite class
|
18
|
+
- Add RubySketch::Window andd calls Beeps.process_streams!
|
19
|
+
|
20
|
+
|
4
21
|
## [v0.5.2] - 2023-03-02
|
5
22
|
|
6
23
|
- depend to processing-0.5.2 gem
|
data/RubySketch.podspec
CHANGED
@@ -14,16 +14,118 @@ Pod::Spec.new do |s|
|
|
14
14
|
s.osx.deployment_target = "10.10"
|
15
15
|
s.ios.deployment_target = "10.0"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
17
|
+
root = "${PODS_ROOT}/#{s.name}"
|
18
|
+
exts = File.read(File.expand_path 'Rakefile', __dir__)
|
19
|
+
.lines(chomp: true)
|
20
|
+
.map {|line| line[%r|require\s*['"](\w+)/extension['"]|, 1]}
|
21
|
+
.compact - [s.name.downcase]
|
22
|
+
|
23
|
+
incdirs = exts.map {|x| "#{root}/#{x}/include"}.concat %W[
|
24
|
+
#{root}/src
|
25
|
+
#{root}/beeps/vendor/stk/include
|
26
|
+
#{root}/beeps/vendor/AudioFile
|
27
|
+
#{root}/beeps/vendor/r8brain-free-src
|
28
|
+
#{root}/beeps/vendor/signalsmith-stretch
|
29
|
+
#{root}/rays/vendor/glm
|
30
|
+
#{root}/rays/vendor/clipper/cpp
|
31
|
+
#{root}/rays/vendor/poly2tri/poly2tri
|
32
|
+
#{root}/rays/vendor/splines-lib
|
33
|
+
#{root}/reflex/vendor/box2d/include
|
34
|
+
#{root}/reflex/vendor/box2d/src
|
35
|
+
${PODS_ROOT}/CRuby/CRuby/include
|
36
|
+
]
|
37
|
+
|
38
|
+
s.prepare_command = 'rake -f pod.rake setup'
|
39
|
+
s.preserve_paths = exts + %w[src]
|
40
|
+
s.requires_arc = false
|
41
|
+
s.osx.compiler_flags = "-DOSX"
|
42
|
+
s.ios.compiler_flags = "-DIOS"
|
43
|
+
s.library = %w[c++]
|
44
|
+
s.xcconfig = {
|
45
|
+
"CLANG_CXX_LANGUAGE_STANDARD" => 'c++20',
|
46
|
+
"HEADER_SEARCH_PATHS" => incdirs.join(' ')
|
47
|
+
}
|
48
|
+
|
49
|
+
#s.dependency = 'CRuby', git: 'https://github.com/xord/cruby'
|
50
|
+
|
51
|
+
s.source_files = "src/*.mm"
|
52
|
+
s.resource_bundles =
|
53
|
+
exts.each_with_object({'RubySketch' => %w[lib VERSION]}) do |ext, hash|
|
54
|
+
hash[ext.capitalize] = %W[#{ext}/lib VERSION]
|
55
|
+
end
|
56
|
+
|
57
|
+
s.subspec "Xot" do |spec|
|
58
|
+
spec.source_files = "xot/src/*.cpp"
|
59
|
+
end
|
60
|
+
|
61
|
+
s.subspec "Rucy" do |spec|
|
62
|
+
spec.source_files = "rucy/src/*.cpp"
|
63
|
+
|
64
|
+
spec.subspec "Ext" do |ext|
|
65
|
+
ext.source_files = "rucy/ext/rucy/*.cpp"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
s.subspec "Beeps" do |spec|
|
70
|
+
spec .source_files = "beeps/src/*.cpp"
|
71
|
+
spec.osx.source_files = "beeps/src/osx/*.{cpp,mm}"
|
72
|
+
spec.ios.source_files = "beeps/src/osx/*.{cpp,mm}"
|
73
|
+
spec.frameworks = %w[OpenAL AVFoundation]
|
74
|
+
|
75
|
+
spec.subspec "STK" do |sub|
|
76
|
+
sub.source_files = "beeps/vendor/stk/src/*.cpp"
|
77
|
+
sub.exclude_files = %w[Tcp Udp Socket Thread Mutex InetWv Rt].map {|s|
|
78
|
+
"beeps/vendor/stk/src/#{s}*.cpp"
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
spec.subspec "R8BrainFreeSrc" do |sub|
|
83
|
+
sub.source_files = "beeps/vendor/r8brain-free-src/*.cpp"
|
84
|
+
sub.exclude_files = %w[example pffft_double/].map {|s|
|
85
|
+
"beeps/vendor/r8brain-free-src/#{s}*.cpp"
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
spec.subspec "Ext" do |ext|
|
90
|
+
ext.source_files = "beeps/ext/beeps/*.cpp"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
s.subspec "Rays" do |spec|
|
95
|
+
spec .source_files = "rays/src/*.cpp"
|
96
|
+
spec.osx.source_files = "rays/src/osx/*.{cpp,mm}"
|
97
|
+
spec.ios.source_files = "rays/src/ios/*.{cpp,mm}"
|
98
|
+
spec.ios.frameworks = %w[GLKit MobileCoreServices AVFoundation]# ImageIO
|
99
|
+
|
100
|
+
spec.subspec "Clipper" do |sub|
|
101
|
+
sub.source_files = "rays/vendor/clipper/cpp/*.cpp"
|
102
|
+
end
|
103
|
+
|
104
|
+
spec.subspec "Poly2Tri" do |sub|
|
105
|
+
sub.source_files = "rays/vendor/poly2tri/poly2tri/**/*.cc"
|
106
|
+
end
|
107
|
+
|
108
|
+
spec.subspec "SplineLib" do |sub|
|
109
|
+
sub.source_files = "rays/vendor/splines-lib/Splines.cpp"
|
110
|
+
end
|
111
|
+
|
112
|
+
spec.subspec "Ext" do |ext|
|
113
|
+
ext.source_files = "rays/ext/rays/*.cpp"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
s.subspec "Reflex" do |spec|
|
118
|
+
spec .source_files = "reflex/src/*.cpp"
|
119
|
+
spec.osx.source_files = "reflex/src/osx/*.{cpp,mm}"
|
120
|
+
spec.ios.source_files = "reflex/src/ios/*.{cpp,mm}"
|
121
|
+
spec.ios.frameworks = %w[CoreMotion]
|
122
|
+
|
123
|
+
spec.subspec "Box2D" do |sub|
|
124
|
+
sub.source_files = "reflex/vendor/box2d/src/**/*.cpp"
|
125
|
+
end
|
126
|
+
|
127
|
+
spec.subspec "Ext" do |ext|
|
128
|
+
ext.source_files = "reflex/ext/reflex/*.cpp"
|
129
|
+
end
|
130
|
+
end
|
29
131
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.4
|
data/examples/hello.rb
CHANGED
data/lib/rubysketch/all.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
-
require '
|
1
|
+
require 'beeps'
|
2
2
|
require 'processing/all'
|
3
3
|
|
4
4
|
require 'rubysketch/extension'
|
5
|
+
require 'rubysketch/window'
|
5
6
|
require 'rubysketch/helper'
|
6
7
|
|
7
8
|
require 'rubysketch/sprite'
|
9
|
+
require 'rubysketch/sound'
|
8
10
|
require 'rubysketch/graphics_context'
|
9
11
|
require 'rubysketch/context'
|
12
|
+
|
13
|
+
|
14
|
+
module RubySketch
|
15
|
+
|
16
|
+
Vector = Processing::Vector
|
17
|
+
Image = Processing::Image
|
18
|
+
|
19
|
+
end# RubySketch
|
data/lib/rubysketch/context.rb
CHANGED
@@ -5,43 +5,103 @@ module RubySketch
|
|
5
5
|
|
6
6
|
include GraphicsContext
|
7
7
|
|
8
|
+
Sound = RubySketch::Sound
|
9
|
+
Sprite = RubySketch::Sprite
|
10
|
+
|
11
|
+
# @private
|
8
12
|
def initialize(window)
|
9
13
|
super
|
10
|
-
@
|
14
|
+
@layer__ = window.add_overlay SpriteLayer.new
|
11
15
|
end
|
12
16
|
|
17
|
+
# Creates a new sprite and add it to physics engine.
|
18
|
+
#
|
19
|
+
# @overload createSprite(image: img)
|
20
|
+
# pos: [0, 0], size: [image.width, image.height]
|
21
|
+
# @param [Image] img sprite image
|
22
|
+
#
|
23
|
+
# @overload createSprite(x, y, image: img)
|
24
|
+
# pos: [x, y], size: [image.width, image.height]
|
25
|
+
# @param [Numeric] x x of sprite position
|
26
|
+
# @param [Numeric] y y of sprite position
|
27
|
+
# @param [Image] img sprite image
|
28
|
+
#
|
29
|
+
# @overload createSprite(x, y, w, h)
|
30
|
+
# pos(x, y), size: [w, h]
|
31
|
+
# @param [Numeric] x x of sprite position
|
32
|
+
# @param [Numeric] y y of sprite position
|
33
|
+
# @param [Numeric] w width of sprite
|
34
|
+
# @param [Numeric] h height of sprite
|
35
|
+
#
|
36
|
+
# @overload createSprite(x, y, w, h, image: img, offset: off)
|
37
|
+
# pos: [x, y], size: [w, h], offset: [offset.x, offset.x]
|
38
|
+
# @param [Numeric] x x of sprite position
|
39
|
+
# @param [Numeric] y y of sprite position
|
40
|
+
# @param [Numeric] w width of sprite
|
41
|
+
# @param [Numeric] h height of sprite
|
42
|
+
# @param [Image] img sprite image
|
43
|
+
# @param [Vector] off offset of sprite image
|
44
|
+
#
|
13
45
|
def createSprite(*args, **kwargs)
|
14
46
|
addSprite Sprite.new(*args, **kwargs)
|
15
47
|
end
|
16
48
|
|
49
|
+
# Adds the sprite to the physics engine.
|
50
|
+
#
|
51
|
+
# @param [Sprite] sprite sprite object
|
52
|
+
#
|
17
53
|
def addSprite(sprite)
|
18
|
-
@
|
54
|
+
@layer__.add sprite.getInternal__ if sprite
|
19
55
|
sprite
|
20
56
|
end
|
21
57
|
|
58
|
+
# Removes the sprite from the physics engine.
|
59
|
+
#
|
60
|
+
# @param [Sprite] sprite sprite object
|
61
|
+
#
|
22
62
|
def removeSprite(sprite)
|
23
|
-
@
|
63
|
+
@layer__.remove sprite.getInternal__ if sprite
|
24
64
|
sprite
|
25
65
|
end
|
26
66
|
|
67
|
+
# @private
|
68
|
+
def loadSound(path)
|
69
|
+
Sound.load path
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sets gravity for the physics engine.
|
73
|
+
#
|
74
|
+
# @overload gravity(vec)
|
75
|
+
# @param [Vector] vec gracity vector
|
76
|
+
#
|
77
|
+
# @overload gravity(ary)
|
78
|
+
# @param [Array<Numeric>] ary gravityX, gravityY
|
79
|
+
#
|
80
|
+
# @overload gravity(x, y)
|
81
|
+
# @param [Numeric] x x of gravity vector
|
82
|
+
# @param [Numeric] y y of gracity vector
|
83
|
+
#
|
27
84
|
def gravity(*args)
|
28
85
|
x, y =
|
29
|
-
case args
|
30
|
-
when
|
86
|
+
case arg = args.first
|
87
|
+
when Vector then arg.array
|
88
|
+
when Array then arg
|
31
89
|
else args
|
32
90
|
end
|
33
|
-
@
|
34
|
-
v.gravity x * v.meter, y * v.meter
|
35
|
-
end
|
91
|
+
@layer__.gravity x, y
|
36
92
|
end
|
37
93
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
94
|
+
end# Context
|
95
|
+
|
96
|
+
|
97
|
+
# @private
|
98
|
+
class SpriteLayer < Reflex::View
|
99
|
+
|
100
|
+
def on_draw(e)
|
101
|
+
e.block
|
42
102
|
end
|
43
103
|
|
44
|
-
end#
|
104
|
+
end# SpriteLayer
|
45
105
|
|
46
106
|
|
47
107
|
end# RubySketch
|
data/lib/rubysketch/extension.rb
CHANGED
@@ -3,34 +3,27 @@ module RubySketch
|
|
3
3
|
|
4
4
|
module GraphicsContext
|
5
5
|
|
6
|
+
# Draws one or more sprites.
|
7
|
+
#
|
8
|
+
# @param [Array<Sprite>] sprites
|
9
|
+
#
|
6
10
|
def sprite(*sprites)
|
7
11
|
sprites.flatten! if sprites.first&.is_a? Array
|
8
12
|
sprites.each do |sp|
|
9
13
|
v = sp.getInternal__
|
10
|
-
f, angle
|
14
|
+
f, angle = v.frame, v.angle
|
11
15
|
if angle == 0
|
12
|
-
|
16
|
+
sp.on_draw__ f.x, f.y, f.w, f.h
|
13
17
|
else
|
14
18
|
pushMatrix do
|
15
19
|
translate f.x, f.y
|
16
20
|
rotate radians(angle)
|
17
|
-
|
21
|
+
sp.on_draw__ 0, 0, f.w, f.h
|
18
22
|
end
|
19
23
|
end
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
23
|
-
def drawSprite__(x, y, w, h, img, offset)
|
24
|
-
if img && offset
|
25
|
-
ox, oy = offset
|
26
|
-
copy img, ox, oy, w, h, x, y, w, h
|
27
|
-
elsif img
|
28
|
-
image img, x, y
|
29
|
-
else
|
30
|
-
rect x, y, w, h
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
27
|
end# GraphicsContext
|
35
28
|
|
36
29
|
|
data/lib/rubysketch/helper.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
module RubySketch
|
2
|
+
|
3
|
+
|
4
|
+
# @private
|
5
|
+
class Sound
|
6
|
+
|
7
|
+
# @private
|
8
|
+
def initialize(sound)
|
9
|
+
@sound = sound
|
10
|
+
end
|
11
|
+
|
12
|
+
# Play sound.
|
13
|
+
#
|
14
|
+
def play()
|
15
|
+
old = @player
|
16
|
+
@player = @sound.play
|
17
|
+
old&.stop
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
# Pause sound.
|
22
|
+
#
|
23
|
+
def pause()
|
24
|
+
return false unless @player
|
25
|
+
@player.pause
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
# Stop sound.
|
30
|
+
#
|
31
|
+
def stop()
|
32
|
+
return false unless @player
|
33
|
+
@player.stop
|
34
|
+
@player = nil
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns whether the sound is playing or not.
|
39
|
+
#
|
40
|
+
# @return [Boolean] playing or not
|
41
|
+
#
|
42
|
+
def playing?()
|
43
|
+
@player ? @player.playing? : false
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns whether the sound is paused or not.
|
47
|
+
#
|
48
|
+
# @return [Boolean] paused or not
|
49
|
+
#
|
50
|
+
def paused?()
|
51
|
+
@player ? @player.paused? : false
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns whether the sound is stopped or not.
|
55
|
+
#
|
56
|
+
# @return [Boolean] stopped or not
|
57
|
+
#
|
58
|
+
def stopped?()
|
59
|
+
@player ? @player.stopped? : true
|
60
|
+
end
|
61
|
+
|
62
|
+
# Save the sound data to a file.
|
63
|
+
#
|
64
|
+
# @param [String] path file path
|
65
|
+
#
|
66
|
+
# @return [Sound] self
|
67
|
+
#
|
68
|
+
def save(path)
|
69
|
+
@sound.save path
|
70
|
+
end
|
71
|
+
|
72
|
+
# Load a sound file.
|
73
|
+
#
|
74
|
+
# @param [String] path file path
|
75
|
+
#
|
76
|
+
# @return [Sound] sound object
|
77
|
+
#
|
78
|
+
def self.load(path)
|
79
|
+
f = Beeps::FileIn.new path
|
80
|
+
self.new Beeps::Sound.new(f, f.seconds, nchannels: f.nchannels)
|
81
|
+
end
|
82
|
+
|
83
|
+
end# Sound
|
84
|
+
|
85
|
+
|
86
|
+
end# RubySketch
|