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

Latest commit

 

History

History
373 lines (342 loc) · 11.5 KB

testsprite2.c

File metadata and controls

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