cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

testnative.c (6976B)


      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:  Create a native window and attach an SDL renderer */
     13
     14#include <stdio.h>
     15#include <stdlib.h> /* for srand() */
     16#include <time.h> /* for time() */
     17
     18#include "testnative.h"
     19
     20#define WINDOW_W    640
     21#define WINDOW_H    480
     22#define NUM_SPRITES 100
     23#define MAX_SPEED   1
     24
     25static NativeWindowFactory *factories[] = {
     26#ifdef TEST_NATIVE_WINDOWS
     27    &WindowsWindowFactory,
     28#endif
     29#ifdef TEST_NATIVE_X11
     30    &X11WindowFactory,
     31#endif
     32#ifdef TEST_NATIVE_COCOA
     33    &CocoaWindowFactory,
     34#endif
     35    NULL
     36};
     37static NativeWindowFactory *factory = NULL;
     38static void *native_window;
     39static SDL_Rect *positions, *velocities;
     40
     41/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
     42static void
     43quit(int rc)
     44{
     45    SDL_VideoQuit();
     46    if (native_window) {
     47        factory->DestroyNativeWindow(native_window);
     48    }
     49    exit(rc);
     50}
     51
     52SDL_Texture *
     53LoadSprite(SDL_Renderer *renderer, char *file)
     54{
     55    SDL_Surface *temp;
     56    SDL_Texture *sprite;
     57
     58    /* Load the sprite image */
     59    temp = SDL_LoadBMP(file);
     60    if (temp == NULL) {
     61        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());
     62        return 0;
     63    }
     64
     65    /* Set transparent pixel as the pixel at (0,0) */
     66    if (temp->format->palette) {
     67        SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
     68    }
     69
     70    /* Create textures from the image */
     71    sprite = SDL_CreateTextureFromSurface(renderer, temp);
     72    if (!sprite) {
     73        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
     74        SDL_FreeSurface(temp);
     75        return 0;
     76    }
     77    SDL_FreeSurface(temp);
     78
     79    /* We're ready to roll. :) */
     80    return sprite;
     81}
     82
     83void
     84MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
     85{
     86    int sprite_w, sprite_h;
     87    int i;
     88    SDL_Rect viewport;
     89    SDL_Rect *position, *velocity;
     90
     91    /* Query the sizes */
     92    SDL_RenderGetViewport(renderer, &viewport);
     93    SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
     94
     95    /* Draw a gray background */
     96    SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
     97    SDL_RenderClear(renderer);
     98
     99    /* Move the sprite, bounce at the wall, and draw */
    100    for (i = 0; i < NUM_SPRITES; ++i) {
    101        position = &positions[i];
    102        velocity = &velocities[i];
    103        position->x += velocity->x;
    104        if ((position->x < 0) || (position->x >= (viewport.w - sprite_w))) {
    105            velocity->x = -velocity->x;
    106            position->x += velocity->x;
    107        }
    108        position->y += velocity->y;
    109        if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
    110            velocity->y = -velocity->y;
    111            position->y += velocity->y;
    112        }
    113
    114        /* Blit the sprite onto the screen */
    115        SDL_RenderCopy(renderer, sprite, NULL, position);
    116    }
    117
    118    /* Update the screen! */
    119    SDL_RenderPresent(renderer);
    120}
    121
    122int
    123main(int argc, char *argv[])
    124{
    125    int i, done;
    126    const char *driver;
    127    SDL_Window *window;
    128    SDL_Renderer *renderer;
    129    SDL_Texture *sprite;
    130    int window_w, window_h;
    131    int sprite_w, sprite_h;
    132    SDL_Event event;
    133
    134	/* Enable standard application logging */
    135    SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
    136
    137    if (SDL_VideoInit(NULL) < 0) {
    138        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL video: %s\n",
    139                SDL_GetError());
    140        exit(1);
    141    }
    142    driver = SDL_GetCurrentVideoDriver();
    143
    144    /* Find a native window driver and create a native window */
    145    for (i = 0; factories[i]; ++i) {
    146        if (SDL_strcmp(driver, factories[i]->tag) == 0) {
    147            factory = factories[i];
    148            break;
    149        }
    150    }
    151    if (!factory) {
    152        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't find native window code for %s driver\n",
    153                driver);
    154        quit(2);
    155    }
    156    SDL_Log("Creating native window for %s driver\n", driver);
    157    native_window = factory->CreateNativeWindow(WINDOW_W, WINDOW_H);
    158    if (!native_window) {
    159        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create native window\n");
    160        quit(3);
    161    }
    162    window = SDL_CreateWindowFrom(native_window);
    163    if (!window) {
    164        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create SDL window: %s\n", SDL_GetError());
    165        quit(4);
    166    }
    167    SDL_SetWindowTitle(window, "SDL Native Window Test");
    168
    169    /* Create the renderer */
    170    renderer = SDL_CreateRenderer(window, -1, 0);
    171    if (!renderer) {
    172        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError());
    173        quit(5);
    174    }
    175
    176    /* Clear the window, load the sprite and go! */
    177    SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
    178    SDL_RenderClear(renderer);
    179
    180    sprite = LoadSprite(renderer, "icon.bmp");
    181    if (!sprite) {
    182        quit(6);
    183    }
    184
    185    /* Allocate memory for the sprite info */
    186    SDL_GetWindowSize(window, &window_w, &window_h);
    187    SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
    188    positions = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
    189    velocities = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
    190    if (!positions || !velocities) {
    191        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");
    192        quit(2);
    193    }
    194    srand(time(NULL));
    195    for (i = 0; i < NUM_SPRITES; ++i) {
    196        positions[i].x = rand() % (window_w - sprite_w);
    197        positions[i].y = rand() % (window_h - sprite_h);
    198        positions[i].w = sprite_w;
    199        positions[i].h = sprite_h;
    200        velocities[i].x = 0;
    201        velocities[i].y = 0;
    202        while (!velocities[i].x && !velocities[i].y) {
    203            velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
    204            velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
    205        }
    206    }
    207
    208    /* Main render loop */
    209    done = 0;
    210    while (!done) {
    211        /* Check for events */
    212        while (SDL_PollEvent(&event)) {
    213            switch (event.type) {
    214            case SDL_WINDOWEVENT:
    215                switch (event.window.event) {
    216                case SDL_WINDOWEVENT_EXPOSED:
    217                    SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
    218                    SDL_RenderClear(renderer);
    219                    break;
    220                }
    221                break;
    222            case SDL_QUIT:
    223                done = 1;
    224                break;
    225            default:
    226                break;
    227            }
    228        }
    229        MoveSprites(renderer, sprite);
    230    }
    231
    232    quit(0);
    233
    234    return 0; /* to prevent compiler warning */
    235}
    236
    237/* vi: set ts=4 sw=4 expandtab: */