graphics 1.0.0b5 → 1.0.0b6
Sign up to get free protection for your applications and to get access to all the features.
- 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__
|