Edit

kc3-lang/SDL/Xcode-iOS/Demos/src/happy.c

Branch :

  • Show log

    Commit

  • Author : Gabriel Jacobo
    Date : 2013-11-29 10:06:08
    Hash : f848adff
    Message : Improve Android pause/resume behavior.

  • Xcode-iOS/Demos/src/happy.c
  • /*
     *  happy.c
     *  written by Holmes Futrell
     *  use however you want
     */
    
    #include "SDL.h"
    #include "common.h"
    
    #define NUM_HAPPY_FACES 100     /* number of faces to draw */
    #define MILLESECONDS_PER_FRAME 16       /* about 60 frames per second */
    #define HAPPY_FACE_SIZE 32      /* width and height of happyface (pixels) */
    
    static SDL_Texture *texture = 0;    /* reference to texture holding happyface */
    
    static struct
    {
        float x, y;                 /* position of happyface */
        float xvel, yvel;           /* velocity of happyface */
    } faces[NUM_HAPPY_FACES];
    
    /*
        Sets initial positions and velocities of happyfaces
        units of velocity are pixels per millesecond
    */
    void
    initializeHappyFaces()
    {
        int i;
        for (i = 0; i < NUM_HAPPY_FACES; i++) {
            faces[i].x = randomFloat(0.0f, SCREEN_WIDTH - HAPPY_FACE_SIZE);
            faces[i].y = randomFloat(0.0f, SCREEN_HEIGHT - HAPPY_FACE_SIZE);
            faces[i].xvel = randomFloat(-0.1f, 0.1f);
            faces[i].yvel = randomFloat(-0.1f, 0.1f);
        }
    }
    
    void
    render(SDL_Renderer *renderer)
    {
    
        int i;
        SDL_Rect srcRect;
        SDL_Rect dstRect;
    
        /* setup boundaries for happyface bouncing */
        Uint16 maxx = SCREEN_WIDTH - HAPPY_FACE_SIZE;
        Uint16 maxy = SCREEN_HEIGHT - HAPPY_FACE_SIZE;
        Uint16 minx = 0;
        Uint16 miny = 0;
    
        /* setup rects for drawing */
        srcRect.x = 0;
        srcRect.y = 0;
        srcRect.w = HAPPY_FACE_SIZE;
        srcRect.h = HAPPY_FACE_SIZE;
        dstRect.w = HAPPY_FACE_SIZE;
        dstRect.h = HAPPY_FACE_SIZE;
    
        /* fill background in with black */
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
    
        /*
           loop through all the happy faces:
           - update position
           - update velocity (if boundary is hit)
           - draw
         */
        for (i = 0; i < NUM_HAPPY_FACES; i++) {
            faces[i].x += faces[i].xvel * MILLESECONDS_PER_FRAME;
            faces[i].y += faces[i].yvel * MILLESECONDS_PER_FRAME;
            if (faces[i].x > maxx) {
                faces[i].x = maxx;
                faces[i].xvel = -faces[i].xvel;
            } else if (faces[i].y > maxy) {
                faces[i].y = maxy;
                faces[i].yvel = -faces[i].yvel;
            }
            if (faces[i].x < minx) {
                faces[i].x = minx;
                faces[i].xvel = -faces[i].xvel;
            } else if (faces[i].y < miny) {
                faces[i].y = miny;
                faces[i].yvel = -faces[i].yvel;
            }
            dstRect.x = faces[i].x;
            dstRect.y = faces[i].y;
            SDL_RenderCopy(renderer, texture, &srcRect, &dstRect);
        }
        /* update screen */
        SDL_RenderPresent(renderer);
    
    }
    
    /*
        loads the happyface graphic into a texture
    */
    void
    initializeTexture(SDL_Renderer *renderer)
    {
        SDL_Surface *bmp_surface;
        /* load the bmp */
        bmp_surface = SDL_LoadBMP("icon.bmp");
        if (bmp_surface == NULL) {
            fatalError("could not load bmp");
        }
        /* set white to transparent on the happyface */
        SDL_SetColorKey(bmp_surface, 1,
                        SDL_MapRGB(bmp_surface->format, 255, 255, 255));
    
        /* convert RGBA surface to texture */
        texture = SDL_CreateTextureFromSurface(renderer, bmp_surface);
        if (texture == 0) {
            fatalError("could not create texture");
        }
        SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
    
        /* free up allocated memory */
        SDL_FreeSurface(bmp_surface);
    }
    
    int
    main(int argc, char *argv[])
    {
    
        SDL_Window *window;
        SDL_Renderer *renderer;
        Uint32 startFrame;
        Uint32 endFrame;
        Uint32 delay;
        int done;
    
        /* initialize SDL */
        if (SDL_Init(SDL_INIT_VIDEO) < 0) {
            fatalError("Could not initialize SDL");
        }
        window = SDL_CreateWindow(NULL, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
                                    SDL_WINDOW_OPENGL |
                                    SDL_WINDOW_BORDERLESS);
    
        renderer = SDL_CreateRenderer(window, -1, 0);
    
        initializeTexture(renderer);
        initializeHappyFaces();
    
        /* main loop */
        done = 0;
        while (!done) {
            startFrame = SDL_GetTicks();
            SDL_Event event;
            while (SDL_PollEvent(&event)) {
                if (event.type == SDL_QUIT) {
                    done = 1;
                }
            }
            render(renderer);
            endFrame = SDL_GetTicks();
    
            /* figure out how much time we have left, and then sleep */
            delay = MILLESECONDS_PER_FRAME - (endFrame - startFrame);
            if (delay < 0) {
                delay = 0;
            } else if (delay > MILLESECONDS_PER_FRAME) {
                delay = MILLESECONDS_PER_FRAME;
            }
            SDL_Delay(delay);
        }
    
        /* cleanup */
        SDL_DestroyTexture(texture);
        /* shutdown SDL */
        SDL_Quit();
    
        return 0;
    
    }