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

Latest commit

 

History

History
320 lines (294 loc) · 9.9 KB

testsprite2.c

File metadata and controls

320 lines (294 loc) · 9.9 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);
84
85
86
87
88
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
Aug 28, 2006
Aug 28, 2006
89
90
SDL_SetTextureBlendMode(sprites[i], blendMode);
SDL_SetTextureScaleMode(sprites[i], scaleMode);
91
92
93
94
95
96
97
98
99
100
101
102
}
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;
Nov 25, 2008
Nov 25, 2008
103
SDL_Rect *position, *velocity;
104
105
106
107
108
109
SDL_SelectRenderer(window);
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
Aug 28, 2006
Aug 28, 2006
110
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
/* 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);
}
137
138
/* Move the sprite, bounce at the wall, and draw */
n = 0;
Dec 20, 2008
Dec 20, 2008
139
140
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
141
142
143
144
145
146
147
148
149
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
150
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
151
152
153
154
155
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Aug 28, 2006
Aug 28, 2006
156
SDL_RenderCopy(sprite, NULL, position);
157
158
159
160
161
162
163
164
165
166
167
168
169
}
/* 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
170
171
172
173
174
175
176
/* 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
178
179
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
181
182
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
183
184
185
186
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
187
blendMode = SDL_BLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
188
consumed = 2;
Jul 19, 2006
Jul 19, 2006
189
} else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
Dec 20, 2008
Dec 20, 2008
190
blendMode = SDL_BLENDMODE_MASK;
Jul 19, 2006
Jul 19, 2006
191
consumed = 2;
Jul 19, 2006
Jul 19, 2006
192
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Dec 20, 2008
Dec 20, 2008
193
blendMode = SDL_BLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
194
195
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Dec 20, 2008
Dec 20, 2008
196
blendMode = SDL_BLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
197
198
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
Dec 20, 2008
Dec 20, 2008
199
blendMode = SDL_BLENDMODE_MOD;
Jul 19, 2006
Jul 19, 2006
200
201
202
consumed = 2;
}
}
Jul 19, 2006
Jul 19, 2006
203
204
205
} 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
206
scaleMode = SDL_TEXTURESCALEMODE_NONE;
Jul 19, 2006
Jul 19, 2006
207
208
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "fast") == 0) {
Aug 5, 2006
Aug 5, 2006
209
scaleMode = SDL_TEXTURESCALEMODE_FAST;
Jul 19, 2006
Jul 19, 2006
210
211
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "slow") == 0) {
Aug 5, 2006
Aug 5, 2006
212
scaleMode = SDL_TEXTURESCALEMODE_SLOW;
Jul 19, 2006
Jul 19, 2006
213
214
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "best") == 0) {
Aug 5, 2006
Aug 5, 2006
215
scaleMode = SDL_TEXTURESCALEMODE_BEST;
Jul 19, 2006
Jul 19, 2006
216
217
218
consumed = 2;
}
}
Aug 28, 2006
Aug 28, 2006
219
220
221
222
223
224
} 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
225
226
227
228
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
229
}
Jul 19, 2006
Jul 19, 2006
230
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
231
fprintf(stderr,
Aug 28, 2006
Aug 28, 2006
232
"Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
233
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
234
235
quit(1);
}
Jul 18, 2006
Jul 18, 2006
236
i += consumed;
Jul 18, 2006
Jul 18, 2006
238
239
if (!CommonInit(state)) {
quit(2);
240
241
242
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
243
244
245
sprites =
(SDL_TextureID *) SDL_malloc(state->num_windows * sizeof(*sprites));
if (!sprites) {
246
247
248
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
249
250
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Dec 20, 2008
Dec 20, 2008
251
252
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
253
254
255
256
257
258
259
260
261
262
263
264
265
}
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
266
if (scaleMode != SDL_TEXTURESCALEMODE_NONE) {
Jul 19, 2006
Jul 19, 2006
267
268
269
sprite_w += sprite_w / 2;
sprite_h += sprite_h / 2;
}
270
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
271
272
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
273
274
275
276
277
278
279
280
281
282
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
283
/* Main render loop */
284
285
286
287
288
289
290
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
291
CommonEvent(state, &event, &done);
292
293
294
295
296
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
297
298
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
299
300
301
302
303
304
305
break;
}
break;
default:
break;
}
}
Jul 18, 2006
Jul 18, 2006
306
307
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
308
309
310
311
312
313
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
Nov 25, 2008
Nov 25, 2008
314
double fps = ((double) frames * 1000) / (now - then);
Nov 25, 2008
Nov 25, 2008
315
printf("%2.2f frames per second\n", fps);
316
317
318
319
320
}
quit(0);
}
/* vi: set ts=4 sw=4 expandtab: */