Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
352 lines (321 loc) · 10.5 KB

testsprite2.c

File metadata and controls

352 lines (321 loc) · 10.5 KB
 
1
2
3
/* Simple program: Move N sprites around on the screen as fast as possible */
#include <stdlib.h>
Jul 15, 2006
Jul 15, 2006
4
#include <stdio.h>
5
6
#include <time.h>
Jul 18, 2006
Jul 18, 2006
7
#include "common.h"
8
9
10
11
#define NUM_SPRITES 100
#define MAX_SPEED 1
Jul 18, 2006
Jul 18, 2006
12
static CommonState *state;
13
static int num_sprites;
Jan 21, 2010
Jan 21, 2010
14
static SDL_Texture **sprites;
Aug 28, 2006
Aug 28, 2006
15
16
17
18
19
static SDL_bool cycle_color;
static SDL_bool cycle_alpha;
static int cycle_direction = 1;
static int current_alpha = 0;
static int current_color = 0;
20
21
22
static SDL_Rect *positions;
static SDL_Rect *velocities;
static int sprite_w, sprite_h;
Dec 20, 2008
Dec 20, 2008
23
static SDL_BlendMode blendMode = SDL_BLENDMODE_MASK;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
if (sprites) {
SDL_free(sprites);
}
if (positions) {
SDL_free(positions);
}
if (velocities) {
SDL_free(velocities);
}
Jul 18, 2006
Jul 18, 2006
38
CommonQuit(state);
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
exit(rc);
}
int
LoadSprite(char *file)
{
int i;
SDL_Surface *temp;
/* Load the sprite image */
temp = SDL_LoadBMP(file);
if (temp == NULL) {
fprintf(stderr, "Couldn't load %s: %s", file, SDL_GetError());
return (-1);
}
sprite_w = temp->w;
sprite_h = temp->h;
/* Set transparent pixel as the pixel at (0,0) */
if (temp->format->palette) {
Dec 14, 2009
Dec 14, 2009
59
SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
60
61
62
} else {
switch (temp->format->BitsPerPixel) {
case 15:
Dec 14, 2009
Dec 14, 2009
63
SDL_SetColorKey(temp, 1, (*(Uint16 *) temp->pixels) & 0x00007FFF);
Jun 10, 2009
Jun 10, 2009
64
65
break;
case 16:
Dec 14, 2009
Dec 14, 2009
66
SDL_SetColorKey(temp, 1, *(Uint16 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
67
68
break;
case 24:
Dec 14, 2009
Dec 14, 2009
69
SDL_SetColorKey(temp, 1, (*(Uint32 *) temp->pixels) & 0x00FFFFFF);
Jun 10, 2009
Jun 10, 2009
70
71
break;
case 32:
Dec 14, 2009
Dec 14, 2009
72
SDL_SetColorKey(temp, 1, *(Uint32 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
73
74
break;
}
75
76
77
}
/* Create textures from the image */
Jul 18, 2006
Jul 18, 2006
78
79
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Aug 11, 2007
Aug 11, 2007
80
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
Sep 20, 2009
Sep 20, 2009
81
82
83
84
if (!sprites[i]) {
SDL_SetColorKey(temp, 0, 0);
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
}
85
86
87
88
89
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
Aug 28, 2006
Aug 28, 2006
90
SDL_SetTextureBlendMode(sprites[i], blendMode);
91
92
93
94
95
96
97
98
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return (0);
}
void
Jan 21, 2010
Jan 21, 2010
99
MoveSprites(SDL_Window * window, SDL_Texture * sprite)
100
101
102
{
int i, n;
int window_w, window_h;
Sep 19, 2009
Sep 19, 2009
103
SDL_Rect temp;
Nov 25, 2008
Nov 25, 2008
104
SDL_Rect *position, *velocity;
105
106
107
108
109
110
SDL_SelectRenderer(window);
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
Aug 28, 2006
Aug 28, 2006
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* Cycle the color and alpha, if desired */
if (cycle_color) {
current_color += cycle_direction;
if (current_color < 0) {
current_color = 0;
cycle_direction = -cycle_direction;
}
if (current_color > 255) {
current_color = 255;
cycle_direction = -cycle_direction;
}
SDL_SetTextureColorMod(sprite, 255, (Uint8) current_color,
(Uint8) current_color);
}
if (cycle_alpha) {
current_alpha += cycle_direction;
if (current_alpha < 0) {
current_alpha = 0;
cycle_direction = -cycle_direction;
}
if (current_alpha > 255) {
current_alpha = 255;
cycle_direction = -cycle_direction;
}
SDL_SetTextureAlphaMod(sprite, (Uint8) current_alpha);
}
Sep 19, 2009
Sep 19, 2009
138
/* Draw a gray background */
Dec 20, 2008
Dec 20, 2008
139
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 23, 2009
Dec 23, 2009
140
SDL_RenderClear();
Sep 19, 2009
Sep 19, 2009
141
Sep 19, 2009
Sep 19, 2009
142
/* Test points */
Sep 19, 2009
Sep 19, 2009
143
SDL_SetRenderDrawColor(0xFF, 0x00, 0x00, 0xFF);
Dec 23, 2009
Dec 23, 2009
144
145
146
147
SDL_RenderDrawPoint(0, 0);
SDL_RenderDrawPoint(window_w-1, 0);
SDL_RenderDrawPoint(0, window_h-1);
SDL_RenderDrawPoint(window_w-1, window_h-1);
Sep 19, 2009
Sep 19, 2009
148
Sep 19, 2009
Sep 19, 2009
149
150
/* Test horizontal and vertical lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
Dec 23, 2009
Dec 23, 2009
151
152
153
154
SDL_RenderDrawLine(1, 0, window_w-2, 0);
SDL_RenderDrawLine(1, window_h-1, window_w-2, window_h-1);
SDL_RenderDrawLine(0, 1, 0, window_h-2);
SDL_RenderDrawLine(window_w-1, 1, window_w-1, window_h-2);
Sep 19, 2009
Sep 19, 2009
155
Sep 19, 2009
Sep 19, 2009
156
/* Test fill and copy */
Sep 19, 2009
Sep 19, 2009
157
SDL_SetRenderDrawColor(0xFF, 0xFF, 0xFF, 0xFF);
Sep 19, 2009
Sep 19, 2009
158
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
159
160
161
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
Dec 23, 2009
Dec 23, 2009
162
SDL_RenderFillRect(&temp);
Sep 19, 2009
Sep 19, 2009
163
164
165
SDL_RenderCopy(sprite, NULL, &temp);
temp.x = window_w-sprite_w-1;
temp.y = 1;
Sep 19, 2009
Sep 19, 2009
166
167
temp.w = sprite_w;
temp.h = sprite_h;
Dec 23, 2009
Dec 23, 2009
168
SDL_RenderFillRect(&temp);
Sep 19, 2009
Sep 19, 2009
169
SDL_RenderCopy(sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
170
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
171
temp.y = window_h-sprite_h-1;
Sep 19, 2009
Sep 19, 2009
172
173
temp.w = sprite_w;
temp.h = sprite_h;
Dec 23, 2009
Dec 23, 2009
174
SDL_RenderFillRect(&temp);
Sep 19, 2009
Sep 19, 2009
175
176
177
178
179
SDL_RenderCopy(sprite, NULL, &temp);
temp.x = window_w-sprite_w-1;
temp.y = window_h-sprite_h-1;
temp.w = sprite_w;
temp.h = sprite_h;
Dec 23, 2009
Dec 23, 2009
180
SDL_RenderFillRect(&temp);
Sep 19, 2009
Sep 19, 2009
181
182
183
184
SDL_RenderCopy(sprite, NULL, &temp);
/* Test diagonal lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
Dec 23, 2009
Dec 23, 2009
185
186
187
188
SDL_RenderDrawLine(sprite_w, sprite_h,
window_w-sprite_w-2, window_h-sprite_h-2);
SDL_RenderDrawLine(window_w-sprite_w-2, sprite_h,
sprite_w, window_h-sprite_h-2);
Sep 19, 2009
Sep 19, 2009
189
Sep 19, 2009
Sep 19, 2009
190
191
/* Move the sprite, bounce at the wall, and draw */
n = 0;
192
193
194
195
196
197
198
199
200
for (i = 0; i < num_sprites; ++i) {
position = &positions[i];
velocity = &velocities[i];
position->x += velocity->x;
if ((position->x < 0) || (position->x >= (window_w - sprite_w))) {
velocity->x = -velocity->x;
position->x += velocity->x;
}
position->y += velocity->y;
Dec 5, 2008
Dec 5, 2008
201
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
202
203
204
205
206
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Aug 28, 2006
Aug 28, 2006
207
SDL_RenderCopy(sprite, NULL, position);
208
209
210
211
212
213
214
215
216
217
218
219
220
}
/* Update the screen! */
SDL_RenderPresent();
}
int
main(int argc, char *argv[])
{
int i, done;
SDL_Event event;
Uint32 then, now, frames;
Jul 18, 2006
Jul 18, 2006
221
222
223
224
225
226
227
/* Initialize parameters */
num_sprites = NUM_SPRITES;
/* Initialize test framework */
state = CommonCreateState(argv, SDL_INIT_VIDEO);
if (!state) {
return 1;
Jul 18, 2006
Jul 18, 2006
229
230
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
232
233
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
234
235
236
237
consumed = -1;
if (SDL_strcasecmp(argv[i], "--blend") == 0) {
if (argv[i + 1]) {
if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
Dec 20, 2008
Dec 20, 2008
238
blendMode = SDL_BLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
239
consumed = 2;
Jul 19, 2006
Jul 19, 2006
240
} else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
Dec 20, 2008
Dec 20, 2008
241
blendMode = SDL_BLENDMODE_MASK;
Jul 19, 2006
Jul 19, 2006
242
consumed = 2;
Jul 19, 2006
Jul 19, 2006
243
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Dec 20, 2008
Dec 20, 2008
244
blendMode = SDL_BLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
245
246
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Dec 20, 2008
Dec 20, 2008
247
blendMode = SDL_BLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
248
249
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
Dec 20, 2008
Dec 20, 2008
250
blendMode = SDL_BLENDMODE_MOD;
Jul 19, 2006
Jul 19, 2006
251
252
253
consumed = 2;
}
}
Aug 28, 2006
Aug 28, 2006
254
255
256
257
258
259
} else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) {
cycle_color = SDL_TRUE;
consumed = 1;
} else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
cycle_alpha = SDL_TRUE;
consumed = 1;
Jul 19, 2006
Jul 19, 2006
260
261
262
263
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
264
}
Jul 19, 2006
Jul 19, 2006
265
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
266
fprintf(stderr,
Feb 1, 2011
Feb 1, 2011
267
"Usage: %s %s [--blend none|mask|blend|add|mod] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
268
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
269
270
quit(1);
}
Jul 18, 2006
Jul 18, 2006
271
i += consumed;
Jul 18, 2006
Jul 18, 2006
273
274
if (!CommonInit(state)) {
quit(2);
275
276
277
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
278
sprites =
Jan 21, 2010
Jan 21, 2010
279
(SDL_Texture **) SDL_malloc(state->num_windows * sizeof(*sprites));
Jul 18, 2006
Jul 18, 2006
280
if (!sprites) {
281
282
283
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
284
285
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Dec 20, 2008
Dec 20, 2008
286
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 23, 2009
Dec 23, 2009
287
SDL_RenderClear();
288
289
290
291
292
293
294
295
296
297
298
299
}
if (LoadSprite("icon.bmp") < 0) {
quit(2);
}
/* Allocate memory for the sprite info */
positions = (SDL_Rect *) SDL_malloc(num_sprites * sizeof(SDL_Rect));
velocities = (SDL_Rect *) SDL_malloc(num_sprites * sizeof(SDL_Rect));
if (!positions || !velocities) {
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Sep 16, 2010
Sep 16, 2010
300
srand((unsigned int)time(NULL));
301
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
302
303
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
304
305
306
307
308
309
310
311
312
313
positions[i].w = sprite_w;
positions[i].h = sprite_h;
velocities[i].x = 0;
velocities[i].y = 0;
while (!velocities[i].x && !velocities[i].y) {
velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
}
}
Jul 19, 2006
Jul 19, 2006
314
/* Main render loop */
315
316
317
318
319
320
321
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
322
CommonEvent(state, &event, &done);
323
324
325
326
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
Jan 21, 2010
Jan 21, 2010
327
SDL_SelectRenderer(SDL_GetWindowFromID(event.window.windowID));
Dec 20, 2008
Dec 20, 2008
328
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 23, 2009
Dec 23, 2009
329
SDL_RenderClear();
330
331
332
333
334
335
336
break;
}
break;
default:
break;
}
}
Jul 18, 2006
Jul 18, 2006
337
338
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
339
340
341
342
343
344
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
Nov 25, 2008
Nov 25, 2008
345
double fps = ((double) frames * 1000) / (now - then);
Nov 25, 2008
Nov 25, 2008
346
printf("%2.2f frames per second\n", fps);
Sep 16, 2010
Sep 16, 2010
349
return 0;
350
351
352
}
/* vi: set ts=4 sw=4 expandtab: */