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

Latest commit

 

History

History
330 lines (300 loc) · 10 KB

testsprite2.c

File metadata and controls

330 lines (300 loc) · 10 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"
Feb 2, 2011
Feb 2, 2011
9
10
#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;
Feb 1, 2011
Feb 1, 2011
23
static SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* 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
38
CommonQuit(state);
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
59
SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
60
61
62
} else {
switch (temp->format->BitsPerPixel) {
case 15:
Dec 14, 2009
Dec 14, 2009
63
SDL_SetColorKey(temp, 1, (*(Uint16 *) temp->pixels) & 0x00007FFF);
Jun 10, 2009
Jun 10, 2009
64
65
break;
case 16:
Dec 14, 2009
Dec 14, 2009
66
SDL_SetColorKey(temp, 1, *(Uint16 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
67
68
break;
case 24:
Dec 14, 2009
Dec 14, 2009
69
SDL_SetColorKey(temp, 1, (*(Uint32 *) temp->pixels) & 0x00FFFFFF);
Jun 10, 2009
Jun 10, 2009
70
71
break;
case 32:
Dec 14, 2009
Dec 14, 2009
72
SDL_SetColorKey(temp, 1, *(Uint32 *) temp->pixels);
Jun 10, 2009
Jun 10, 2009
73
74
break;
}
75
76
77
}
/* Create textures from the image */
Jul 18, 2006
Jul 18, 2006
78
for (i = 0; i < state->num_windows; ++i) {
Feb 2, 2011
Feb 2, 2011
79
SDL_Renderer *renderer = state->renderers[i];
Feb 3, 2011
Feb 3, 2011
80
sprites[i] = SDL_CreateTextureFromSurface(renderer, temp);
81
82
83
84
85
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
Aug 28, 2006
Aug 28, 2006
86
SDL_SetTextureBlendMode(sprites[i], blendMode);
87
88
89
90
91
92
93
94
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return (0);
}
void
Feb 2, 2011
Feb 2, 2011
95
MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
96
97
98
{
int i, n;
int window_w, window_h;
Sep 19, 2009
Sep 19, 2009
99
SDL_Rect temp;
Nov 25, 2008
Nov 25, 2008
100
SDL_Rect *position, *velocity;
101
102
103
104
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
Aug 28, 2006
Aug 28, 2006
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* 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
132
/* Draw a gray background */
Feb 2, 2011
Feb 2, 2011
133
134
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
Sep 19, 2009
Sep 19, 2009
135
Sep 19, 2009
Sep 19, 2009
136
/* Test points */
Feb 2, 2011
Feb 2, 2011
137
138
139
140
141
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderDrawPoint(renderer, 0, 0);
SDL_RenderDrawPoint(renderer, window_w-1, 0);
SDL_RenderDrawPoint(renderer, 0, window_h-1);
SDL_RenderDrawPoint(renderer, window_w-1, window_h-1);
Sep 19, 2009
Sep 19, 2009
142
Sep 19, 2009
Sep 19, 2009
143
/* Test horizontal and vertical lines */
Feb 2, 2011
Feb 2, 2011
144
145
146
147
148
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, 1, 0, window_w-2, 0);
SDL_RenderDrawLine(renderer, 1, window_h-1, window_w-2, window_h-1);
SDL_RenderDrawLine(renderer, 0, 1, 0, window_h-2);
SDL_RenderDrawLine(renderer, window_w-1, 1, window_w-1, window_h-2);
Sep 19, 2009
Sep 19, 2009
149
Sep 19, 2009
Sep 19, 2009
150
/* Test fill and copy */
Feb 2, 2011
Feb 2, 2011
151
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
Sep 19, 2009
Sep 19, 2009
152
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
153
154
155
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
156
157
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
158
159
temp.x = window_w-sprite_w-1;
temp.y = 1;
Sep 19, 2009
Sep 19, 2009
160
161
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
162
163
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
164
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
165
temp.y = window_h-sprite_h-1;
Sep 19, 2009
Sep 19, 2009
166
167
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
168
169
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
170
171
172
173
temp.x = window_w-sprite_w-1;
temp.y = window_h-sprite_h-1;
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
174
175
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
176
177
/* Test diagonal lines */
Feb 2, 2011
Feb 2, 2011
178
179
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, sprite_w, sprite_h,
Dec 23, 2009
Dec 23, 2009
180
window_w-sprite_w-2, window_h-sprite_h-2);
Feb 2, 2011
Feb 2, 2011
181
SDL_RenderDrawLine(renderer, window_w-sprite_w-2, sprite_h,
Dec 23, 2009
Dec 23, 2009
182
sprite_w, window_h-sprite_h-2);
Sep 19, 2009
Sep 19, 2009
183
Sep 19, 2009
Sep 19, 2009
184
185
/* Move the sprite, bounce at the wall, and draw */
n = 0;
186
187
188
189
190
191
192
193
194
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
195
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
196
197
198
199
200
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Feb 2, 2011
Feb 2, 2011
201
SDL_RenderCopy(renderer, sprite, NULL, position);
202
203
204
}
/* Update the screen! */
Feb 2, 2011
Feb 2, 2011
205
SDL_RenderPresent(renderer);
206
207
208
209
210
211
212
213
214
}
int
main(int argc, char *argv[])
{
int i, done;
SDL_Event event;
Uint32 then, now, frames;
Jul 18, 2006
Jul 18, 2006
215
216
217
218
219
220
221
/* 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
223
224
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
226
227
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
228
229
230
231
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
232
blendMode = SDL_BLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
233
234
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Dec 20, 2008
Dec 20, 2008
235
blendMode = SDL_BLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
236
237
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Dec 20, 2008
Dec 20, 2008
238
blendMode = SDL_BLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
239
consumed = 2;
Feb 5, 2011
Feb 5, 2011
240
241
242
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
blendMode = SDL_BLENDMODE_MOD;
consumed = 2;
Jul 19, 2006
Jul 19, 2006
243
244
}
}
Aug 28, 2006
Aug 28, 2006
245
246
247
248
249
250
} 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
251
252
253
254
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
255
}
Jul 19, 2006
Jul 19, 2006
256
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
257
fprintf(stderr,
Feb 5, 2011
Feb 5, 2011
258
"Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
259
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
260
261
quit(1);
}
Jul 18, 2006
Jul 18, 2006
262
i += consumed;
Jul 18, 2006
Jul 18, 2006
264
265
if (!CommonInit(state)) {
quit(2);
266
267
268
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
269
sprites =
Jan 21, 2010
Jan 21, 2010
270
(SDL_Texture **) SDL_malloc(state->num_windows * sizeof(*sprites));
Jul 18, 2006
Jul 18, 2006
271
if (!sprites) {
272
273
274
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
275
for (i = 0; i < state->num_windows; ++i) {
Feb 2, 2011
Feb 2, 2011
276
277
278
SDL_Renderer *renderer = state->renderers[i];
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
279
280
281
282
283
284
285
286
287
288
289
290
}
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);
}
Sep 16, 2010
Sep 16, 2010
291
srand((unsigned int)time(NULL));
292
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
293
294
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
295
296
297
298
299
300
301
302
303
304
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
305
/* Main render loop */
306
307
308
309
310
311
312
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
313
CommonEvent(state, &event, &done);
Jul 18, 2006
Jul 18, 2006
315
for (i = 0; i < state->num_windows; ++i) {
Feb 2, 2011
Feb 2, 2011
316
MoveSprites(state->windows[i], state->renderers[i], sprites[i]);
317
318
319
320
321
322
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
Nov 25, 2008
Nov 25, 2008
323
double fps = ((double) frames * 1000) / (now - then);
Nov 25, 2008
Nov 25, 2008
324
printf("%2.2f frames per second\n", fps);
Feb 2, 2011
Feb 2, 2011
327
return 0;
328
329
330
}
/* vi: set ts=4 sw=4 expandtab: */