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

Latest commit

 

History

History
300 lines (274 loc) · 9.25 KB

testsprite2.c

File metadata and controls

300 lines (274 loc) · 9.25 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;
Aug 5, 2006
Aug 5, 2006
23
24
static SDL_TextureBlendMode blendMode = SDL_TEXTUREBLENDMODE_MASK;
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
86
87
88
89
90
91
92
}
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;
SDL_Rect area, *position, *velocity;
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;
Aug 28, 2006
Aug 28, 2006
122
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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;
if ((position->y < 0) || (position->y >= (window_h - sprite_w))) {
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Aug 28, 2006
Aug 28, 2006
138
SDL_RenderCopy(sprite, NULL, position);
139
140
141
142
143
144
145
146
147
148
149
150
151
}
/* 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
152
153
154
155
156
157
158
/* 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
160
161
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
163
164
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
165
166
167
168
consumed = -1;
if (SDL_strcasecmp(argv[i], "--blend") == 0) {
if (argv[i + 1]) {
if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
Aug 5, 2006
Aug 5, 2006
169
blendMode = SDL_TEXTUREBLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
170
consumed = 2;
Jul 19, 2006
Jul 19, 2006
171
} else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
Aug 5, 2006
Aug 5, 2006
172
blendMode = SDL_TEXTUREBLENDMODE_MASK;
Jul 19, 2006
Jul 19, 2006
173
consumed = 2;
Jul 19, 2006
Jul 19, 2006
174
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Aug 5, 2006
Aug 5, 2006
175
blendMode = SDL_TEXTUREBLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
176
177
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Aug 5, 2006
Aug 5, 2006
178
blendMode = SDL_TEXTUREBLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
179
180
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
Aug 5, 2006
Aug 5, 2006
181
blendMode = SDL_TEXTUREBLENDMODE_MOD;
Jul 19, 2006
Jul 19, 2006
182
183
184
consumed = 2;
}
}
Jul 19, 2006
Jul 19, 2006
185
186
187
} 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
188
scaleMode = SDL_TEXTURESCALEMODE_NONE;
Jul 19, 2006
Jul 19, 2006
189
190
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "fast") == 0) {
Aug 5, 2006
Aug 5, 2006
191
scaleMode = SDL_TEXTURESCALEMODE_FAST;
Jul 19, 2006
Jul 19, 2006
192
193
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "slow") == 0) {
Aug 5, 2006
Aug 5, 2006
194
scaleMode = SDL_TEXTURESCALEMODE_SLOW;
Jul 19, 2006
Jul 19, 2006
195
196
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "best") == 0) {
Aug 5, 2006
Aug 5, 2006
197
scaleMode = SDL_TEXTURESCALEMODE_BEST;
Jul 19, 2006
Jul 19, 2006
198
199
200
consumed = 2;
}
}
Aug 28, 2006
Aug 28, 2006
201
202
203
204
205
206
} 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
207
208
209
210
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
211
}
Jul 19, 2006
Jul 19, 2006
212
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
213
fprintf(stderr,
Aug 28, 2006
Aug 28, 2006
214
"Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
215
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
216
217
quit(1);
}
Jul 18, 2006
Jul 18, 2006
218
i += consumed;
Jul 18, 2006
Jul 18, 2006
220
221
if (!CommonInit(state)) {
quit(2);
222
223
224
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
225
226
227
sprites =
(SDL_TextureID *) SDL_malloc(state->num_windows * sizeof(*sprites));
if (!sprites) {
228
229
230
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
231
232
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
Aug 28, 2006
Aug 28, 2006
233
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
234
235
236
237
238
239
240
241
242
243
244
245
246
}
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
247
if (scaleMode != SDL_TEXTURESCALEMODE_NONE) {
Jul 19, 2006
Jul 19, 2006
248
249
250
sprite_w += sprite_w / 2;
sprite_h += sprite_h / 2;
}
251
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
252
253
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
254
255
256
257
258
259
260
261
262
263
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
264
/* Main render loop */
265
266
267
268
269
270
271
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
272
CommonEvent(state, &event, &done);
273
274
275
276
277
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SDL_SelectRenderer(event.window.windowID);
Aug 28, 2006
Aug 28, 2006
278
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
279
280
281
282
283
284
285
break;
}
break;
default:
break;
}
}
Jul 18, 2006
Jul 18, 2006
286
287
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
288
289
290
291
292
293
294
295
296
297
298
299
300
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
printf("%2.2f frames per second\n",
((double) frames * 1000) / (now - then));
}
quit(0);
}
/* vi: set ts=4 sw=4 expandtab: */