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

Latest commit

 

History

History
329 lines (299 loc) · 10 KB

testsprite2.c

File metadata and controls

329 lines (299 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 15, 2011
Feb 15, 2011
95
MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
Feb 15, 2011
Feb 15, 2011
98
SDL_Rect viewport, temp;
Nov 25, 2008
Nov 25, 2008
99
SDL_Rect *position, *velocity;
100
101
/* Query the sizes */
Feb 15, 2011
Feb 15, 2011
102
SDL_RenderGetViewport(renderer, &viewport);
Aug 28, 2006
Aug 28, 2006
104
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
/* 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
131
/* Draw a gray background */
Feb 2, 2011
Feb 2, 2011
132
133
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
Sep 19, 2009
Sep 19, 2009
134
Sep 19, 2009
Sep 19, 2009
135
/* Test points */
Feb 2, 2011
Feb 2, 2011
136
137
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderDrawPoint(renderer, 0, 0);
Feb 15, 2011
Feb 15, 2011
138
139
140
SDL_RenderDrawPoint(renderer, viewport.w-1, 0);
SDL_RenderDrawPoint(renderer, 0, viewport.h-1);
SDL_RenderDrawPoint(renderer, viewport.w-1, viewport.h-1);
Sep 19, 2009
Sep 19, 2009
141
Sep 19, 2009
Sep 19, 2009
142
/* Test horizontal and vertical lines */
Feb 2, 2011
Feb 2, 2011
143
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
Feb 15, 2011
Feb 15, 2011
144
145
146
147
SDL_RenderDrawLine(renderer, 1, 0, viewport.w-2, 0);
SDL_RenderDrawLine(renderer, 1, viewport.h-1, viewport.w-2, viewport.h-1);
SDL_RenderDrawLine(renderer, 0, 1, 0, viewport.h-2);
SDL_RenderDrawLine(renderer, viewport.w-1, 1, viewport.w-1, viewport.h-2);
Sep 19, 2009
Sep 19, 2009
148
Sep 19, 2009
Sep 19, 2009
149
/* Test fill and copy */
Feb 2, 2011
Feb 2, 2011
150
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
Sep 19, 2009
Sep 19, 2009
151
temp.x = 1;
Sep 19, 2009
Sep 19, 2009
152
153
154
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
155
156
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Feb 15, 2011
Feb 15, 2011
157
temp.x = viewport.w-sprite_w-1;
Sep 19, 2009
Sep 19, 2009
158
temp.y = 1;
Sep 19, 2009
Sep 19, 2009
159
160
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
161
162
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
163
temp.x = 1;
Feb 15, 2011
Feb 15, 2011
164
temp.y = viewport.h-sprite_h-1;
Sep 19, 2009
Sep 19, 2009
165
166
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
167
168
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Feb 15, 2011
Feb 15, 2011
169
170
temp.x = viewport.w-sprite_w-1;
temp.y = viewport.h-sprite_h-1;
Sep 19, 2009
Sep 19, 2009
171
172
temp.w = sprite_w;
temp.h = sprite_h;
Feb 2, 2011
Feb 2, 2011
173
174
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
Sep 19, 2009
Sep 19, 2009
175
176
/* Test diagonal lines */
Feb 2, 2011
Feb 2, 2011
177
178
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, sprite_w, sprite_h,
Feb 15, 2011
Feb 15, 2011
179
180
181
viewport.w-sprite_w-2, viewport.h-sprite_h-2);
SDL_RenderDrawLine(renderer, viewport.w-sprite_w-2, sprite_h,
sprite_w, viewport.h-sprite_h-2);
Sep 19, 2009
Sep 19, 2009
182
Sep 19, 2009
Sep 19, 2009
183
184
/* Move the sprite, bounce at the wall, and draw */
n = 0;
185
186
187
188
for (i = 0; i < num_sprites; ++i) {
position = &positions[i];
velocity = &velocities[i];
position->x += velocity->x;
Feb 15, 2011
Feb 15, 2011
189
if ((position->x < 0) || (position->x >= (viewport.w - sprite_w))) {
190
191
192
193
velocity->x = -velocity->x;
position->x += velocity->x;
}
position->y += velocity->y;
Feb 15, 2011
Feb 15, 2011
194
if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
195
196
197
198
199
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
Feb 2, 2011
Feb 2, 2011
200
SDL_RenderCopy(renderer, sprite, NULL, position);
201
202
203
}
/* Update the screen! */
Feb 2, 2011
Feb 2, 2011
204
SDL_RenderPresent(renderer);
205
206
207
208
209
210
211
212
213
}
int
main(int argc, char *argv[])
{
int i, done;
SDL_Event event;
Uint32 then, now, frames;
Jul 18, 2006
Jul 18, 2006
214
215
216
217
218
219
220
/* 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
222
223
for (i = 1; i < argc;) {
int consumed;
Jul 18, 2006
Jul 18, 2006
225
226
consumed = CommonArg(state, i);
if (consumed == 0) {
Jul 19, 2006
Jul 19, 2006
227
228
229
230
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
231
blendMode = SDL_BLENDMODE_NONE;
Jul 19, 2006
Jul 19, 2006
232
233
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
Dec 20, 2008
Dec 20, 2008
234
blendMode = SDL_BLENDMODE_BLEND;
Jul 19, 2006
Jul 19, 2006
235
236
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
Dec 20, 2008
Dec 20, 2008
237
blendMode = SDL_BLENDMODE_ADD;
Jul 19, 2006
Jul 19, 2006
238
consumed = 2;
Feb 5, 2011
Feb 5, 2011
239
240
241
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
blendMode = SDL_BLENDMODE_MOD;
consumed = 2;
Jul 19, 2006
Jul 19, 2006
242
243
}
}
Aug 28, 2006
Aug 28, 2006
244
245
246
247
248
249
} 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
250
251
252
253
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
Jul 18, 2006
Jul 18, 2006
254
}
Jul 19, 2006
Jul 19, 2006
255
if (consumed < 0) {
Jul 19, 2006
Jul 19, 2006
256
fprintf(stderr,
Feb 5, 2011
Feb 5, 2011
257
"Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha]\n",
Jul 19, 2006
Jul 19, 2006
258
argv[0], CommonUsage(state));
Jul 19, 2006
Jul 19, 2006
259
260
quit(1);
}
Jul 18, 2006
Jul 18, 2006
261
i += consumed;
Jul 18, 2006
Jul 18, 2006
263
264
if (!CommonInit(state)) {
quit(2);
265
266
267
}
/* Create the windows, initialize the renderers, and load the textures */
Jul 18, 2006
Jul 18, 2006
268
sprites =
Jan 21, 2010
Jan 21, 2010
269
(SDL_Texture **) SDL_malloc(state->num_windows * sizeof(*sprites));
Jul 18, 2006
Jul 18, 2006
270
if (!sprites) {
271
272
273
fprintf(stderr, "Out of memory!\n");
quit(2);
}
Jul 18, 2006
Jul 18, 2006
274
for (i = 0; i < state->num_windows; ++i) {
Feb 2, 2011
Feb 2, 2011
275
276
277
SDL_Renderer *renderer = state->renderers[i];
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
278
279
280
281
282
283
284
285
286
287
288
289
}
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
290
srand((unsigned int)time(NULL));
291
for (i = 0; i < num_sprites; ++i) {
Jul 18, 2006
Jul 18, 2006
292
293
positions[i].x = rand() % (state->window_w - sprite_w);
positions[i].y = rand() % (state->window_h - sprite_h);
294
295
296
297
298
299
300
301
302
303
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
304
/* Main render loop */
305
306
307
308
309
310
311
frames = 0;
then = SDL_GetTicks();
done = 0;
while (!done) {
/* Check for events */
++frames;
while (SDL_PollEvent(&event)) {
Jul 18, 2006
Jul 18, 2006
312
CommonEvent(state, &event, &done);
Jul 18, 2006
Jul 18, 2006
314
for (i = 0; i < state->num_windows; ++i) {
Feb 15, 2011
Feb 15, 2011
315
MoveSprites(state->renderers[i], sprites[i]);
316
317
318
319
320
321
}
}
/* Print out some timing information */
now = SDL_GetTicks();
if (now > then) {
Nov 25, 2008
Nov 25, 2008
322
double fps = ((double) frames * 1000) / (now - then);
Nov 25, 2008
Nov 25, 2008
323
printf("%2.2f frames per second\n", fps);
Feb 2, 2011
Feb 2, 2011
326
return 0;
327
328
329
}
/* vi: set ts=4 sw=4 expandtab: */