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

Latest commit

 

History

History
375 lines (344 loc) · 11.6 KB

testsprite2.c

File metadata and controls

375 lines (344 loc) · 11.6 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
14
static int num_sprites;
static SDL_TextureID *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;
Aug 5, 2006
Aug 5, 2006
24
static SDL_TextureScaleMode scaleMode = SDL_TEXTURESCALEMODE_NONE;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/* 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
39
CommonQuit(state);
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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) {
SDL_SetColorKey(temp, SDL_SRCCOLORKEY, *(Uint8 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
61
62
63
} else {
switch (temp->format->BitsPerPixel) {
case 15:
Jun 10, 2009
Jun 10, 2009
64
65
SDL_SetColorKey(temp, SDL_SRCCOLORKEY,
(*(Uint16 *) temp->pixels) & 0x00007FFF);
Jun 10, 2009
Jun 10, 2009
66
67
68
69
70
break;
case 16:
SDL_SetColorKey(temp, SDL_SRCCOLORKEY, *(Uint16 *) temp->pixels);
break;
case 24:
Jun 10, 2009
Jun 10, 2009
71
72
SDL_SetColorKey(temp, SDL_SRCCOLORKEY,
(*(Uint32 *) temp->pixels) & 0x00FFFFFF);
Jun 10, 2009
Jun 10, 2009
73
74
75
76
77
break;
case 32:
SDL_SetColorKey(temp, SDL_SRCCOLORKEY, *(Uint32 *) temp->pixels);
break;
}
78
79
80
}
/* Create textures from the image */
Jul 18, 2006
Jul 18, 2006
81
82
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Aug 11, 2007
Aug 11, 2007
83
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
Sep 20, 2009
Sep 20, 2009
84
85
86
87
if (!sprites[i]) {
SDL_SetColorKey(temp, 0, 0);
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
}
88
89
90
91
92
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
Aug 28, 2006
Aug 28, 2006
93
94
SDL_SetTextureBlendMode(sprites[i], blendMode);
SDL_SetTextureScaleMode(sprites[i], scaleMode);
95
96
97
98
99
100
101
102
103
104
105
106
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return (0);
}
void
MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
{
int i, n;
int window_w, window_h;
Sep 19, 2009
Sep 19, 2009
107
SDL_Rect temp;
Nov 25, 2008
Nov 25, 2008
108
SDL_Rect *position, *velocity;
109
110
111
112
113
114
SDL_SelectRenderer(window);
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
Aug 28, 2006
Aug 28, 2006
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* 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
142
/* Draw a gray background */
Dec 20, 2008
Dec 20, 2008
143
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 9, 2009
Dec 9, 2009
144
SDL_RenderRect(NULL);
Sep 19, 2009
Sep 19, 2009
145
Sep 19, 2009
Sep 19, 2009
146
/* Test points */
Sep 19, 2009
Sep 19, 2009
147
148
149
150
151
152
SDL_SetRenderDrawColor(0xFF, 0x00, 0x00, 0xFF);
SDL_RenderPoint(0, 0);
SDL_RenderPoint(window_w-1, 0);
SDL_RenderPoint(0, window_h-1);
SDL_RenderPoint(window_w-1, window_h-1);
Sep 19, 2009
Sep 19, 2009
153
154
155
156
157
158
159
/* Test horizontal and vertical lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
SDL_RenderLine(1, 0, window_w-2, 0);
SDL_RenderLine(1, window_h-1, window_w-2, window_h-1);
SDL_RenderLine(0, 1, 0, window_h-2);
SDL_RenderLine(window_w-1, 1, window_w-1, window_h-2);
Sep 19, 2009
Sep 19, 2009
160
/* Test fill and copy */
Sep 19, 2009
Sep 19, 2009
161
SDL_SetRenderDrawColor(0xFF, 0xFF, 0xFF, 0xFF);
Sep 19, 2009
Sep 19, 2009
162
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
163
164
165
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
Dec 9, 2009
Dec 9, 2009
166
SDL_RenderRect(&temp);
Sep 19, 2009
Sep 19, 2009
167
168
169
SDL_RenderCopy(sprite, NULL, &temp);
temp.x = window_w-sprite_w-1;
temp.y = 1;
Sep 19, 2009
Sep 19, 2009
170
171
temp.w = sprite_w;
temp.h = sprite_h;
Dec 9, 2009
Dec 9, 2009
172
SDL_RenderRect(&temp);
Sep 19, 2009
Sep 19, 2009
173
SDL_RenderCopy(sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
174
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
175
temp.y = window_h-sprite_h-1;
Sep 19, 2009
Sep 19, 2009
176
177
temp.w = sprite_w;
temp.h = sprite_h;
Dec 9, 2009
Dec 9, 2009
178
SDL_RenderRect(&temp);
Sep 19, 2009
Sep 19, 2009
179
180
181
182
183
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 9, 2009
Dec 9, 2009
184
SDL_RenderRect(&temp);
Sep 19, 2009
Sep 19, 2009
185
186
187
188
189
190
191
192
193
SDL_RenderCopy(sprite, NULL, &temp);
/* Test diagonal lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
SDL_RenderLine(sprite_w, sprite_h,
window_w-sprite_w-2, window_h-sprite_h-2);
SDL_RenderLine(window_w-sprite_w-2, sprite_h,
sprite_w, window_h-sprite_h-2);
Sep 19, 2009
Sep 19, 2009
194
195
/* Move the sprite, bounce at the wall, and draw */
n = 0;
196
197
198
199
200
201
202
203
204
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
205
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
206
207
208
209
210
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Aug 28, 2006
Aug 28, 2006
211
SDL_RenderCopy(sprite, NULL, position);
212
213
214
215
216
217
218
219
220
221
222
223
224
}
/* 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
225
226
227
228
229
230
231
/* 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
233
234
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
236
237
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
238
239
240
241
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
242
blendMode = SDL_BLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
243
consumed = 2;
Jul 19, 2006
Jul 19, 2006
244
} else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
Dec 20, 2008
Dec 20, 2008
245
blendMode = SDL_BLENDMODE_MASK;
Jul 19, 2006
Jul 19, 2006
246
consumed = 2;
Jul 19, 2006
Jul 19, 2006
247
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Dec 20, 2008
Dec 20, 2008
248
blendMode = SDL_BLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
249
250
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Dec 20, 2008
Dec 20, 2008
251
blendMode = SDL_BLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
252
253
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
Dec 20, 2008
Dec 20, 2008
254
blendMode = SDL_BLENDMODE_MOD;
Jul 19, 2006
Jul 19, 2006
255
256
257
consumed = 2;
}
}
Jul 19, 2006
Jul 19, 2006
258
259
260
} else if (SDL_strcasecmp(argv[i], "--scale") == 0) {
if (argv[i + 1]) {
if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
Aug 5, 2006
Aug 5, 2006
261
scaleMode = SDL_TEXTURESCALEMODE_NONE;
Jul 19, 2006
Jul 19, 2006
262
263
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "fast") == 0) {
Aug 5, 2006
Aug 5, 2006
264
scaleMode = SDL_TEXTURESCALEMODE_FAST;
Jul 19, 2006
Jul 19, 2006
265
266
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "slow") == 0) {
Aug 5, 2006
Aug 5, 2006
267
scaleMode = SDL_TEXTURESCALEMODE_SLOW;
Jul 19, 2006
Jul 19, 2006
268
269
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "best") == 0) {
Aug 5, 2006
Aug 5, 2006
270
scaleMode = SDL_TEXTURESCALEMODE_BEST;
Jul 19, 2006
Jul 19, 2006
271
272
273
consumed = 2;
}
}
Aug 28, 2006
Aug 28, 2006
274
275
276
277
278
279
} 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
280
281
282
283
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
284
}
Jul 19, 2006
Jul 19, 2006
285
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
286
fprintf(stderr,
Aug 28, 2006
Aug 28, 2006
287
"Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
288
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
289
290
quit(1);
}
Jul 18, 2006
Jul 18, 2006
291
i += consumed;
Jul 18, 2006
Jul 18, 2006
293
294
if (!CommonInit(state)) {
quit(2);
295
296
297
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
298
299
300
sprites =
(SDL_TextureID *) SDL_malloc(state->num_windows * sizeof(*sprites));
if (!sprites) {
301
302
303
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
304
305
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Dec 20, 2008
Dec 20, 2008
306
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 9, 2009
Dec 9, 2009
307
SDL_RenderRect(NULL);
308
309
310
311
312
313
314
315
316
317
318
319
320
}
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);
}
srand(time(NULL));
Aug 5, 2006
Aug 5, 2006
321
if (scaleMode != SDL_TEXTURESCALEMODE_NONE) {
Jul 19, 2006
Jul 19, 2006
322
323
324
sprite_w += sprite_w / 2;
sprite_h += sprite_h / 2;
}
325
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
326
327
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
328
329
330
331
332
333
334
335
336
337
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
338
/* Main render loop */
339
340
341
342
343
344
345
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
346
CommonEvent(state, &event, &done);
347
348
349
350
351
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SDL_SelectRenderer(event.window.windowID);
Dec 20, 2008
Dec 20, 2008
352
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
Dec 9, 2009
Dec 9, 2009
353
SDL_RenderRect(NULL);
354
355
356
357
358
359
360
break;
}
break;
default:
break;
}
}
Jul 18, 2006
Jul 18, 2006
361
362
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
363
364
365
366
367
368
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
Nov 25, 2008
Nov 25, 2008
369
double fps = ((double) frames * 1000) / (now - then);
Nov 25, 2008
Nov 25, 2008
370
printf("%2.2f frames per second\n", fps);
371
372
373
374
375
}
quit(0);
}
/* vi: set ts=4 sw=4 expandtab: */