test/testspriteminimal.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Dec 2017 16:08:09 -0800
changeset 11730 ac6c607e065c
parent 10737 3406a0f8b041
child 11811 5d94cb6b24d3
permissions -rw-r--r--
Enable building the Metal renderer by default, and weak link the Metal framework so the SDL library is safe to use on older Macs
Also generate iOS versions of the Metal shaders
     1 /*
     2   Copyright (C) 1997-2017 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 #ifdef __EMSCRIPTEN__
   140     if (done) {
   141         emscripten_cancel_main_loop();
   142     }
   143 #endif
   144 }
   145 
   146 int
   147 main(int argc, char *argv[])
   148 {
   149     SDL_Window *window;
   150     int i;
   151 
   152 
   153     /* Enable standard application logging */
   154     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
   155 
   156     if (SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer) < 0) {
   157         quit(2);
   158     }
   159 
   160     if (LoadSprite("icon.bmp", renderer) < 0) {
   161         quit(2);
   162     }
   163 
   164     /* Initialize the sprite positions */
   165     srand(time(NULL));
   166     for (i = 0; i < NUM_SPRITES; ++i) {
   167         positions[i].x = rand() % (WINDOW_WIDTH - sprite_w);
   168         positions[i].y = rand() % (WINDOW_HEIGHT - sprite_h);
   169         positions[i].w = sprite_w;
   170         positions[i].h = sprite_h;
   171         velocities[i].x = 0;
   172         velocities[i].y = 0;
   173         while (!velocities[i].x && !velocities[i].y) {
   174             velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   175             velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   176         }
   177     }
   178 
   179     /* Main render loop */
   180     done = 0;
   181 
   182 #ifdef __EMSCRIPTEN__
   183     emscripten_set_main_loop(loop, 0, 1);
   184 #else
   185     while (!done) {
   186         loop();
   187     }
   188 #endif
   189     quit(0);
   190 
   191     return 0; /* to prevent compiler warning */
   192 }
   193 
   194 /* vi: set ts=4 sw=4 expandtab: */