rubysketch 0.5.2 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|