Xcode-iPhoneOS/Demos/src/happy.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 13 Mar 2011 11:17:11 -0700
changeset 5483 ccec742c9b7d
parent 5214 b0797947dd1c
permissions -rw-r--r--
Removed unreferenced variable
     1 /*
     2  *	happy.c
     3  *	written by Holmes Futrell
     4  *	use however you want
     5  */
     6 
     7 #include "SDL.h"
     8 #include "common.h"
     9 
    10 #define NUM_HAPPY_FACES 100     /* number of faces to draw */
    11 #define MILLESECONDS_PER_FRAME 16       /* about 60 frames per second */
    12 #define HAPPY_FACE_SIZE 32      /* width and height of happyface (pixels) */
    13 
    14 static SDL_Texture *texture = 0;    /* reference to texture holding happyface */
    15 
    16 static struct
    17 {
    18     float x, y;                 /* position of happyface */
    19     float xvel, yvel;           /* velocity of happyface */
    20 } faces[NUM_HAPPY_FACES];
    21 
    22 /*
    23 	Sets initial positions and velocities of happyfaces
    24 	units of velocity are pixels per millesecond
    25 */
    26 void
    27 initializeHappyFaces()
    28 {
    29     int i;
    30     for (i = 0; i < NUM_HAPPY_FACES; i++) {
    31         faces[i].x = randomFloat(0.0f, SCREEN_WIDTH - HAPPY_FACE_SIZE);
    32         faces[i].y = randomFloat(0.0f, SCREEN_HEIGHT - HAPPY_FACE_SIZE);
    33         faces[i].xvel = randomFloat(-0.1f, 0.1f);
    34         faces[i].yvel = randomFloat(-0.1f, 0.1f);
    35     }
    36 }
    37 
    38 void
    39 render(SDL_Renderer *renderer)
    40 {
    41 
    42     int i;
    43     SDL_Rect srcRect;
    44     SDL_Rect dstRect;
    45 
    46     /* setup boundaries for happyface bouncing */
    47     Uint16 maxx = SCREEN_WIDTH - HAPPY_FACE_SIZE;
    48     Uint16 maxy = SCREEN_HEIGHT - HAPPY_FACE_SIZE;
    49     Uint16 minx = 0;
    50     Uint16 miny = 0;
    51 
    52     /* setup rects for drawing */
    53     srcRect.x = 0;
    54     srcRect.y = 0;
    55     srcRect.w = HAPPY_FACE_SIZE;
    56     srcRect.h = HAPPY_FACE_SIZE;
    57     dstRect.w = HAPPY_FACE_SIZE;
    58     dstRect.h = HAPPY_FACE_SIZE;
    59 
    60     /* fill background in with black */
    61     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    62     SDL_RenderClear(renderer);
    63 
    64     /*
    65        loop through all the happy faces:
    66        - update position
    67        - update velocity (if boundary is hit)
    68        - draw
    69      */
    70     for (i = 0; i < NUM_HAPPY_FACES; i++) {
    71         faces[i].x += faces[i].xvel * MILLESECONDS_PER_FRAME;
    72         faces[i].y += faces[i].yvel * MILLESECONDS_PER_FRAME;
    73         if (faces[i].x > maxx) {
    74             faces[i].x = maxx;
    75             faces[i].xvel = -faces[i].xvel;
    76         } else if (faces[i].y > maxy) {
    77             faces[i].y = maxy;
    78             faces[i].yvel = -faces[i].yvel;
    79         }
    80         if (faces[i].x < minx) {
    81             faces[i].x = minx;
    82             faces[i].xvel = -faces[i].xvel;
    83         } else if (faces[i].y < miny) {
    84             faces[i].y = miny;
    85             faces[i].yvel = -faces[i].yvel;
    86         }
    87         dstRect.x = faces[i].x;
    88         dstRect.y = faces[i].y;
    89         SDL_RenderCopy(renderer, texture, &srcRect, &dstRect);
    90     }
    91     /* update screen */
    92     SDL_RenderPresent(renderer);
    93 
    94 }
    95 
    96 /*
    97 	loads the happyface graphic into a texture
    98 */
    99 void
   100 initializeTexture(SDL_Renderer *renderer)
   101 {
   102     SDL_Surface *bmp_surface;
   103     /* load the bmp */
   104     bmp_surface = SDL_LoadBMP("icon.bmp");
   105     if (bmp_surface == NULL) {
   106         fatalError("could not load bmp");
   107     }
   108     /* set white to transparent on the happyface */
   109     SDL_SetColorKey(bmp_surface, 1,
   110                     SDL_MapRGB(bmp_surface->format, 255, 255, 255));
   111 
   112     /* convert RGBA surface to texture */
   113     texture = SDL_CreateTextureFromSurface(renderer, bmp_surface);
   114     if (texture == 0) {
   115         fatalError("could not create texture");
   116     }
   117     SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
   118 
   119     /* free up allocated memory */
   120     SDL_FreeSurface(bmp_surface);
   121 }
   122 
   123 int
   124 main(int argc, char *argv[])
   125 {
   126 
   127     SDL_Window *window;
   128 	SDL_Renderer *renderer;
   129     Uint32 startFrame;
   130     Uint32 endFrame;
   131     Uint32 delay;
   132     int done;
   133 
   134     /* initialize SDL */
   135     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
   136         fatalError("Could not initialize SDL");
   137     }
   138     window = SDL_CreateWindow(NULL, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
   139                                 SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN |
   140                                 SDL_WINDOW_BORDERLESS);
   141 
   142     renderer = SDL_CreateRenderer(window, -1, 0);
   143 
   144     initializeTexture(renderer);
   145     initializeHappyFaces();
   146 
   147     /* main loop */
   148     done = 0;
   149     while (!done) {
   150         startFrame = SDL_GetTicks();
   151         SDL_Event event;
   152         while (SDL_PollEvent(&event)) {
   153             if (event.type == SDL_QUIT) {
   154                 done = 1;
   155             }
   156         }
   157         render(renderer);
   158         endFrame = SDL_GetTicks();
   159 
   160         /* figure out how much time we have left, and then sleep */
   161         delay = MILLESECONDS_PER_FRAME - (endFrame - startFrame);
   162         if (delay < 0) {
   163             delay = 0;
   164         } else if (delay > MILLESECONDS_PER_FRAME) {
   165             delay = MILLESECONDS_PER_FRAME;
   166         }
   167         SDL_Delay(delay);
   168     }
   169 
   170     /* cleanup */
   171     SDL_DestroyTexture(texture);
   172     /* shutdown SDL */
   173     SDL_Quit();
   174 
   175     return 0;
   176 
   177 }