test/testspriteminimal.c
author Philipp Wiesemann <philipp.wiesemann@arcor.de>
Wed, 11 Mar 2015 21:14:21 +0100
changeset 9380 07b7c1005a23
parent 9278 8900afb78a19
child 9607 7746ab058d12
permissions -rw-r--r--
Updated internal documentation comments.
     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 #ifdef __EMSCRIPTEN__
    19 #include <emscripten/emscripten.h>
    20 #endif
    21 
    22 #include "SDL.h"
    23 
    24 #define WINDOW_WIDTH    640
    25 #define WINDOW_HEIGHT   480
    26 #define NUM_SPRITES     100
    27 #define MAX_SPEED       1
    28 
    29 static SDL_Texture *sprite;
    30 static SDL_Rect positions[NUM_SPRITES];
    31 static SDL_Rect velocities[NUM_SPRITES];
    32 static int sprite_w, sprite_h;
    33 
    34 SDL_Renderer *renderer;
    35 int done;
    36 
    37 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    38 static void
    39 quit(int rc)
    40 {
    41     exit(rc);
    42 }
    43 
    44 int
    45 LoadSprite(char *file, SDL_Renderer *renderer)
    46 {
    47     SDL_Surface *temp;
    48 
    49     /* Load the sprite image */
    50     temp = SDL_LoadBMP(file);
    51     if (temp == NULL) {
    52         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", file, SDL_GetError());
    53         return (-1);
    54     }
    55     sprite_w = temp->w;
    56     sprite_h = temp->h;
    57 
    58     /* Set transparent pixel as the pixel at (0,0) */
    59     if (temp->format->palette) {
    60         SDL_SetColorKey(temp, SDL_TRUE, *(Uint8 *) temp->pixels);
    61     } else {
    62         switch (temp->format->BitsPerPixel) {
    63         case 15:
    64             SDL_SetColorKey(temp, SDL_TRUE,
    65                             (*(Uint16 *) temp->pixels) & 0x00007FFF);
    66             break;
    67         case 16:
    68             SDL_SetColorKey(temp, SDL_TRUE, *(Uint16 *) temp->pixels);
    69             break;
    70         case 24:
    71             SDL_SetColorKey(temp, SDL_TRUE,
    72                             (*(Uint32 *) temp->pixels) & 0x00FFFFFF);
    73             break;
    74         case 32:
    75             SDL_SetColorKey(temp, SDL_TRUE, *(Uint32 *) temp->pixels);
    76             break;
    77         }
    78     }
    79 
    80     /* Create textures from the image */
    81     sprite = SDL_CreateTextureFromSurface(renderer, temp);
    82     if (!sprite) {
    83         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
    84         SDL_FreeSurface(temp);
    85         return (-1);
    86     }
    87     SDL_FreeSurface(temp);
    88 
    89     /* We're ready to roll. :) */
    90     return (0);
    91 }
    92 
    93 void
    94 MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
    95 {
    96     int i;
    97     int window_w = WINDOW_WIDTH;
    98     int window_h = WINDOW_HEIGHT;
    99     SDL_Rect *position, *velocity;
   100 
   101     /* Draw a gray background */
   102     SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
   103     SDL_RenderClear(renderer);
   104 
   105     /* Move the sprite, bounce at the wall, and draw */
   106     for (i = 0; i < NUM_SPRITES; ++i) {
   107         position = &positions[i];
   108         velocity = &velocities[i];
   109         position->x += velocity->x;
   110         if ((position->x < 0) || (position->x >= (window_w - sprite_w))) {
   111             velocity->x = -velocity->x;
   112             position->x += velocity->x;
   113         }
   114         position->y += velocity->y;
   115         if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
   116             velocity->y = -velocity->y;
   117             position->y += velocity->y;
   118         }
   119 
   120         /* Blit the sprite onto the screen */
   121         SDL_RenderCopy(renderer, sprite, NULL, position);
   122     }
   123 
   124     /* Update the screen! */
   125     SDL_RenderPresent(renderer);
   126 }
   127 
   128 void loop()
   129 {
   130     SDL_Event event;
   131 
   132     /* Check for events */
   133     while (SDL_PollEvent(&event)) {
   134         if (event.type == SDL_QUIT || event.type == SDL_KEYDOWN) {
   135             done = 1;
   136         }
   137     }
   138     MoveSprites(renderer, sprite);
   139 }
   140 
   141 int
   142 main(int argc, char *argv[])
   143 {
   144     SDL_Window *window;
   145     int i;
   146 
   147 
   148 	/* Enable standard application logging */
   149     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
   150 
   151     if (SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer) < 0) {
   152         quit(2);
   153     }
   154 
   155     if (LoadSprite("icon.bmp", renderer) < 0) {
   156         quit(2);
   157     }
   158 
   159     /* Initialize the sprite positions */
   160     srand(time(NULL));
   161     for (i = 0; i < NUM_SPRITES; ++i) {
   162         positions[i].x = rand() % (WINDOW_WIDTH - sprite_w);
   163         positions[i].y = rand() % (WINDOW_HEIGHT - sprite_h);
   164         positions[i].w = sprite_w;
   165         positions[i].h = sprite_h;
   166         velocities[i].x = 0;
   167         velocities[i].y = 0;
   168         while (!velocities[i].x && !velocities[i].y) {
   169             velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   170             velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   171         }
   172     }
   173 
   174     /* Main render loop */
   175     done = 0;
   176 
   177 #ifdef __EMSCRIPTEN__
   178     emscripten_set_main_loop(loop, 0, 1);
   179 #else
   180     while (!done) {
   181         loop();
   182         }
   183 #endif
   184     quit(0);
   185 
   186     return 0; /* to prevent compiler warning */
   187 }
   188 
   189 /* vi: set ts=4 sw=4 expandtab: */