tea 0.6.1
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.
- data/COPYING +674 -0
- data/COPYING.LESSER +165 -0
- data/README.rdoc +93 -0
- data/doc/example/bitmap_draw.rb +21 -0
- data/doc/example/bitmap_load.rb +14 -0
- data/doc/example/bitmap_new.rb +19 -0
- data/doc/example/circle.rb +24 -0
- data/doc/example/circle_alpha.rb +45 -0
- data/doc/example/circle_alpha_bitmap.rb +51 -0
- data/doc/example/circle_bitmap.rb +18 -0
- data/doc/example/clip.rb +46 -0
- data/doc/example/event_app.rb +45 -0
- data/doc/example/event_keyboard.rb +43 -0
- data/doc/example/event_mouse.rb +85 -0
- data/doc/example/font_hello.rb +22 -0
- data/doc/example/font_word_wrap.rb +44 -0
- data/doc/example/grab.rb +28 -0
- data/doc/example/init.rb +10 -0
- data/doc/example/lines.rb +49 -0
- data/doc/example/lines_aa.rb +44 -0
- data/doc/example/lines_alpha.rb +33 -0
- data/doc/example/point.rb +26 -0
- data/doc/example/rect.rb +15 -0
- data/doc/example/rect_alpha.rb +75 -0
- data/doc/example/screen_set_mode.rb +18 -0
- data/doc/example/screen_update.rb +14 -0
- data/doc/example/sfont_hello.rb +22 -0
- data/doc/example/smile.png +0 -0
- data/doc/example/smile_bounce.rb +44 -0
- data/doc/example/smile_move.rb +58 -0
- data/doc/example/smile_move_2.rb +78 -0
- data/doc/example/sound.rb +101 -0
- data/doc/example/state_app.rb +33 -0
- data/doc/example/state_keyboard.rb +23 -0
- data/doc/example/state_mouse.rb +60 -0
- data/doc/key_constants.textile +129 -0
- data/doc/key_modifiers.textile +19 -0
- data/doc/reference.textile +421 -0
- data/lib/tea.rb +34 -0
- data/lib/tea/c_bitmap.rb +122 -0
- data/lib/tea/c_error.rb +11 -0
- data/lib/tea/c_font.rb +302 -0
- data/lib/tea/c_sound.rb +144 -0
- data/lib/tea/m_color.rb +50 -0
- data/lib/tea/m_event.rb +65 -0
- data/lib/tea/m_event_app.rb +96 -0
- data/lib/tea/m_event_dispatch.rb +54 -0
- data/lib/tea/m_event_keyboard.rb +311 -0
- data/lib/tea/m_event_mouse.rb +189 -0
- data/lib/tea/mix_blitting.rb +31 -0
- data/lib/tea/mix_clipping.rb +71 -0
- data/lib/tea/mix_grabbing.rb +86 -0
- data/lib/tea/mix_image_saving.rb +70 -0
- data/lib/tea/mix_primitive.rb +613 -0
- data/lib/tea/o_screen.rb +98 -0
- metadata +137 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
# Test that Tea can plot points on bitmaps, e.g. the screen.
|
2
|
+
# Expected result is 4 points drawn as a rectangle in a 400x300 window for 2
|
3
|
+
# seconds.
|
4
|
+
|
5
|
+
require 'tea'
|
6
|
+
|
7
|
+
puts <<TEST
|
8
|
+
4 coloured points should appear in a rectangle formation, in a 400x300 window
|
9
|
+
for 2 seconds. Point formation:
|
10
|
+
|
11
|
+
red --- green
|
12
|
+
| |
|
13
|
+
blue -- white
|
14
|
+
TEST
|
15
|
+
|
16
|
+
Tea.init
|
17
|
+
Tea::Screen.set_mode 400, 300
|
18
|
+
|
19
|
+
Tea::Screen[100, 75] = Tea::Color::RED
|
20
|
+
Tea::Screen[300, 75] = Tea::Color::GREEN
|
21
|
+
Tea::Screen[100, 225] = Tea::Color::BLUE
|
22
|
+
Tea::Screen[300, 225] = Tea::Color::WHITE
|
23
|
+
|
24
|
+
Tea::Screen.update
|
25
|
+
|
26
|
+
sleep 2
|
data/doc/example/rect.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Test that filled rectangles can be drawn.
|
2
|
+
# Expected results are a 400x300 window, with a filled yellow rectangle in it.
|
3
|
+
|
4
|
+
require 'tea'
|
5
|
+
|
6
|
+
puts <<TEST
|
7
|
+
A 400x300 window should appear with a yellow rectangle for 2 seconds.
|
8
|
+
TEST
|
9
|
+
|
10
|
+
Tea.init
|
11
|
+
Tea::Screen.set_mode 400, 300
|
12
|
+
Tea::Screen.rect 50, 50, 300, 200, Tea::Color::YELLOW
|
13
|
+
Tea::Screen.update
|
14
|
+
|
15
|
+
sleep 2
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Test that alpha for rectangles works.
|
2
|
+
# Expected results are:
|
3
|
+
#
|
4
|
+
# * center: red rectangle (background)
|
5
|
+
# * top-left: translucent green rectangle
|
6
|
+
# * bottom-left: translucent white rectangle
|
7
|
+
# * bottom-right: solid blue rectangle
|
8
|
+
|
9
|
+
require 'tea'
|
10
|
+
|
11
|
+
puts <<TEST
|
12
|
+
You should see:
|
13
|
+
|
14
|
+
* center: red rectangle (background)
|
15
|
+
* top-left: translucent green rectangle
|
16
|
+
* bottom-left: translucent white rectangle
|
17
|
+
* bottom-right: solid blue rectangle
|
18
|
+
|
19
|
+
A smaller box with these same rectangles should appear in the top-right. It
|
20
|
+
can be moved with the arrow keys.
|
21
|
+
|
22
|
+
Press ESC key to exit.
|
23
|
+
TEST
|
24
|
+
|
25
|
+
Tea.init
|
26
|
+
Tea::Screen.set_mode 400, 300
|
27
|
+
|
28
|
+
TL_GREEN = Tea::Color.mix( 0, 255, 0, 128)
|
29
|
+
TL_BLUE = Tea::Color.mix( 0, 0, 255, 128)
|
30
|
+
TL_WHITE = Tea::Color.mix(255, 255, 255, 128)
|
31
|
+
|
32
|
+
x, y = 205, 15
|
33
|
+
up, down, left, right = false, false, false, false
|
34
|
+
wait_for_event = true
|
35
|
+
|
36
|
+
b = Tea::Bitmap.new(180, 130, Tea::Color::CLEAR)
|
37
|
+
b.rect 45, 32, 90, 65, Tea::Color::RED
|
38
|
+
b.rect 0, 0, 90, 65, TL_GREEN, :mix => :blend
|
39
|
+
b.rect 90, 65, 90, 65, TL_BLUE, :mix => :replace
|
40
|
+
b.rect 0, 65, 90, 65, TL_WHITE
|
41
|
+
|
42
|
+
begin
|
43
|
+
Tea::Screen.clear
|
44
|
+
|
45
|
+
Tea::Screen.rect 100, 75, 200, 150, Tea::Color::RED
|
46
|
+
Tea::Screen.rect 0, 0, 200, 150, TL_GREEN, :mix => :blend
|
47
|
+
Tea::Screen.rect 200, 150, 200, 150, TL_BLUE, :mix => :replace
|
48
|
+
Tea::Screen.rect 0, 150, 200, 150, TL_WHITE
|
49
|
+
|
50
|
+
Tea::Screen.blit b, x, y
|
51
|
+
|
52
|
+
Tea::Screen.update
|
53
|
+
e = Tea::Event.get(wait_for_event)
|
54
|
+
case e
|
55
|
+
when Tea::Kbd::Down
|
56
|
+
case e.key
|
57
|
+
when Tea::Kbd::UP then up = true
|
58
|
+
when Tea::Kbd::DOWN then down = true
|
59
|
+
when Tea::Kbd::LEFT then left = true
|
60
|
+
when Tea::Kbd::RIGHT then right = true
|
61
|
+
end
|
62
|
+
when Tea::Kbd::Up
|
63
|
+
case e.key
|
64
|
+
when Tea::Kbd::UP then up = false
|
65
|
+
when Tea::Kbd::DOWN then down = false
|
66
|
+
when Tea::Kbd::LEFT then left = false
|
67
|
+
when Tea::Kbd::RIGHT then right = false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
wait_for_event = !(up || down || left || right)
|
71
|
+
x -= 1 if left
|
72
|
+
x += 1 if right
|
73
|
+
y -= 1 if up
|
74
|
+
y += 1 if down
|
75
|
+
end until e.class == Tea::App::Exit || (e.class == Tea::Kbd::Down && e.key == Tea::Kbd::ESCAPE)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Test if the screen can initialise.
|
2
|
+
# Expected results:
|
3
|
+
#
|
4
|
+
# * output of "screen size is 320x240"
|
5
|
+
# * a blank 320x240 display window for 2 seconds.
|
6
|
+
|
7
|
+
require 'tea'
|
8
|
+
|
9
|
+
puts <<TEST
|
10
|
+
You should see a 320x240 window for 2 seconds, and the text "screen size is 320x240"
|
11
|
+
TEST
|
12
|
+
|
13
|
+
Tea.init
|
14
|
+
Tea::Screen.set_mode 320, 240
|
15
|
+
|
16
|
+
puts "screen size is #{Tea::Screen.w}x#{Tea::Screen.h}"
|
17
|
+
|
18
|
+
sleep 2
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Test if the screen can be updated without problems.
|
2
|
+
# Expected result is a 320x240 graphical window shown for 2 seconds.
|
3
|
+
|
4
|
+
require 'tea'
|
5
|
+
|
6
|
+
puts <<TEST
|
7
|
+
You should see a 320x240 window appear for 2 seconds.
|
8
|
+
TEST
|
9
|
+
|
10
|
+
Tea.init
|
11
|
+
Tea::Screen.set_mode 320, 240
|
12
|
+
Tea::Screen.update
|
13
|
+
|
14
|
+
sleep 2
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# This tests that SFonts can be loaded, rendered and drawn.
|
2
|
+
# Expected result: 'hello' in a small window for 5 seconds.
|
3
|
+
|
4
|
+
require 'tea'
|
5
|
+
|
6
|
+
puts <<TEST
|
7
|
+
You should see 'hello world' in a small window for 5 seconds.
|
8
|
+
TEST
|
9
|
+
|
10
|
+
Tea.init
|
11
|
+
Tea::Screen.set_mode 320, 240
|
12
|
+
|
13
|
+
font = Tea::Font.new('sfont.png', Tea::Font::SFONT)
|
14
|
+
message = 'hello world'
|
15
|
+
|
16
|
+
x = (Tea::Screen.w - font.string_w(message)) / 2
|
17
|
+
y = (Tea::Screen.h - font.h) / 2
|
18
|
+
font.draw_to Tea::Screen, x, y, message
|
19
|
+
|
20
|
+
Tea::Screen.update
|
21
|
+
|
22
|
+
sleep 5
|
Binary file
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This is a demo of 5 smiley faces bouncing around a small screen.
|
2
|
+
|
3
|
+
require 'tea'
|
4
|
+
|
5
|
+
puts <<TEST
|
6
|
+
You should see 5 smiley faces bouncing around on a 320x240 screen for 5 seconds.
|
7
|
+
TEST
|
8
|
+
|
9
|
+
class Smiley
|
10
|
+
def initialize(bitmap, start_x=0, start_y=0)
|
11
|
+
@bitmap = bitmap
|
12
|
+
@x = start_x
|
13
|
+
@y = start_y
|
14
|
+
@dx = rand() * 2 - 1
|
15
|
+
@dy = rand() * 2 - 1
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
@x += @dx
|
20
|
+
@y += @dy
|
21
|
+
@dx = -@dx if @x < 0 || @x + @bitmap.w >= Tea::Screen.w
|
22
|
+
@dy = -@dy if @y < 0 || @y + @bitmap.h >= Tea::Screen.h
|
23
|
+
end
|
24
|
+
|
25
|
+
def draw
|
26
|
+
Tea::Screen.blit @bitmap, @x, @y
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Tea.init
|
31
|
+
Tea::Screen.set_mode 320, 240
|
32
|
+
|
33
|
+
smile_bitmap = Tea::Bitmap.new('smile.png')
|
34
|
+
smiles = []
|
35
|
+
5.times { smiles << Smiley.new(smile_bitmap, rand(288), rand(208)) }
|
36
|
+
|
37
|
+
start = Time.now
|
38
|
+
until Time.now >= start + 5
|
39
|
+
smiles.each { |s| s.update }
|
40
|
+
Tea::Screen.clear
|
41
|
+
smiles.each { |s| s.draw }
|
42
|
+
Tea::Screen.update
|
43
|
+
sleep 0.001
|
44
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Move the Smiley face with the arrow keys. Press Esc to exit.
|
2
|
+
|
3
|
+
require 'tea'
|
4
|
+
|
5
|
+
class Smile
|
6
|
+
def initialize
|
7
|
+
@bitmap = Tea::Bitmap.new('smile.png')
|
8
|
+
@x = (Tea::Screen.w - @bitmap.w) / 2
|
9
|
+
@y = (Tea::Screen.h - @bitmap.h) / 2
|
10
|
+
@dx = @dy = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def n(move) @dy += move ? -1 : 1 end
|
14
|
+
def s(move) @dy += move ? 1 : -1 end
|
15
|
+
def e(move) @dx += move ? 1 : -1 end
|
16
|
+
def w(move) @dx += move ? -1 : 1 end
|
17
|
+
def stopped?; @dx == 0 && @dy == 0; end
|
18
|
+
|
19
|
+
def update
|
20
|
+
@x += @dx
|
21
|
+
@y += @dy
|
22
|
+
end
|
23
|
+
|
24
|
+
def draw
|
25
|
+
Tea::Screen.blit @bitmap, @x, @y
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Tea.init
|
30
|
+
Tea::Screen.set_mode 640, 480
|
31
|
+
player = Smile.new
|
32
|
+
wait_for_event = true
|
33
|
+
loop do
|
34
|
+
player.update
|
35
|
+
Tea::Screen.clear
|
36
|
+
player.draw
|
37
|
+
Tea::Screen.update
|
38
|
+
|
39
|
+
if e = Tea::Event.get(wait_for_event)
|
40
|
+
break if e.class == Tea::App::Exit
|
41
|
+
|
42
|
+
case e
|
43
|
+
when Tea::Kbd::Down then move = true
|
44
|
+
when Tea::Kbd::Up then move = false
|
45
|
+
else next
|
46
|
+
end
|
47
|
+
|
48
|
+
case e.key
|
49
|
+
when Tea::Kbd::UP then player.n(move)
|
50
|
+
when Tea::Kbd::DOWN then player.s(move)
|
51
|
+
when Tea::Kbd::RIGHT then player.e(move)
|
52
|
+
when Tea::Kbd::LEFT then player.w(move)
|
53
|
+
when Tea::Kbd::ESCAPE then break
|
54
|
+
end
|
55
|
+
|
56
|
+
wait_for_event = player.stopped?
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Move the Smiley with the arrow keys, and press Esc to exit. Identical to
|
2
|
+
# smile_move.rb, but uses Tea::Event::Dispatch in a controlling class to handle
|
3
|
+
# events.
|
4
|
+
|
5
|
+
require 'tea'
|
6
|
+
|
7
|
+
class Smile
|
8
|
+
def initialize
|
9
|
+
@bitmap = Tea::Bitmap.new('smile.png')
|
10
|
+
@x = (Tea::Screen.w - @bitmap.w) / 2
|
11
|
+
@y = (Tea::Screen.h - @bitmap.h) / 2
|
12
|
+
@dx = @dy = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def n(move) @dy += move ? -1 : 1 end
|
16
|
+
def s(move) @dy += move ? 1 : -1 end
|
17
|
+
def e(move) @dx += move ? 1 : -1 end
|
18
|
+
def w(move) @dx += move ? -1 : 1 end
|
19
|
+
def stopped?; @dx == 0 && @dy == 0; end
|
20
|
+
|
21
|
+
def update
|
22
|
+
@x += @dx
|
23
|
+
@y += @dy
|
24
|
+
end
|
25
|
+
|
26
|
+
def draw
|
27
|
+
Tea::Screen.blit @bitmap, @x, @y
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class SmileControllingState
|
32
|
+
def initialize
|
33
|
+
@player = Smile.new
|
34
|
+
@done = false
|
35
|
+
end
|
36
|
+
|
37
|
+
def done?; @done; end
|
38
|
+
def update; @player.update; end
|
39
|
+
def need_update?; !@player.stopped?; end
|
40
|
+
def draw
|
41
|
+
Tea::Screen.clear
|
42
|
+
@player.draw
|
43
|
+
end
|
44
|
+
|
45
|
+
include Tea::Event::Dispatch
|
46
|
+
|
47
|
+
def kbd_down(e)
|
48
|
+
case e.key
|
49
|
+
when Tea::Kbd::UP then @player.n true
|
50
|
+
when Tea::Kbd::DOWN then @player.s true
|
51
|
+
when Tea::Kbd::LEFT then @player.w true
|
52
|
+
when Tea::Kbd::RIGHT then @player.e true
|
53
|
+
when Tea::Kbd::ESCAPE then @done = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def kbd_up(e)
|
58
|
+
case e.key
|
59
|
+
when Tea::Kbd::UP then @player.n false
|
60
|
+
when Tea::Kbd::DOWN then @player.s false
|
61
|
+
when Tea::Kbd::LEFT then @player.w false
|
62
|
+
when Tea::Kbd::RIGHT then @player.e false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
Tea.init
|
68
|
+
Tea::Screen.set_mode 640, 480
|
69
|
+
state = SmileControllingState.new
|
70
|
+
until state.done?
|
71
|
+
state.update
|
72
|
+
state.draw
|
73
|
+
Tea::Screen.update
|
74
|
+
|
75
|
+
if e = Tea::Event.get(!state.need_update?)
|
76
|
+
state.dispatch_event e
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# A demo that attempts to test all of Tea::Sound's functionality.
|
2
|
+
|
3
|
+
require 'tea'
|
4
|
+
|
5
|
+
puts <<TEST
|
6
|
+
This is a simple sound demo. Up to 2 sounds can play simultaneously.
|
7
|
+
|
8
|
+
Keys:
|
9
|
+
|
10
|
+
[ - Switch to tone 1 (default)
|
11
|
+
] - Switch to tone 2
|
12
|
+
|
13
|
+
Right - Play tone
|
14
|
+
Left - Stop
|
15
|
+
Down - Pause
|
16
|
+
Up - Resume (unpause)
|
17
|
+
|
18
|
+
Enter - Print tone's status (stopped/playing/paused)
|
19
|
+
|
20
|
+
p - Pause all
|
21
|
+
r - Resume (unpause) all
|
22
|
+
s - Stop all
|
23
|
+
|
24
|
+
= - Tone volume +1/8
|
25
|
+
- - Tone volume -1/8
|
26
|
+
+ - Master volume +1/8
|
27
|
+
_ - Master volume -1/8
|
28
|
+
|
29
|
+
Esc - Exit demo
|
30
|
+
--
|
31
|
+
TEST
|
32
|
+
|
33
|
+
Tea.init
|
34
|
+
Tea::Screen.set_mode 100, 100
|
35
|
+
|
36
|
+
tone_sound = Tea::Sound.new('tone.wav')
|
37
|
+
tones = [tone_sound, tone_sound.clone]
|
38
|
+
|
39
|
+
which_tone = 0
|
40
|
+
|
41
|
+
done = false
|
42
|
+
until done
|
43
|
+
e = Tea::Event.get(true)
|
44
|
+
case e
|
45
|
+
when Tea::Kbd::Down
|
46
|
+
case e.key
|
47
|
+
|
48
|
+
when Tea::Kbd::OPEN_SQUARE_BRACKET
|
49
|
+
which_tone -= 1 if which_tone > 0
|
50
|
+
puts "Switched to tone ##{which_tone + 1}"
|
51
|
+
when Tea::Kbd::CLOSE_SQUARE_BRACKET
|
52
|
+
which_tone += 1 if which_tone < tones.length - 1
|
53
|
+
puts "Switched to tone ##{which_tone + 1}"
|
54
|
+
|
55
|
+
when Tea::Kbd::RIGHT
|
56
|
+
tones[which_tone].play
|
57
|
+
puts "Playing tone ##{which_tone + 1}"
|
58
|
+
when Tea::Kbd::LEFT
|
59
|
+
tones[which_tone].stop
|
60
|
+
puts "Stopping tone ##{which_tone + 1}"
|
61
|
+
when Tea::Kbd::DOWN
|
62
|
+
tones[which_tone].pause
|
63
|
+
puts "Pausing tone ##{which_tone + 1}"
|
64
|
+
when Tea::Kbd::UP
|
65
|
+
tones[which_tone].resume
|
66
|
+
puts "Resuming tone ##{which_tone + 1}"
|
67
|
+
|
68
|
+
when Tea::Kbd::ENTER
|
69
|
+
puts "Tone ##{which_tone + 1} is #{tones[which_tone].state.to_s}"
|
70
|
+
|
71
|
+
when Tea::Kbd::P
|
72
|
+
Tea::Sound.pause_all
|
73
|
+
puts "Pausing all sounds"
|
74
|
+
when Tea::Kbd::R
|
75
|
+
Tea::Sound.resume_all
|
76
|
+
puts "Resuming all sounds"
|
77
|
+
when Tea::Kbd::S
|
78
|
+
Tea::Sound.stop_all
|
79
|
+
puts "Stopping all sounds"
|
80
|
+
|
81
|
+
when Tea::Kbd::EQUALS
|
82
|
+
tones[which_tone].volume += 16
|
83
|
+
puts "Volume of tone ##{which_tone + 1} raised to #{tones[which_tone].volume} / 128"
|
84
|
+
when Tea::Kbd::MINUS
|
85
|
+
tones[which_tone].volume -= 16
|
86
|
+
puts "Volume of tone ##{which_tone + 1} lowered to #{tones[which_tone].volume} / 128"
|
87
|
+
when Tea::Kbd::PLUS
|
88
|
+
Tea::Sound.volume += 16
|
89
|
+
puts "Master volume raised to #{Tea::Sound.volume} / 128"
|
90
|
+
when Tea::Kbd::UNDERSCORE
|
91
|
+
Tea::Sound.volume -= 16
|
92
|
+
puts "Master volume lowered to #{Tea::Sound.volume} / 128"
|
93
|
+
|
94
|
+
when Tea::Kbd::ESCAPE
|
95
|
+
done = true
|
96
|
+
|
97
|
+
end
|
98
|
+
when Tea::App::Exit
|
99
|
+
done = true
|
100
|
+
end
|
101
|
+
end
|