|
[A5] Odds and Ends |
Specter Phoenix
Member #1,425
July 2001
|
Just seeking help and advice for these last three issues. I've hit some issues I'm trying to figure out and needed some advice on. I can't seem to do a splash screen that will display until space bar is pressed, at which point the game starts. Trying to get a screenshot function working based off the A5 Wiki source and wanted to see if anyone had advice on that. ( http://wiki.allegro.cc/index.php?title=Allegro_5_Screenshot ) Trying to implement a high score and debating on the format and needing advice. Should I just do the custom 3 initials with high score with top 10 to 20 high scores? I realize my code is terrible and rand() obsessed, so try not to rip me a new one too much: 1#include "init.h"
2#include "sprite.h"
3#include "scrnshot.h"
4#include <fstream>
5#include <cstdio>
6#include <cstdlib>
7#include <ctime>
8
9const int SCREEN_H = 480;
10const int SCREEN_W = 640;
11#define SCREEN_WIDTH 640
12#define SCREEN_HEIGHT 480
13#define BLOCKSIZE 32
14
15enum MYKEYS{ KEY_SPACE, KEY_F1, KEY_F12 };
16bool key[3] = { false, false, false };
17
18int main()
19{
20 /* initialize random seed: */
21 srand(time(NULL));
22
23 // int iSecret = rand() % 608 + 16;
24 int aiSprite = rand() % 5;
25 int stragSpr = rand() % 5;
26 int wolverSpr = rand() % 5;
27 int mcbSprite = rand() % 5;
28 int dpoolSpr = rand() % 5;
29 // int randYVel = rand() % 6 + 1;
30
31 int ticks = 0;
32 int score = 0;
33 int misses = 0;
34
35 GAME game;
36 init(&game);
37
38 SPRITE playerShip;
39 SPRITE splashScreen;
40 SPRITE help;
41 SPRITE info;
42 SPRITE aiShip, straggler, wolverine, mcbride, dpool;
43 SPRITE explosion;
44
45 splashScreen.loadSpriteSheets("data/splash.png");
46 splashScreen.setCoord(0, 0);
47 splashScreen.setData(640, 480, 0, 0, 0);
48
49 help.loadSpriteSheets("data/help.png");
50 help.setCoord(0, 0);
51 help.setData(640, 480, 0, 0, 0);
52
53 info.loadSpriteSheets("data/dirSheet.png");
54 info.setCoord(512, 448);
55 info.setData(160, 32, 0, 0, 2);
56
57 playerShip.loadSpriteSheets("data/player.png");
58 playerShip.setData(32, 32, 4, 4, 0);
59
60
61 explosion.loadSpriteSheets("data/explSheet.png");
62 explosion.setData(32, 32, 0, 0, 3);
63
64 aiShip.loadSpriteSheets("data/shipSheet.png");
65 straggler.loadSpriteSheets("data/shipSheet.png");
66 wolverine.loadSpriteSheets("data/shipSheet.png");
67 mcbride.loadSpriteSheets("data/shipSheet.png");
68 dpool.loadSpriteSheets("data/shipSheet.png");
69
70 aiShip.setCoord(rand() % 608 + 16, -20);
71 straggler.setCoord(rand() % 608 + 16, -20);
72 wolverine.setCoord(rand() % 608 + 16, -20);
73 mcbride.setCoord(rand() % 608 + 16, -20);
74 dpool.setCoord(rand() % 608 + 16, -20);
75
76 aiShip.setData(32, 32, 0, rand() % 6 + 1, 4);
77 straggler.setData(32, 32, 0, rand() % 6 + 1, 4);
78 wolverine.setData(32, 32, 0, rand() % 6 + 1, 4);
79 mcbride.setData(32, 32, 0, rand() % 6 + 1, 4);
80 dpool.setData(32, 32, 0, rand() % 6 + 1, 4);
81
82 aiShip.points(5);
83 straggler.points(10);
84 wolverine.points(15);
85 mcbride.points(20);
86 dpool.points(25);
87
88 al_hide_mouse_cursor(game.display);
89
90 bool redraw = true;
91 bool doexit = false;
92
93 al_set_window_title(game.display,"Global Destruction");
94 al_set_window_position(game.display, 20, 20);
95
96 al_register_event_source(game.event_queue, al_get_display_event_source(game.display));
97 al_register_event_source(game.event_queue, al_get_timer_event_source(game.timer));
98 al_register_event_source(game.event_queue, al_get_keyboard_event_source());
99 al_register_event_source(game.event_queue, al_get_mouse_event_source());
100
101 al_clear_to_color(al_map_rgb(0, 0, 0));
102 al_flip_display();
103 al_start_timer(game.timer);
104
105 while (!doexit)
106 {
107 ALLEGRO_EVENT ev;
108 al_wait_for_event(game.event_queue, &ev);
109
110
111 if(ev.type == ALLEGRO_EVENT_TIMER)
112 {
113 ticks++;
114 aiShip.movement();
115 straggler.movement();
116 wolverine.movement();
117 mcbride.movement();
118 dpool.movement();
119
120 if(Collision(playerShip, aiShip))
121 {
122 explosion.setCoord(aiShip.getX(), aiShip.getY());
123 explosion.animate(ticks, 4.5);
124 aiShip.setData(32, 32, 0, (rand() % 6 + 1), 4);
125 aiShip.setCoord((rand() % 608 + 16), -20);
126 aiSprite = rand() % 5;
127 al_flip_display();
128 score = score + aiShip.getScore();
129 }
130
131 if(aiShip.getY() > SCREEN_H)
132 {
133 aiShip.setData(32, 32, 0, (rand() % 6 + 1), 4);
134 aiShip.setCoord((rand() % 608 + 16), -20);
135 al_flip_display();
136 aiSprite = rand() % 5;
137 misses++;
138 }
139
140 if(Collision(playerShip, straggler))
141 {
142 explosion.setCoord(straggler.getX(), straggler.getY());
143 explosion.animate(ticks, 4.5);
144 straggler.setData(32, 32, 0, (rand() % 6 + 1), 4);
145 straggler.setCoord((rand() % 608 + 16), -20);
146 stragSpr = rand() % 5;
147 al_flip_display();
148 score = score + straggler.getScore();
149 }
150
151 if(straggler.getY() > SCREEN_H)
152 {
153 straggler.setData(32, 32, 0, (rand() % 6 + 1), 4);
154 straggler.setCoord((rand() % 608 + 16), -20);
155 al_flip_display();
156 stragSpr = rand() % 5;
157 misses++;
158 }
159
160 if(Collision(playerShip, wolverine))
161 {
162 explosion.setCoord(wolverine.getX(), wolverine.getY());
163 explosion.animate(ticks, 4.5);
164 wolverine.setData(32, 32, 0, (rand() % 6 + 1), 4);
165 wolverine.setCoord((rand() % 608 + 16), -20);
166 wolverSpr = rand() % 5;
167 al_flip_display();
168 score = score + wolverine.getScore();
169 }
170
171 if(wolverine.getY() > SCREEN_H)
172 {
173 wolverine.setData(32, 32, 0, (rand() % 6 + 1), 4);
174 wolverine.setCoord((rand() % 608 + 16), -20);
175 al_flip_display();
176 wolverSpr = rand() % 5;
177 misses++;
178 }
179
180 if(Collision(playerShip, mcbride))
181 {
182 explosion.setCoord(mcbride.getX(), mcbride.getY());
183 explosion.animate(ticks, 4.5);
184 mcbride.setData(32, 32, 0, (rand() % 6 + 1), 4);
185 mcbride.setCoord((rand() % 608 + 16), -20);
186 mcbSprite = rand() % 5;
187 al_flip_display();
188 score = score + mcbride.getScore();
189 }
190
191 if(mcbride.getY() > SCREEN_H)
192 {
193 mcbride.setData(32, 32, 0, (rand() % 6 + 1), 4);
194 mcbride.setCoord((rand() % 608 + 16), -20);
195 al_flip_display();
196 mcbSprite = rand() % 5;
197 misses++;
198 }
199
200 if(Collision(playerShip, dpool))
201 {
202 explosion.setCoord(dpool.getX(), dpool.getY());
203 explosion.animate(ticks, 4.5);
204 dpool.setData(32, 32, 0, (rand() % 6 + 1), 4);
205 dpool.setCoord((rand() % 608 + 16), -20);
206 dpoolSpr = rand() % 5;
207 al_flip_display();
208 score = score + dpool.getScore();
209 }
210
211 if(dpool.getY() > SCREEN_H)
212 {
213 dpool.setData(32, 32, 0, (rand() % 6 + 1), 4);
214 dpool.setCoord((rand() % 608 + 16), -20);
215 al_flip_display();
216 dpoolSpr = rand() % 5;
217 misses++;
218 }
219
220 if(misses == 10)
221 doexit = true;
222
223 redraw = true;
224 }
225 else if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
226 {
227 break;
228 }
229 else if(ev.type == ALLEGRO_EVENT_MOUSE_AXES ||
230 ev.type == ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY)
231 {
232 playerShip.setCoord(ev.mouse.x - 16, ev.mouse.y - 16);
233 }
234 else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
235 {
236 switch(ev.keyboard.keycode)
237 {
238 case ALLEGRO_KEY_SPACE:
239 key[KEY_SPACE] = true;
240 break;
241 case ALLEGRO_KEY_F1:
242 key[KEY_F1] = true;
243 break;
244 case ALLEGRO_KEY_F12:
245 key[KEY_F12] = true;
246 break;
247 }
248 }
249 else if(ev.type == ALLEGRO_EVENT_KEY_UP)
250 {
251 switch(ev.keyboard.keycode)
252 {
253 case ALLEGRO_KEY_SPACE:
254 key[KEY_SPACE] = false;
255 break;
256 case ALLEGRO_KEY_F1:
257 key[KEY_F1] = false;
258 break;
259 case ALLEGRO_KEY_F12:
260 key[KEY_F12] = false;
261 break;
262 case ALLEGRO_KEY_ESCAPE:
263 doexit = true;
264 break;
265 }
266 }
267
268 if(redraw && al_is_event_queue_empty(game.event_queue))
269 {
270
271 redraw = false;
272 al_clear_to_color(al_map_rgb(0, 0, 0));
273
274 playerShip.draw();
275 aiShip.randDraw(aiSprite);
276 straggler.randDraw(stragSpr);
277 wolverine.randDraw(wolverSpr);
278 mcbride.randDraw(mcbSprite);
279 dpool.randDraw(dpoolSpr);
280
281 // draw score over everything!!!
282 al_draw_textf(game.font, al_map_rgb(255, 255, 255), SCREEN_W / 2, SCREEN_H - 20, ALLEGRO_ALIGN_CENTER, "%i", score);
283
284 al_flip_display();
285 }
286 }
287
288 al_clear_to_color(al_map_rgb(0, 0, 0));
289 al_flip_display();
290 al_destroy_display(game.display);
291
292 return 0;
293}
|
Edgar Reynaldo
Major Reynaldo
May 2007
|
void fn_wait_for_key(ALLEGRO_EVENT_QUEUE* queue) { ALLEGRO_EVENT e; do { al_wait_for_event(queue , &e); } while (e.type != ALLEGRO_EVENT_KEY_DOWN); } // in main // oh need to wait for a key here : fn_wait_for_key(my_event_queue);
My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Trent Gamblin
Member #261
April 2000
|
The simplest possible way to do a splash screen like that is like this (Oh come on, best practices don't really matter for such a small issue! But if you wanted to extend this somehow it would be bad...) for (;;) { al_draw_bitmap(splash, 0, 0, 0); al_flip_display(); ALLEGRO_KEYBOARD_STATE kbstate; al_get_keyboard_state(&kbstate); if (al_key_down(&kbstate, ALLEGRO_KEY_SPACE)) { break; } al_rest(1.0/60.0); }
|
Kris Asick
Member #1,424
July 2001
|
Hmm... well, the way I code my games is to have a "system" variable which tracks which primary system to run code through. If the system variable changes, then the next time there's a system loop it will run completely different code. For a splash screen, the simplest thing to do is create an entirely separate code section just for it, then jump to your game code following. At the moment, everything you do is in main(), whereas my main() simply calls init code then runs a while() + switch() loop, accessing various system functions depending on the system variable state until I set the system variable to a shutdown state, which exits the while() loop and calls all the shutdown functions. Kinda like this pseudocode: while (system_state != SYS_SHUTDOWN) switch (system_state) { case SYS_SPLASHSCREEN: RunSplashScreen(); break; case SYS_MAINMENU: RunMainMenu(); break; case SYS_OPTIONSMENU: RunOptions(); break; case SYS_RUNGAME: RunGame(); break; } For a screenshot function, just keep a numerical variable going to add onto your screenshot's filename and advance it every time you save a screen. Before you actually save the screenshot, check if the file exists. If it does, add the variable up by 1 and check again. Most screenshot functions are attached to the F12 Key, though the Print Screen key works too, keeping in mind that Windows will take a screenshot itself and put it in the clipboard when you press that key. As for high scores, this is going to depend on a number of factors. If you want your game to have joystick/gamepad support you should show a screen of letter selectors that you can move through with the joystick/gamepad, or even the arrow keys on the keyboard, though you should still detect actual alphanumeric keypresses. I'd only go with initials if you intend this game to feel like an arcade game, otherwise have at least 8 characters allowed. Top 20 takes a lot of screen space and can actually look less impressive than a Top 10, but this is more a matter of preference really. --- Kris Asick (Gemini) |
Specter Phoenix
Member #1,425
July 2001
|
Well I tried this method to no avail: for(;;) { splashScreen.draw(); info.animate(ticks, 2); al_flip_display(); if(key[KEY_SPACE]) break; } playerShip.draw(); // ...draw other ships Tried Trentg's code and it just made it so the button had to be held to play so it flashed. Could be putting the code in the wrong spot or missing something logic wise.
|
|