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

Latest commit

 

History

History
301 lines (275 loc) · 9.28 KB

testsprite2.c

File metadata and controls

301 lines (275 loc) · 9.28 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 5, 2006
Aug 5, 2006
67
SDL_CreateTextureFromSurface(0, SDL_TEXTUREACCESS_REMOTE, temp);
68
69
70
71
72
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
Aug 28, 2006
Aug 28, 2006
73
74
SDL_SetTextureBlendMode(sprites[i], blendMode);
SDL_SetTextureScaleMode(sprites[i], scaleMode);
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
}
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
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
120
/* 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);
}
121
122
/* Move the sprite, bounce at the wall, and draw */
n = 0;
Aug 28, 2006
Aug 28, 2006
123
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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
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) {
Aug 5, 2006
Aug 5, 2006
170
blendMode = SDL_TEXTUREBLENDMODE_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) {
Aug 5, 2006
Aug 5, 2006
173
blendMode = SDL_TEXTUREBLENDMODE_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) {
Aug 5, 2006
Aug 5, 2006
176
blendMode = SDL_TEXTUREBLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
177
178
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Aug 5, 2006
Aug 5, 2006
179
blendMode = SDL_TEXTUREBLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
180
181
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
Aug 5, 2006
Aug 5, 2006
182
blendMode = SDL_TEXTUREBLENDMODE_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]);
Aug 28, 2006
Aug 28, 2006
234
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
235
236
237
238
239
240
241
242
243
244
245
246
247
}
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
248
if (scaleMode != SDL_TEXTURESCALEMODE_NONE) {
Jul 19, 2006
Jul 19, 2006
249
250
251
sprite_w += sprite_w / 2;
sprite_h += sprite_h / 2;
}
252
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
253
254
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
255
256
257
258
259
260
261
262
263
264
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
265
/* Main render loop */
266
267
268
269
270
271
272
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
273
CommonEvent(state, &event, &done);
274
275
276
277
278
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
279
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
280
281
282
283
284
285
286
break;
}
break;
default:
break;
}
}
Jul 18, 2006
Jul 18, 2006
287
288
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
289
290
291
292
293
294
295
296
297
298
299
300
301
}
}
/* 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: */