graphics 1.0.0b5 → 1.0.0b6
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +38 -0
- data/Manifest.txt +5 -0
- data/Rakefile +2 -0
- data/examples/boid.rb +14 -15
- data/examples/bounce.rb +9 -11
- data/examples/canvas.rb +3 -1
- data/examples/collision.rb +10 -8
- data/examples/demo.rb +12 -12
- data/examples/fluid2.rb +13 -8
- data/examples/gol2.rb +0 -2
- data/examples/math.rb +3 -1
- data/examples/pi_polygon.rb +145 -0
- data/examples/radar.rb +3 -1
- data/examples/rainbow_fluid.rb +243 -0
- data/examples/tank.rb +19 -17
- data/examples/tank2.rb +25 -21
- data/examples/targeting.rb +3 -1
- data/examples/vants.rb +5 -21
- data/examples/walker.rb +15 -12
- data/examples/walker2.rb +28 -26
- data/examples/zombies.rb +0 -2
- data/ext/sdl/sdl.c +10 -3
- data/ext/sdl/sge/sge_primitives.cpp +11 -0
- data/ext/sdl/sge/sge_primitives.h +3 -0
- data/lib/graphics.rb +2 -1
- data/lib/graphics/body.rb +10 -25
- data/lib/graphics/decorators.rb +21 -0
- data/lib/graphics/rainbows.rb +128 -0
- data/lib/graphics/simulation.rb +139 -15
- data/test/test_graphics.rb +45 -9
- data/test/test_rainbows.rb +95 -0
- metadata +20 -28
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37f59baac9923c3919719668065ee0c6371ea524
|
4
|
+
data.tar.gz: bd576413810e63a2e8e51f12669c42f5d8ba0dbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4519bbe92fc69ab4c4024cd3251afb68e87aa6f6100103d4b052c2d536b662b79448f392ff57a97e8a2f889aef5da414feb8196f65624195e28437d5ff52c476
|
7
|
+
data.tar.gz: 1a921bf4a04063aef66d0f8eb829405a61659df355dbc6c1f2258558541dd779eabfcc39760ee10524846cf65e6793b6098f54f58975d04e7e7676e0cba33b6e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,41 @@
|
|
1
|
+
=== 1.0.0b6 / 2016-11-17
|
2
|
+
|
3
|
+
I'm still not happy with the color system. I'd love some help to make it more usable.
|
4
|
+
|
5
|
+
* 1 major enhancement:
|
6
|
+
|
7
|
+
* Added Graphics::Drawing: a simulation that doesn't double buffer or clear each tick.
|
8
|
+
|
9
|
+
* 20 minor enhancements:
|
10
|
+
|
11
|
+
* Added DrawGrid decorator.
|
12
|
+
* Added Graphics::Simulation#draw_collection
|
13
|
+
* Added Graphics::Simulation#register_bodies
|
14
|
+
* Added Graphics::Simulation#register_body
|
15
|
+
* Added Screen#save.
|
16
|
+
* Added ShowFPS decorator module
|
17
|
+
* Added Simulation#done that causes soft exit to allow profiling of apps.
|
18
|
+
* Added WhiteBackground decorator.
|
19
|
+
* Added cyan and magenta to color dictionary.
|
20
|
+
* Added sge_FastFilledRect to sge_primitives.
|
21
|
+
* Body#bounce returns true if it did bounce.
|
22
|
+
* Defined Graphics::Simulation::CLEAR_COLOR.
|
23
|
+
* Graphics::Simulation now stores a collection of collections of bodies. Those bodies are updated and drawn automatically each tick.
|
24
|
+
* Graphics::Simulation.clear defaults to CLEAR_COLOR.
|
25
|
+
* Improved MVC pattern in Simulation.
|
26
|
+
* Pushed Simulation up to AbstractSimulation.
|
27
|
+
* Registered more default colors. Should also make arrays of names.
|
28
|
+
* Reimplement Body#bounce to use clip & NORMAL. Much cleaner.
|
29
|
+
* Split Simulation#draw into pre_draw and post_draw to give overrides more flexibility.
|
30
|
+
* Split up Simulation for Drawings.
|
31
|
+
|
32
|
+
* 4 bug fixes:
|
33
|
+
|
34
|
+
* Fixed a bug in boid refactoring.
|
35
|
+
* Fixed bounce math to try to place the body to where it would bounce. (sotoseattle)
|
36
|
+
* No more srand in examples.
|
37
|
+
* Only apply friction on #bounce if greater than 0.
|
38
|
+
|
1
39
|
=== 1.0.0b5 / 2015-10-31
|
2
40
|
|
3
41
|
* 10 minor enhancements:
|
data/Manifest.txt
CHANGED
@@ -16,7 +16,9 @@ examples/gol2.rb
|
|
16
16
|
examples/logo.rb
|
17
17
|
examples/math.rb
|
18
18
|
examples/maze.rb
|
19
|
+
examples/pi_polygon.rb
|
19
20
|
examples/radar.rb
|
21
|
+
examples/rainbow_fluid.rb
|
20
22
|
examples/tank.rb
|
21
23
|
examples/tank2.rb
|
22
24
|
examples/targeting.rb
|
@@ -59,11 +61,14 @@ ext/sdl/sge/sge_tt_text.h
|
|
59
61
|
graphics_setup.sh
|
60
62
|
lib/graphics.rb
|
61
63
|
lib/graphics/body.rb
|
64
|
+
lib/graphics/decorators.rb
|
62
65
|
lib/graphics/extensions.rb
|
66
|
+
lib/graphics/rainbows.rb
|
63
67
|
lib/graphics/simulation.rb
|
64
68
|
lib/graphics/trail.rb
|
65
69
|
lib/graphics/v.rb
|
66
70
|
resources/images/body.png
|
67
71
|
resources/images/turret.png
|
68
72
|
test/test_graphics.rb
|
73
|
+
test/test_rainbows.rb
|
69
74
|
test/test_sdl.rb
|
data/Rakefile
CHANGED
data/examples/boid.rb
CHANGED
@@ -27,13 +27,6 @@ class Boid < Graphics::Body
|
|
27
27
|
self.a = random_angle
|
28
28
|
end
|
29
29
|
|
30
|
-
def draw
|
31
|
-
# the blit looks HORRIBLE when rotated... dunno why
|
32
|
-
w.circle x, y, @@max_distance, :gray if w.visual_debug?
|
33
|
-
w.blit w.body_img, x, y
|
34
|
-
w.angle x, y, a, 3 * m, :red
|
35
|
-
end
|
36
|
-
|
37
30
|
def label
|
38
31
|
l = "%.1f [%.2f, %.2f]" % [a, *dx_dy]
|
39
32
|
w.text l, x-10, y+10, :white
|
@@ -48,6 +41,8 @@ class Boid < Graphics::Body
|
|
48
41
|
limit_velocity
|
49
42
|
self.position += self.velocity
|
50
43
|
|
44
|
+
wrap
|
45
|
+
|
51
46
|
@nearby = nil
|
52
47
|
end
|
53
48
|
|
@@ -242,6 +237,16 @@ class Boid < Graphics::Body
|
|
242
237
|
|
243
238
|
(v - self.velocity) / 4
|
244
239
|
end
|
240
|
+
|
241
|
+
class View
|
242
|
+
def self.draw w, b
|
243
|
+
x, y, a, m = b.x, b.y, b.a, b.m
|
244
|
+
|
245
|
+
w.circle x, y, Boid.max_distance, :gray if w.visual_debug?
|
246
|
+
w.blit w.body_img, x, y # the blit looks HORRIBLE when rotated... dunno why
|
247
|
+
w.angle x, y, a, 3 * m, :red
|
248
|
+
end
|
249
|
+
end
|
245
250
|
end
|
246
251
|
|
247
252
|
class Boids < Graphics::Simulation
|
@@ -255,6 +260,7 @@ class Boids < Graphics::Simulation
|
|
255
260
|
self.visual_debug = false
|
256
261
|
|
257
262
|
self.boids = populate Boid
|
263
|
+
register_bodies boids
|
258
264
|
|
259
265
|
self.body_img = sprite 20, 20 do
|
260
266
|
circle 10, 10, 5, :white, :filled
|
@@ -269,15 +275,8 @@ class Boids < Graphics::Simulation
|
|
269
275
|
add_key_handler(:S) { Boid.max_distance -= 5 }
|
270
276
|
end
|
271
277
|
|
272
|
-
def update n
|
273
|
-
boids.each(&:update)
|
274
|
-
self.boids.each(&:wrap)
|
275
|
-
end
|
276
|
-
|
277
278
|
def draw n
|
278
|
-
|
279
|
-
|
280
|
-
boids.each(&:draw)
|
279
|
+
super
|
281
280
|
|
282
281
|
debug "r = #{Boid.max_distance}" if visual_debug?
|
283
282
|
fps n
|
data/examples/bounce.rb
CHANGED
@@ -17,11 +17,6 @@ class Ball < Graphics::Body
|
|
17
17
|
self.g = G
|
18
18
|
end
|
19
19
|
|
20
|
-
def draw
|
21
|
-
w.angle x, y, a, 10+3*m, :red
|
22
|
-
w.circle x, y, 5, :white, :filled
|
23
|
-
end
|
24
|
-
|
25
20
|
def update
|
26
21
|
fall
|
27
22
|
move
|
@@ -31,6 +26,13 @@ class Ball < Graphics::Body
|
|
31
26
|
def fall
|
32
27
|
self.velocity += g
|
33
28
|
end
|
29
|
+
|
30
|
+
class View
|
31
|
+
def self.draw w, b
|
32
|
+
w.angle b.x, b.y, b.a, 10+3*b.m, :red
|
33
|
+
w.circle b.x, b.y, 5, :white, :filled
|
34
|
+
end
|
35
|
+
end
|
34
36
|
end
|
35
37
|
|
36
38
|
class BounceSimulation < Graphics::Simulation
|
@@ -40,6 +42,7 @@ class BounceSimulation < Graphics::Simulation
|
|
40
42
|
super 640, 640, 16, "Bounce"
|
41
43
|
|
42
44
|
self.bs = populate Ball
|
45
|
+
register_bodies bs
|
43
46
|
end
|
44
47
|
|
45
48
|
def initialize_keys
|
@@ -48,13 +51,8 @@ class BounceSimulation < Graphics::Simulation
|
|
48
51
|
add_keydown_handler "r", &:reverse
|
49
52
|
end
|
50
53
|
|
51
|
-
def update n
|
52
|
-
bs.each(&:update)
|
53
|
-
end
|
54
|
-
|
55
54
|
def draw n
|
56
|
-
|
57
|
-
bs.each(&:draw)
|
55
|
+
super
|
58
56
|
fps n
|
59
57
|
end
|
60
58
|
|
data/examples/canvas.rb
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
require "graphics"
|
5
5
|
|
6
6
|
class Demo < Graphics::Simulation
|
7
|
+
CLEAR_COLOR = :white
|
8
|
+
|
7
9
|
attr_accessor :woot, :menlo32
|
8
10
|
attr_accessor :rct
|
9
11
|
|
@@ -27,7 +29,7 @@ class Demo < Graphics::Simulation
|
|
27
29
|
A = R2D*Math.atan2(200, 100)
|
28
30
|
|
29
31
|
def draw n
|
30
|
-
clear
|
32
|
+
clear
|
31
33
|
|
32
34
|
(0..90).step(30) do |deg|
|
33
35
|
shift = (woot.h*Math.sin(D2R*deg))
|
data/examples/collision.rb
CHANGED
@@ -23,13 +23,15 @@ class Sprite < Graphics::Body
|
|
23
23
|
self.a = (a + 180).degrees
|
24
24
|
end
|
25
25
|
|
26
|
-
def draw
|
27
|
-
w.blit image, x, y, a
|
28
|
-
end
|
29
|
-
|
30
26
|
def collide_with? other
|
31
27
|
w.cmap.check(x, y, w.cmap, other.x, other.y)
|
32
28
|
end
|
29
|
+
|
30
|
+
class View
|
31
|
+
def self.draw w, b
|
32
|
+
w.blit b.image, b.x, b.y, b.a
|
33
|
+
end
|
34
|
+
end
|
33
35
|
end
|
34
36
|
|
35
37
|
class Collision < Graphics::Simulation
|
@@ -44,6 +46,8 @@ class Collision < Graphics::Simulation
|
|
44
46
|
self.sprites = populate Sprite do |s|
|
45
47
|
s.image = tank_img
|
46
48
|
end
|
49
|
+
|
50
|
+
register_bodies sprites
|
47
51
|
end
|
48
52
|
|
49
53
|
def inspect
|
@@ -59,14 +63,12 @@ class Collision < Graphics::Simulation
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def update n
|
62
|
-
|
66
|
+
super
|
63
67
|
detect_collisions(sprites).each(&:collide)
|
64
68
|
end
|
65
69
|
|
66
70
|
def draw n
|
67
|
-
|
68
|
-
|
69
|
-
sprites.each(&:draw)
|
71
|
+
super
|
70
72
|
fps n
|
71
73
|
end
|
72
74
|
end
|
data/examples/demo.rb
CHANGED
@@ -19,32 +19,34 @@ class Ball < Graphics::Body
|
|
19
19
|
wrap
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
class View
|
23
|
+
def self.draw w, b
|
24
|
+
a = w.n % 360
|
25
|
+
x, y = b.x, b.y
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
+
w.angle x, y, a, 50, :green
|
28
|
+
w.circle x, y, 5, :white, :filled
|
29
|
+
end
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
30
33
|
class Demo < Graphics::Simulation
|
31
|
-
attr_accessor :ball, :img
|
34
|
+
attr_accessor :ball, :img, :n
|
32
35
|
|
33
36
|
def initialize
|
34
37
|
super 800, 800, 16, "Boid"
|
35
38
|
self.ball = Ball.new self
|
39
|
+
register_body ball
|
36
40
|
|
37
41
|
self.img = sprite 10, 10 do
|
38
42
|
circle 5, 5, 5, :white, :filled
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
|
-
def update n
|
43
|
-
ball.update
|
44
|
-
end
|
45
|
-
|
46
46
|
def draw n
|
47
|
-
|
47
|
+
self.n = n
|
48
|
+
|
49
|
+
super
|
48
50
|
|
49
51
|
line 100, 50, 125, 75, :white
|
50
52
|
|
@@ -79,8 +81,6 @@ class Demo < Graphics::Simulation
|
|
79
81
|
|
80
82
|
debug "debug"
|
81
83
|
|
82
|
-
ball.draw n
|
83
|
-
|
84
84
|
fps n
|
85
85
|
end
|
86
86
|
end
|
data/examples/fluid2.rb
CHANGED
@@ -22,14 +22,17 @@ class Particle < Graphics::Body
|
|
22
22
|
clear
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
class View
|
26
|
+
def self.draw w, b
|
27
|
+
s, a, m, d = b.s, b.a, b.m, b.density
|
28
|
+
x = b.x * s
|
29
|
+
y = b.y * s
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
+
w.circle(x, y, d, :gray)
|
32
|
+
w.circle(x, y, 5, :white)
|
31
33
|
|
32
|
-
|
34
|
+
w.angle x, y, a, m * s, :red
|
35
|
+
end
|
33
36
|
end
|
34
37
|
|
35
38
|
def clear
|
@@ -180,11 +183,13 @@ class FluidDynamics < Graphics::Simulation
|
|
180
183
|
particles << Particle.new(self, x + 1 + jitter, y + 5, S)
|
181
184
|
end
|
182
185
|
end
|
186
|
+
|
187
|
+
register_bodies particles
|
183
188
|
end
|
184
189
|
|
185
190
|
def draw n
|
186
|
-
|
187
|
-
|
191
|
+
super
|
192
|
+
|
188
193
|
fps n
|
189
194
|
end
|
190
195
|
|
data/examples/gol2.rb
CHANGED
data/examples/math.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
require "graphics"
|
4
4
|
|
5
5
|
class MathSimulation < Graphics::Simulation
|
6
|
+
CLEAR_COLOR = :white
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
super 640, 640, 16, "Math"
|
8
10
|
end
|
@@ -24,7 +26,7 @@ class MathSimulation < Graphics::Simulation
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def graph_paper
|
27
|
-
clear
|
29
|
+
clear
|
28
30
|
|
29
31
|
hline 1, :black
|
30
32
|
vline 0, :black
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require "graphics"
|
2
|
+
require "graphics/trail"
|
3
|
+
|
4
|
+
# A way to compute pi as the ratio of the area of a polygon and the diameter of
|
5
|
+
# the enclosing circle. A set of bouncing bullets create new vertices as they
|
6
|
+
# hit the perimeter of the circle. As the number of vertices tends to infinite
|
7
|
+
# the polygon will converge to the circle and the ratio to pi.
|
8
|
+
|
9
|
+
class Polygnome < Array
|
10
|
+
attr_reader :origin, :r, :s
|
11
|
+
|
12
|
+
def initialize center_x, center_y, w
|
13
|
+
@s = w
|
14
|
+
@r = w.r
|
15
|
+
@origin = V[center_x, center_y]
|
16
|
+
end
|
17
|
+
|
18
|
+
def draw
|
19
|
+
if size > 2
|
20
|
+
points = self << first
|
21
|
+
points.each_cons(2) { |a, b| @s.line a.x, a.y, b.x, b.y, :yellow }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def add vertex
|
26
|
+
self << vertex
|
27
|
+
|
28
|
+
if size > 2
|
29
|
+
sort_radar
|
30
|
+
SDL::WM.set_caption compute_pi, ''
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Sort vertex like a radar, by angle to center
|
36
|
+
def sort_radar
|
37
|
+
sort_by! do |v|
|
38
|
+
(360 + Math.atan2((v.y - origin.y), (v.x - origin.x))) % 360
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Algorithm to compute area of polygon, needs vertex sorted in radar mode
|
44
|
+
def compute_area
|
45
|
+
sol = 0.0
|
46
|
+
j = size - 1
|
47
|
+
each_with_index do |v, i|
|
48
|
+
sol += (self[j].x + v.x) * (self[j].y - v.y)
|
49
|
+
j = i
|
50
|
+
end
|
51
|
+
(sol / 2.0).abs
|
52
|
+
end
|
53
|
+
|
54
|
+
def compute_pi
|
55
|
+
"Pi: " + "%1.5f" % [compute_area / @r**2]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Bouncer < Graphics::Body
|
60
|
+
attr_reader :x, :y, :a, :m, :r, :s
|
61
|
+
attr_accessor :trail
|
62
|
+
|
63
|
+
def initialize w, magnitude
|
64
|
+
super w
|
65
|
+
self.trail = Graphics::Trail.new(w, 6, color = :red)
|
66
|
+
@s = w
|
67
|
+
@r = w.r
|
68
|
+
@x = rand(w.screen.w/4) + w.r
|
69
|
+
@y = rand(w.screen.h/4) + w.r
|
70
|
+
@a = random_angle
|
71
|
+
@m = magnitude
|
72
|
+
end
|
73
|
+
|
74
|
+
def target_point
|
75
|
+
rad = @a * D2R
|
76
|
+
V[@x + Math.cos(rad) * @m, @y + Math.sin(rad) * @m]
|
77
|
+
end
|
78
|
+
|
79
|
+
def outside_circle? v
|
80
|
+
(v.x - @r)**2 + (v.y - @r)**2 > @r**2
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# Slope and offset of line given 2 points
|
85
|
+
def line_to p
|
86
|
+
slope = (p.y - @y) / (p.x - @x)
|
87
|
+
offset = @y - (slope * @x)
|
88
|
+
[slope, offset]
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Intersection of enclosing circle and line y = ax + b. Algebraic solution
|
93
|
+
def intersection_circle_and l
|
94
|
+
a, b = l
|
95
|
+
beta = Math.sqrt((2 * a * @r**2) - (2 * a * b * @r) - b**2 + (2 * b * @r))
|
96
|
+
alfa = @r - (a * (b - @r))
|
97
|
+
gama = (1 + a**2)
|
98
|
+
|
99
|
+
x0 = [(alfa + beta)/gama, (alfa - beta)/gama].min_by {|e| (e - @x).abs}
|
100
|
+
y0 = a*x0 + b
|
101
|
+
V[x0, y0]
|
102
|
+
end
|
103
|
+
|
104
|
+
class View
|
105
|
+
def self.draw w, b
|
106
|
+
b.trail.draw # TODO: remove w stored everywhere
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def update
|
111
|
+
t = target_point
|
112
|
+
if outside_circle? t
|
113
|
+
t = intersection_circle_and line_to(t)
|
114
|
+
turn (160 + rand(15) - 15)
|
115
|
+
@s.poly.add t
|
116
|
+
end
|
117
|
+
self.position = t
|
118
|
+
trail << self
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class PiPolygon < Graphics::Simulation
|
123
|
+
RADIO = 400
|
124
|
+
BALLS = 10 # 2 30 100
|
125
|
+
MAGND = 10 # 10 10 50
|
126
|
+
|
127
|
+
attr_reader :r, :ball, :poly
|
128
|
+
|
129
|
+
def initialize
|
130
|
+
@r = RADIO
|
131
|
+
super @r * 2, @r * 2
|
132
|
+
@poly = Polygnome.new @r, @r, self
|
133
|
+
@balls = []
|
134
|
+
register_bodies @balls
|
135
|
+
BALLS.times { @balls << Bouncer.new(self, MAGND) }
|
136
|
+
end
|
137
|
+
|
138
|
+
def draw n
|
139
|
+
super
|
140
|
+
circle @r, @r, @r, :green
|
141
|
+
@poly.draw
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
PiPolygon.new.run if $0 == __FILE__
|