allegro4r 0.0.1-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|