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

Latest commit

 

History

History
303 lines (277 loc) · 9.31 KB

testsprite2.c

File metadata and controls

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