allegro4r 0.0.1-x86-mswin32-60
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/History.txt +4 -0
- data/Manifest.txt +59 -0
- data/README.txt +94 -0
- data/examples/exdbuf.rb +58 -0
- data/examples/exfixed.rb +46 -0
- data/examples/exflame.rb +200 -0
- data/examples/exflip.rb +87 -0
- data/examples/exfont.rb +70 -0
- data/examples/exhello.rb +46 -0
- data/examples/exjoy.rb +206 -0
- data/examples/exkeys.rb +216 -0
- data/examples/exmem.rb +50 -0
- data/examples/exmidi.rb +97 -0
- data/examples/exmouse.rb +149 -0
- data/examples/expal.rb +70 -0
- data/examples/expat.rb +62 -0
- data/examples/exsample.rb +89 -0
- data/examples/extimer.rb +84 -0
- data/examples/unifont.dat +0 -0
- data/ext/a4r_API_BITMAP.c +27 -0
- data/ext/a4r_API_DIGI_DRIVER.c +14 -0
- data/ext/a4r_API_GFX_DRIVER.c +14 -0
- data/ext/a4r_API_JOYSTICK_AXIS_INFO.c +53 -0
- data/ext/a4r_API_JOYSTICK_BUTTON_INFO.c +27 -0
- data/ext/a4r_API_JOYSTICK_DRIVER.c +14 -0
- data/ext/a4r_API_JOYSTICK_INFO.c +84 -0
- data/ext/a4r_API_JOYSTICK_STICK_INFO.c +62 -0
- data/ext/a4r_API_KEYBOARD_DRIVER.c +14 -0
- data/ext/a4r_API_MIDI_DRIVER.c +14 -0
- data/ext/a4r_API_MOUSE_DRIVER.c +14 -0
- data/ext/a4r_API_PALETTE.c +63 -0
- data/ext/a4r_API_RGB.c +118 -0
- data/ext/a4r_API_TIMER_DRIVER.c +14 -0
- data/ext/a4r_API_bitmap_objects.c +310 -0
- data/ext/a4r_API_blitting_and_sprites.c +86 -0
- data/ext/a4r_API_digital_sample_routines.c +83 -0
- data/ext/a4r_API_direct_access_to_video_memory.c +102 -0
- data/ext/a4r_API_drawing_primitives.c +114 -0
- data/ext/a4r_API_file_and_compression_routines.c +27 -0
- data/ext/a4r_API_fixed_point_math_routines.c +98 -0
- data/ext/a4r_API_fonts.c +147 -0
- data/ext/a4r_API_graphics_modes.c +155 -0
- data/ext/a4r_API_joystick_routines.c +213 -0
- data/ext/a4r_API_keyboard_routines.c +420 -0
- data/ext/a4r_API_misc.c +133 -0
- data/ext/a4r_API_mouse_routines.c +220 -0
- data/ext/a4r_API_music_routines_midi.c +147 -0
- data/ext/a4r_API_palette_routines.c +112 -0
- data/ext/a4r_API_sound_init_routines.c +29 -0
- data/ext/a4r_API_text_output.c +178 -0
- data/ext/a4r_API_timer_routines.c +250 -0
- data/ext/a4r_API_transparency_and_patterned_drawing.c +87 -0
- data/ext/a4r_API_truecolor_pixel_formats.c +44 -0
- data/ext/a4r_API_unicode_routines.c +53 -0
- data/ext/a4r_API_using_allegro.c +98 -0
- data/ext/allegro4r.c +866 -0
- data/ext/allegro4r.h +311 -0
- data/ext/allegro4r.so +0 -0
- data/ext/extconf.rb +11 -0
- metadata +113 -0
data/examples/exjoy.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
#
|
2
|
+
# Example program (C Version) for the Allegro library, by Grzegorz Adam Hankiewicz.
|
3
|
+
# (Ruby port by Jason Frey)
|
4
|
+
#
|
5
|
+
# This program uses the Allegro library to detect and read the value
|
6
|
+
# of a joystick. The output of the program is a small target sight
|
7
|
+
# on the screen which you can move. At the same time the program will
|
8
|
+
# tell you what you are doing with the joystick (moving or firing).
|
9
|
+
|
10
|
+
require 'rubygems'
|
11
|
+
require 'allegro4r'
|
12
|
+
include Allegro4r::API
|
13
|
+
|
14
|
+
x = 160; y = 100 # these will be used to show the target sight
|
15
|
+
analogmode = false
|
16
|
+
|
17
|
+
exit 1 if allegro_init != 0 # you NEED this man! ;-)
|
18
|
+
|
19
|
+
install_keyboard # ahh... read the docs. I will explain only
|
20
|
+
# joystick specific routines
|
21
|
+
|
22
|
+
if set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0
|
23
|
+
if set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0
|
24
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
25
|
+
allegro_message("Unable to set any graphic mode\n%s\n" % allegro_error)
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
set_palette(default_palette)
|
31
|
+
clear_bitmap(screen)
|
32
|
+
textout_centre_ex(screen, font, "Please center the joystick", SCREEN_W()/2, SCREEN_H()/2 - 36, palette_color[255], 0)
|
33
|
+
textout_centre_ex(screen, font, "and press a key.", SCREEN_W()/2, SCREEN_H()/2 - 20, palette_color[255], 0)
|
34
|
+
|
35
|
+
exit 0 if (readkey & 0xFF) == 27
|
36
|
+
|
37
|
+
# the first thing is to initialise the joystick driver
|
38
|
+
if install_joystick(JOY_TYPE_AUTODETECT) != 0
|
39
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
40
|
+
allegro_message("Error initialising joystick\n%s\n", allegro_error)
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
|
44
|
+
# make sure that we really do have a joystick
|
45
|
+
if num_joysticks == 0
|
46
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
47
|
+
allegro_message("Error: joystick not found\n")
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
|
51
|
+
# before using the joystick, we have to calibrate it. This loop only
|
52
|
+
# calibrates joystick number 0, but you could do the same thing for
|
53
|
+
# other sticks if they are present (the num_joysticks variable will
|
54
|
+
# tell you how many there are).
|
55
|
+
while joy[0].flags & JOYFLAG_CALIBRATE != 0
|
56
|
+
msg = calibrate_joystick_name(0)
|
57
|
+
|
58
|
+
clear_bitmap(screen)
|
59
|
+
textout_centre_ex(screen, font, msg, SCREEN_W()/2, 64, palette_color[255], 0)
|
60
|
+
textout_centre_ex(screen, font, "and press a key.", SCREEN_W()/2, 80, palette_color[255], 0)
|
61
|
+
|
62
|
+
exit 0 if (readkey & 0xFF) == 27
|
63
|
+
|
64
|
+
if calibrate_joystick(0) != 0
|
65
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
66
|
+
allegro_message("Error calibrating joystick!\n")
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# if this joystick supports analogue input, ask the user whether to
|
72
|
+
# use digital or analogue mode. If it is only a digital pad, we don't
|
73
|
+
# bother with this question.
|
74
|
+
#
|
75
|
+
if joy[0].stick[0].flags & JOYFLAG_ANALOGUE != 0
|
76
|
+
clear_bitmap(screen)
|
77
|
+
textout_centre_ex(screen, font, "Now press 'D' to use a digital", SCREEN_W()/2, 64, palette_color[255], 0)
|
78
|
+
textout_centre_ex(screen, font, "joystick or 'A' for analogue mode.", SCREEN_W()/2, 80, palette_color[255], 0)
|
79
|
+
|
80
|
+
loop do
|
81
|
+
c = readkey & 0xFF
|
82
|
+
|
83
|
+
if c == ?d || c == ?D
|
84
|
+
analogmode = false
|
85
|
+
break
|
86
|
+
elsif c == ?a || c == ?A
|
87
|
+
analogmode = true
|
88
|
+
break
|
89
|
+
elsif c == 27
|
90
|
+
exit 0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
else
|
94
|
+
analogmode = false
|
95
|
+
end
|
96
|
+
|
97
|
+
drawing_mode(DRAW_MODE_XOR, nil, 0, 0)
|
98
|
+
clear_keybuf
|
99
|
+
|
100
|
+
bmp = create_bitmap(320, 200)
|
101
|
+
clear_bitmap(bmp)
|
102
|
+
|
103
|
+
loop do
|
104
|
+
poll_joystick # we HAVE to do this to read the joystick
|
105
|
+
|
106
|
+
clear_bitmap(bmp)
|
107
|
+
|
108
|
+
textout_centre_ex(bmp, font, joystick_driver.name, 160, 150, palette_color[255], 0)
|
109
|
+
|
110
|
+
if (analogmode)
|
111
|
+
textout_centre_ex(bmp, font, "Analog mode selected", 160, 160, palette_color[255], 0)
|
112
|
+
else
|
113
|
+
textout_centre_ex(bmp, font, "Digital mode selected", 160, 160, palette_color[255], 0)
|
114
|
+
end
|
115
|
+
|
116
|
+
textout_centre_ex(bmp, font, "Move the joystick all around", 160, 170, palette_color[255], 0)
|
117
|
+
textout_centre_ex(bmp, font, "Press any key to exit", 160, 180, palette_color[255], 0)
|
118
|
+
textout_centre_ex(bmp, font, "Made by Grzegorz Adam Hankiewicz", 160, 190, palette_color[255], 0)
|
119
|
+
|
120
|
+
# if we detect any buttons, we print a message on the screen
|
121
|
+
(0...joy[0].num_buttons).each do |c|
|
122
|
+
if (joy[0].button[c].b)
|
123
|
+
textprintf_centre_ex(bmp, font, 160, c*10, palette_color[15], 0, "%s pressed" % joy[0].button[c].name)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
if !analogmode
|
128
|
+
# now we have to check individually every possible movement
|
129
|
+
# and actualize the coordinates of the target sight.
|
130
|
+
if joy[0].stick[0].axis[0].d1
|
131
|
+
x -= 1 if x > 0
|
132
|
+
textout_centre_ex(bmp, font, "Left", 120, 100, palette_color[255], 0)
|
133
|
+
end
|
134
|
+
if joy[0].stick[0].axis[0].d2
|
135
|
+
x += 1 if x < 319
|
136
|
+
textout_centre_ex(bmp, font, "Right", 200, 100, palette_color[255], 0)
|
137
|
+
end
|
138
|
+
if joy[0].stick[0].axis[1].d1
|
139
|
+
y -= 1 if y > 0
|
140
|
+
textout_centre_ex(bmp, font, "Up", 160, 70, palette_color[255], 0)
|
141
|
+
end
|
142
|
+
if joy[0].stick[0].axis[1].d2
|
143
|
+
y += 1 if y < 199
|
144
|
+
textout_centre_ex(bmp, font, "Down", 160, 130, palette_color[255], 0)
|
145
|
+
end
|
146
|
+
else
|
147
|
+
# yeah! Remember the 'ifs' of the digital part? This looks
|
148
|
+
# much better, only 2 lines.
|
149
|
+
x += joy[0].stick[0].axis[0].pos/40
|
150
|
+
y += joy[0].stick[0].axis[1].pos/40
|
151
|
+
|
152
|
+
# for informational purposes, show the input values on screen */
|
153
|
+
textprintf_ex(bmp, font, 0, 0, palette_color[255], 0, "Axis 0: %d" % joy[0].stick[0].axis[0].pos)
|
154
|
+
textprintf_ex(bmp, font, 0, 10, palette_color[255], 0, "Axis 1: %d" % joy[0].stick[0].axis[1].pos)
|
155
|
+
|
156
|
+
# by checking if the values were positive or negative, we
|
157
|
+
# can know in which the direction the user pulled the joy.
|
158
|
+
if joy[0].stick[0].axis[0].pos/40 < 0
|
159
|
+
textout_centre_ex(bmp, font, "Left", 120, 100, palette_color[255], 0)
|
160
|
+
end
|
161
|
+
|
162
|
+
if joy[0].stick[0].axis[0].pos/40 > 0
|
163
|
+
textout_centre_ex(bmp, font, "Right", 200, 100, palette_color[255], 0)
|
164
|
+
end
|
165
|
+
|
166
|
+
if joy[0].stick[0].axis[1].pos/40 < 0
|
167
|
+
textout_centre_ex(bmp, font, "Up", 160, 70, palette_color[255], 0)
|
168
|
+
end
|
169
|
+
|
170
|
+
if joy[0].stick[0].axis[1].pos/40 > 0
|
171
|
+
textout_centre_ex(bmp, font, "Down", 160, 130, palette_color[255], 0)
|
172
|
+
end
|
173
|
+
|
174
|
+
# WARNING! An analog joystick can move more than 1 pixel at
|
175
|
+
# a time and the checks we did with the digital part don't
|
176
|
+
# work any longer because the steps of the target sight could
|
177
|
+
# 'jump' over the limits.
|
178
|
+
# To avoid this, we just check if the target sight has gone
|
179
|
+
# out of the screen. If yes, we put it back at the border.
|
180
|
+
x = 319 if x > 319
|
181
|
+
|
182
|
+
x = 0 if x < 0
|
183
|
+
|
184
|
+
y = 0 if y < 0
|
185
|
+
|
186
|
+
y = 199 if y > 199
|
187
|
+
end
|
188
|
+
|
189
|
+
# this draws the target sight.
|
190
|
+
circle(bmp, x, y, 5, palette_color[255])
|
191
|
+
putpixel(bmp, x, y, palette_color[255])
|
192
|
+
putpixel(bmp, x+1, y, palette_color[255])
|
193
|
+
putpixel(bmp, x, y+1, palette_color[255])
|
194
|
+
putpixel(bmp, x-1, y, palette_color[255])
|
195
|
+
putpixel(bmp, x, y-1, palette_color[255])
|
196
|
+
putpixel(bmp, x+5, y, palette_color[255])
|
197
|
+
putpixel(bmp, x, y+5, palette_color[255])
|
198
|
+
putpixel(bmp, x-5, y, palette_color[255])
|
199
|
+
putpixel(bmp, x, y-5, palette_color[255])
|
200
|
+
|
201
|
+
blit(bmp, screen, 0, 0, SCREEN_W()/2 - 160, SCREEN_H()/2 - 100, 320, 200)
|
202
|
+
|
203
|
+
break unless !keypressed
|
204
|
+
end
|
205
|
+
|
206
|
+
destroy_bitmap(bmp)
|
data/examples/exkeys.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
#
|
2
|
+
# Example program (C Version) for the Allegro library, by Shawn Hargreaves.
|
3
|
+
# (Ruby port by Jason Frey)
|
4
|
+
#
|
5
|
+
# This program demonstrates how to access the keyboard. The
|
6
|
+
# first part shows the basic use of readkey(). The second part
|
7
|
+
# shows how to extract the ASCII value. Next come the scan codes.
|
8
|
+
# The fourth test detects modifier keys like alt or shift. The
|
9
|
+
# fifth test requires some focus to be passed. The final step
|
10
|
+
# shows how to use the global key array to read simultaneous
|
11
|
+
# key presses.
|
12
|
+
# The last method to detect key presses are keyboard callbacks.
|
13
|
+
# This is demonstrated by by installing a keyboard callback,
|
14
|
+
# which marks all pressed keys by drawing to a grid.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'rubygems'
|
18
|
+
require 'allegro4r'
|
19
|
+
include Allegro4r::API
|
20
|
+
|
21
|
+
key_names = [
|
22
|
+
"(none)", "KEY_A", "KEY_B", "KEY_C",
|
23
|
+
"KEY_D", "KEY_E", "KEY_F", "KEY_G",
|
24
|
+
"KEY_H", "KEY_I", "KEY_J", "KEY_K",
|
25
|
+
"KEY_L", "KEY_M", "KEY_N", "KEY_O",
|
26
|
+
"KEY_P", "KEY_Q", "KEY_R", "KEY_S",
|
27
|
+
"KEY_T", "KEY_U", "KEY_V", "KEY_W",
|
28
|
+
"KEY_X", "KEY_Y", "KEY_Z", "KEY_0",
|
29
|
+
"KEY_1", "KEY_2", "KEY_3", "KEY_4",
|
30
|
+
"KEY_5", "KEY_6", "KEY_7", "KEY_8",
|
31
|
+
"KEY_9", "KEY_0_PAD", "KEY_1_PAD", "KEY_2_PAD",
|
32
|
+
"KEY_3_PAD", "KEY_4_PAD", "KEY_5_PAD", "KEY_6_PAD",
|
33
|
+
"KEY_7_PAD", "KEY_8_PAD", "KEY_9_PAD", "KEY_F1",
|
34
|
+
"KEY_F2", "KEY_F3", "KEY_F4", "KEY_F5",
|
35
|
+
"KEY_F6", "KEY_F7", "KEY_F8", "KEY_F9",
|
36
|
+
"KEY_F10", "KEY_F11", "KEY_F12", "KEY_ESC",
|
37
|
+
"KEY_TILDE", "KEY_MINUS", "KEY_EQUALS", "KEY_BACKSPACE",
|
38
|
+
"KEY_TAB", "KEY_OPENBRACE", "KEY_CLOSEBRACE", "KEY_ENTER",
|
39
|
+
"KEY_COLON", "KEY_QUOTE", "KEY_BACKSLASH", "KEY_BACKSLASH2",
|
40
|
+
"KEY_COMMA", "KEY_STOP", "KEY_SLASH", "KEY_SPACE",
|
41
|
+
"KEY_INSERT", "KEY_DEL", "KEY_HOME", "KEY_END",
|
42
|
+
"KEY_PGUP", "KEY_PGDN", "KEY_LEFT", "KEY_RIGHT",
|
43
|
+
"KEY_UP", "KEY_DOWN", "KEY_SLASH_PAD", "KEY_ASTERISK",
|
44
|
+
"KEY_MINUS_PAD", "KEY_PLUS_PAD", "KEY_DEL_PAD", "KEY_ENTER_PAD",
|
45
|
+
"KEY_PRTSCR", "KEY_PAUSE", "KEY_ABNT_C1", "KEY_YEN",
|
46
|
+
"KEY_KANA", "KEY_CONVERT", "KEY_NOCONVERT", "KEY_AT",
|
47
|
+
"KEY_CIRCUMFLEX", "KEY_COLON2", "KEY_KANJI", "KEY_EQUALS_PAD",
|
48
|
+
"KEY_BACKQUOTE", "KEY_SEMICOLON", "KEY_COMMAND", "KEY_UNKNOWN1",
|
49
|
+
"KEY_UNKNOWN2", "KEY_UNKNOWN3", "KEY_UNKNOWN4", "KEY_UNKNOWN5",
|
50
|
+
"KEY_UNKNOWN6", "KEY_UNKNOWN7", "KEY_UNKNOWN8", "KEY_LSHIFT",
|
51
|
+
"KEY_RSHIFT", "KEY_LCONTROL", "KEY_RCONTROL", "KEY_ALT",
|
52
|
+
"KEY_ALTGR", "KEY_LWIN", "KEY_RWIN", "KEY_MENU",
|
53
|
+
"KEY_SCRLOCK", "KEY_NUMLOCK", "KEY_CAPSLOCK", "KEY_MAX"
|
54
|
+
]
|
55
|
+
|
56
|
+
# Keyboard callback. We are very evil and draw to the screen from within
|
57
|
+
# the callback. Don't do this in your own programs ;)
|
58
|
+
def keypress_handler(scancode)
|
59
|
+
i = scancode & 0x7f
|
60
|
+
x = SCREEN_W() - 100 * 3 + (i % 3) * 100
|
61
|
+
y = SCREEN_H() / 2 + (i / 3 - 21) * 10
|
62
|
+
color = scancode & 0x80 != 0 ? makecol(255, 255, 0) : makecol(128, 0, 0)
|
63
|
+
rectfill(screen, x, y, x + 95, y + 8, color)
|
64
|
+
str = ustrzncpy(scancode_to_name(i), 12)
|
65
|
+
textprintf_ex(screen, font, x + 1, y + 1, makecol(0, 0, 0), -1, str)
|
66
|
+
end
|
67
|
+
|
68
|
+
# helper function for making more room on the screen
|
69
|
+
def scroll
|
70
|
+
blit(screen, screen, 0, 32, 0, 24, SCREEN_W() / 2, SCREEN_H() - 32)
|
71
|
+
rectfill(screen, 0, SCREEN_H() - 16, SCREEN_W() / 2, SCREEN_H() - 1, makecol(255, 255, 255))
|
72
|
+
end
|
73
|
+
|
74
|
+
exit 1 if allegro_init != 0
|
75
|
+
install_keyboard
|
76
|
+
install_timer
|
77
|
+
|
78
|
+
if set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0
|
79
|
+
if set_gfx_mode(GFX_SAFE, 640, 480, 0, 0) != 0
|
80
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
81
|
+
allegro_message("Unable to set any graphic mode\n%s\n" % allegro_error)
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
set_palette(desktop_palette)
|
87
|
+
|
88
|
+
clear_to_color(screen, makecol(255, 255, 255))
|
89
|
+
|
90
|
+
# Draw the initial keys grid by simulating release of every key.
|
91
|
+
(0...KEY_MAX).each do |k|
|
92
|
+
keypress_handler(k + 0x80)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Install our keyboard callback.
|
96
|
+
# TODO: Have not been able to figure out how to get the keyboard interrupt stuff
|
97
|
+
# to work with Ruby, so I'm temporarily skipping this part.
|
98
|
+
# LOCK_FUNCTION(:keypress_handler)
|
99
|
+
# Allegro4r::API.keyboard_lowlevel_callback = self.method(:keypress_handler)
|
100
|
+
|
101
|
+
acquire_screen
|
102
|
+
textprintf_centre_ex(screen, font, SCREEN_W()/2, 8, makecol(0, 0, 0), makecol(255, 255, 255), "Driver: %s" % keyboard_driver.name)
|
103
|
+
|
104
|
+
# keyboard input can be accessed with the readkey function
|
105
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press some keys (ESC to finish)")
|
106
|
+
scroll
|
107
|
+
|
108
|
+
loop do
|
109
|
+
release_screen
|
110
|
+
k = readkey
|
111
|
+
acquire_screen
|
112
|
+
scroll
|
113
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "readkey returned %-6d (0x%04X)" % [k, k])
|
114
|
+
break unless (k & 0xFF) != 27
|
115
|
+
end
|
116
|
+
|
117
|
+
# the ASCII code is in the low byte of the return value
|
118
|
+
scroll; scroll; scroll
|
119
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press some more keys (ESC to finish)")
|
120
|
+
scroll
|
121
|
+
|
122
|
+
loop do
|
123
|
+
release_screen
|
124
|
+
k = readkey
|
125
|
+
acquire_screen
|
126
|
+
scroll
|
127
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "ASCII code is %d" % (k & 0xFF))
|
128
|
+
break unless (k & 0xFF) != 27
|
129
|
+
end
|
130
|
+
|
131
|
+
# the hardware scan code is in the high byte of the return value
|
132
|
+
scroll; scroll; scroll
|
133
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press some more keys (ESC to finish)")
|
134
|
+
scroll
|
135
|
+
|
136
|
+
loop do
|
137
|
+
release_screen
|
138
|
+
k = readkey
|
139
|
+
acquire_screen
|
140
|
+
scroll
|
141
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Scan code is %d (%s)" % [k>>8, key_names[k>>8]])
|
142
|
+
break unless (k & 0xFF) != 27
|
143
|
+
end
|
144
|
+
|
145
|
+
# key qualifiers are stored in the key_shifts variable. Note that this
|
146
|
+
# version of the code uses ureadkey instead of readkey: that is
|
147
|
+
# necessary if you want to access Unicode characters from outside
|
148
|
+
# the normal ASCII range, for example to support Russian or Chinese.
|
149
|
+
scroll; scroll; scroll
|
150
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press some more keys (ESC to finish)")
|
151
|
+
scroll
|
152
|
+
|
153
|
+
loop do
|
154
|
+
release_screen
|
155
|
+
k = ureadkey(nil)
|
156
|
+
acquire_screen
|
157
|
+
buf = ""
|
158
|
+
buf << "shift " if (key_shifts & KB_SHIFT_FLAG != 0)
|
159
|
+
buf << "ctrl " if (key_shifts & KB_CTRL_FLAG != 0)
|
160
|
+
buf << "alt " if (key_shifts & KB_ALT_FLAG != 0)
|
161
|
+
buf << "lwin " if (key_shifts & KB_LWIN_FLAG != 0)
|
162
|
+
buf << "rwin " if (key_shifts & KB_RWIN_FLAG != 0)
|
163
|
+
buf << "menu " if (key_shifts & KB_MENU_FLAG != 0)
|
164
|
+
buf << "command " if (key_shifts & KB_COMMAND_FLAG != 0)
|
165
|
+
buf << usprintf("'%c' [0x%02x]" % [k != 0 ? k : ' '[0], k])
|
166
|
+
buf << " caps" if (key_shifts & KB_CAPSLOCK_FLAG != 0)
|
167
|
+
buf << " num" if (key_shifts & KB_NUMLOCK_FLAG != 0)
|
168
|
+
buf << " scrl" if (key_shifts & KB_SCROLOCK_FLAG != 0)
|
169
|
+
scroll
|
170
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), buf)
|
171
|
+
break unless k != 27
|
172
|
+
end
|
173
|
+
|
174
|
+
# various scan codes are defined in allegro.h as KEY_* constants
|
175
|
+
scroll; scroll; scroll
|
176
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press F6")
|
177
|
+
scroll
|
178
|
+
|
179
|
+
release_screen
|
180
|
+
k = readkey
|
181
|
+
acquire_screen
|
182
|
+
|
183
|
+
while (k>>8) != KEY_F6 && (k>>8) != KEY_ESC
|
184
|
+
scroll
|
185
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Wrong key, stupid! I said press F6")
|
186
|
+
release_screen
|
187
|
+
k = readkey
|
188
|
+
acquire_screen
|
189
|
+
end
|
190
|
+
|
191
|
+
# for detecting multiple simultaneous key presses, use the key[] array
|
192
|
+
scroll; scroll; scroll
|
193
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), "Press a combination of numbers")
|
194
|
+
scroll; scroll
|
195
|
+
|
196
|
+
release_screen
|
197
|
+
|
198
|
+
buf = ' ' * 10
|
199
|
+
loop do
|
200
|
+
buf[0] = key[KEY_0] ? '0' : ' '
|
201
|
+
buf[1] = key[KEY_1] ? '1' : ' '
|
202
|
+
buf[2] = key[KEY_2] ? '2' : ' '
|
203
|
+
buf[3] = key[KEY_3] ? '3' : ' '
|
204
|
+
buf[4] = key[KEY_4] ? '4' : ' '
|
205
|
+
buf[5] = key[KEY_5] ? '5' : ' '
|
206
|
+
buf[6] = key[KEY_6] ? '6' : ' '
|
207
|
+
buf[7] = key[KEY_7] ? '7' : ' '
|
208
|
+
buf[8] = key[KEY_8] ? '8' : ' '
|
209
|
+
buf[9] = key[KEY_9] ? '9' : ' '
|
210
|
+
textprintf_ex(screen, font, 8, SCREEN_H()-16, makecol(0, 0, 0), makecol(255, 255, 255), buf)
|
211
|
+
rest(1)
|
212
|
+
break unless !keypressed || (readkey >> 8) != KEY_ESC
|
213
|
+
end
|
214
|
+
|
215
|
+
clear_keybuf
|
216
|
+
# Allegro4r::API.keyboard_lowlevel_callback = nil;
|
data/examples/exmem.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# Example program (C Version) for the Allegro library, by Shawn Hargreaves.
|
3
|
+
# (Ruby port by Jason Frey)
|
4
|
+
#
|
5
|
+
# This program demonstrates the use of memory bitmaps. It creates
|
6
|
+
# a small temporary bitmap in memory, draws some circles onto it,
|
7
|
+
# and then blits lots of copies of it onto the screen.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'rubygems'
|
11
|
+
require 'allegro4r'
|
12
|
+
include Allegro4r::API
|
13
|
+
|
14
|
+
exit 1 if allegro_init != 0
|
15
|
+
install_keyboard
|
16
|
+
|
17
|
+
if set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0
|
18
|
+
if set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0
|
19
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
20
|
+
allegro_message("Unable to set any graphic mode\n%s\n" % allegro_error)
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
set_palette(desktop_palette)
|
26
|
+
|
27
|
+
# make a memory bitmap sized 20x20
|
28
|
+
memory_bitmap = create_bitmap(20, 20)
|
29
|
+
|
30
|
+
# draw some circles onto it
|
31
|
+
clear_bitmap(memory_bitmap)
|
32
|
+
(0..15).each do |x|
|
33
|
+
circle(memory_bitmap, 10, 10, x, palette_color[x])
|
34
|
+
end
|
35
|
+
|
36
|
+
# blit lots of copies of it onto the screen
|
37
|
+
acquire_screen
|
38
|
+
|
39
|
+
(0...SCREEN_H()).step(20) do |y|
|
40
|
+
(0...SCREEN_W()).step(20) do |x|
|
41
|
+
blit(memory_bitmap, screen, 0, 0, x, y, 20, 20)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
release_screen
|
46
|
+
|
47
|
+
# free the memory bitmap
|
48
|
+
destroy_bitmap(memory_bitmap)
|
49
|
+
|
50
|
+
readkey
|
data/examples/exmidi.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
#
|
2
|
+
# Example program (C Version) for the Allegro library, by Shawn Hargreaves.
|
3
|
+
# (Ruby port by Jason Frey)
|
4
|
+
#
|
5
|
+
# This program demonstrates how to play MIDI files.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'allegro4r'
|
10
|
+
include Allegro4r::API
|
11
|
+
|
12
|
+
paused = false
|
13
|
+
done = false
|
14
|
+
|
15
|
+
exit 1 if allegro_init != 0
|
16
|
+
|
17
|
+
if ARGV.length != 1
|
18
|
+
allegro_message("Usage: 'ruby exmidi.rb filename.mid'\n")
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
install_keyboard
|
23
|
+
install_timer
|
24
|
+
|
25
|
+
# install a MIDI sound driver
|
26
|
+
if install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, nil) != 0
|
27
|
+
allegro_message("Error initialising sound system\n%s\n" % allegro_error)
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
|
31
|
+
# read in the MIDI file
|
32
|
+
the_music = load_midi(ARGV[0])
|
33
|
+
if the_music.nil?
|
34
|
+
allegro_message("Error reading MIDI file '%s'\n" % ARGV[0])
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
length = get_midi_length(the_music)
|
38
|
+
beats = -midi_pos # get_midi_length updates midi_pos to the negative
|
39
|
+
# number of beats (quarter notes) in the midi.
|
40
|
+
|
41
|
+
if set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0
|
42
|
+
if set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0
|
43
|
+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0)
|
44
|
+
allegro_message("Unable to set any graphic mode\n%s\n" % allegro_error)
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# try to continue in the background
|
50
|
+
if set_display_switch_mode(SWITCH_BACKGROUND)
|
51
|
+
set_display_switch_mode(SWITCH_BACKAMNESIA)
|
52
|
+
end
|
53
|
+
|
54
|
+
set_palette(desktop_palette)
|
55
|
+
background_color = makecol(255, 255, 255)
|
56
|
+
text_color = makecol(0, 0, 0)
|
57
|
+
clear_to_color(screen, background_color)
|
58
|
+
th = text_height(font)
|
59
|
+
x = SCREEN_W() / 2
|
60
|
+
|
61
|
+
textprintf_centre_ex(screen, font, x, SCREEN_H() / 3, text_color, -1, "Driver: %s" % midi_driver.name)
|
62
|
+
textprintf_centre_ex(screen, font, x, SCREEN_H() / 2, text_color, -1, "Playing %s" % get_filename(ARGV[0]))
|
63
|
+
|
64
|
+
# start up the MIDI file
|
65
|
+
play_midi(the_music, true)
|
66
|
+
|
67
|
+
y = 2 * SCREEN_H() / 3
|
68
|
+
tw = text_length(font, "0000:00 / 0000:00")
|
69
|
+
# wait for a key press
|
70
|
+
while !done
|
71
|
+
# P key pauses/resumes, any other key exits.
|
72
|
+
while keypressed
|
73
|
+
k = readkey & 255
|
74
|
+
if k == ?p
|
75
|
+
paused = !paused
|
76
|
+
if paused
|
77
|
+
midi_pause
|
78
|
+
textprintf_centre_ex(screen, font, x, y + th * 3, text_color, -1, "P A U S E D")
|
79
|
+
else
|
80
|
+
midi_resume
|
81
|
+
rectfill(screen, x - tw / 2, y + th * 3, x + tw / 2, y + th * 4, background_color)
|
82
|
+
end
|
83
|
+
else
|
84
|
+
done = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
pos = midi_time
|
88
|
+
beat = midi_pos
|
89
|
+
rectfill(screen, x - tw / 2, y, x + tw / 2, y + th * 2, background_color)
|
90
|
+
textprintf_centre_ex(screen, font, x, y, text_color, -1, "%d:%02d / %d:%02d" % [pos / 60, pos % 60, length / 60, length % 60])
|
91
|
+
textprintf_centre_ex(screen, font, x, y + th, text_color, -1, "beat %d / %d" % [beat, beats])
|
92
|
+
# We have nothing else to do.
|
93
|
+
rest(100)
|
94
|
+
end
|
95
|
+
|
96
|
+
# destroy the MIDI file
|
97
|
+
destroy_midi(the_music)
|