testspriteminimal.c (4839B)
1/* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> 3 4 This software is provided 'as-is', without any express or implied 5 warranty. In no event will the authors be held liable for any damages 6 arising from the use of this software. 7 8 Permission is granted to anyone to use this software for any purpose, 9 including commercial applications, and to alter it and redistribute it 10 freely. 11*/ 12/* Simple program: Move N sprites around on the screen as fast as possible */ 13 14#include <stdlib.h> 15#include <stdio.h> 16#include <time.h> 17 18#include "SDL.h" 19 20#define WINDOW_WIDTH 640 21#define WINDOW_HEIGHT 480 22#define NUM_SPRITES 100 23#define MAX_SPEED 1 24 25static SDL_Texture *sprite; 26static SDL_Rect positions[NUM_SPRITES]; 27static SDL_Rect velocities[NUM_SPRITES]; 28static int sprite_w, sprite_h; 29 30/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 31static void 32quit(int rc) 33{ 34 exit(rc); 35} 36 37int 38LoadSprite(char *file, SDL_Renderer *renderer) 39{ 40 SDL_Surface *temp; 41 42 /* Load the sprite image */ 43 temp = SDL_LoadBMP(file); 44 if (temp == NULL) { 45 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", file, SDL_GetError()); 46 return (-1); 47 } 48 sprite_w = temp->w; 49 sprite_h = temp->h; 50 51 /* Set transparent pixel as the pixel at (0,0) */ 52 if (temp->format->palette) { 53 SDL_SetColorKey(temp, SDL_TRUE, *(Uint8 *) temp->pixels); 54 } else { 55 switch (temp->format->BitsPerPixel) { 56 case 15: 57 SDL_SetColorKey(temp, SDL_TRUE, 58 (*(Uint16 *) temp->pixels) & 0x00007FFF); 59 break; 60 case 16: 61 SDL_SetColorKey(temp, SDL_TRUE, *(Uint16 *) temp->pixels); 62 break; 63 case 24: 64 SDL_SetColorKey(temp, SDL_TRUE, 65 (*(Uint32 *) temp->pixels) & 0x00FFFFFF); 66 break; 67 case 32: 68 SDL_SetColorKey(temp, SDL_TRUE, *(Uint32 *) temp->pixels); 69 break; 70 } 71 } 72 73 /* Create textures from the image */ 74 sprite = SDL_CreateTextureFromSurface(renderer, temp); 75 if (!sprite) { 76 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError()); 77 SDL_FreeSurface(temp); 78 return (-1); 79 } 80 SDL_FreeSurface(temp); 81 82 /* We're ready to roll. :) */ 83 return (0); 84} 85 86void 87MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite) 88{ 89 int i; 90 int window_w = WINDOW_WIDTH; 91 int window_h = WINDOW_HEIGHT; 92 SDL_Rect *position, *velocity; 93 94 /* Draw a gray background */ 95 SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); 96 SDL_RenderClear(renderer); 97 98 /* Move the sprite, bounce at the wall, and draw */ 99 for (i = 0; i < NUM_SPRITES; ++i) { 100 position = &positions[i]; 101 velocity = &velocities[i]; 102 position->x += velocity->x; 103 if ((position->x < 0) || (position->x >= (window_w - sprite_w))) { 104 velocity->x = -velocity->x; 105 position->x += velocity->x; 106 } 107 position->y += velocity->y; 108 if ((position->y < 0) || (position->y >= (window_h - sprite_h))) { 109 velocity->y = -velocity->y; 110 position->y += velocity->y; 111 } 112 113 /* Blit the sprite onto the screen */ 114 SDL_RenderCopy(renderer, sprite, NULL, position); 115 } 116 117 /* Update the screen! */ 118 SDL_RenderPresent(renderer); 119} 120 121int 122main(int argc, char *argv[]) 123{ 124 SDL_Window *window; 125 SDL_Renderer *renderer; 126 int i, done; 127 SDL_Event event; 128 129 /* Enable standard application logging */ 130 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 131 132 if (SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer) < 0) { 133 quit(2); 134 } 135 136 if (LoadSprite("icon.bmp", renderer) < 0) { 137 quit(2); 138 } 139 140 /* Initialize the sprite positions */ 141 srand(time(NULL)); 142 for (i = 0; i < NUM_SPRITES; ++i) { 143 positions[i].x = rand() % (WINDOW_WIDTH - sprite_w); 144 positions[i].y = rand() % (WINDOW_HEIGHT - sprite_h); 145 positions[i].w = sprite_w; 146 positions[i].h = sprite_h; 147 velocities[i].x = 0; 148 velocities[i].y = 0; 149 while (!velocities[i].x && !velocities[i].y) { 150 velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED; 151 velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED; 152 } 153 } 154 155 /* Main render loop */ 156 done = 0; 157 while (!done) { 158 /* Check for events */ 159 while (SDL_PollEvent(&event)) { 160 if (event.type == SDL_QUIT || event.type == SDL_KEYDOWN) { 161 done = 1; 162 } 163 } 164 MoveSprites(renderer, sprite); 165 } 166 167 quit(0); 168 169 return 0; /* to prevent compiler warning */ 170} 171 172/* vi: set ts=4 sw=4 expandtab: */