All pastes #96986 Raw Edit

Stuff

public text v1 · immutable
#96986 ·published 2006-07-23 09:07 UTC
rendered paste body
#include "SDL.h"
 
#define TILE_SIZE       32
#define WORLD_SIZEX     20
#define WORLD_SIZEY     20
#define SCREEN_SIZEX    12
#define SCREEN_SIZEY    12
 
int gameover;
int speedplayer1 = 1;
   
 
SDL_Rect srcCam;
 
/* source and destination rectangles */
SDL_Rect rcSrc, rcSprite;
 
SDL_Surface* tiles[3];
 
 char map[WORLD_SIZEY][WORLD_SIZEX]   = {
     {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
     {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, } ;
 
void load_tiles()
{
     tiles[0] = SDL_LoadBMP("data//graphic//tile0.bmp");
 tiles[1] = SDL_LoadBMP("data//graphic//tile1.bmp"); 
  tiles[2] = SDL_LoadBMP("data//graphic//tile2.bmp"); 
}
 
 
void draw_tiles(SDL_Surface *screen)
{
   SDL_Rect rect; 
   SDL_Rect srcRect;

 
   for (int y = 0; y < SCREEN_SIZEY; y++) 
   {
      for (int x = 0; x < SCREEN_SIZEX; x++) 
      {
         int scroll_x = (srcCam.x / TILE_SIZE);  
         int scroll_y = (srcCam.y / TILE_SIZE);
 
         int offset_x = scroll_x & (TILE_SIZE - 1);
         int offset_y = scroll_y & (TILE_SIZE - 1);
 
         int tile = map[offset_x][offset_y];
                   
      rect.x    =  (tile - 1) * TILE_SIZE;
      rect.y     =  0;
         rect.w = TILE_SIZE;
         rect.h = TILE_SIZE;
 
         SDL_BlitSurface( tiles[tile], &srcRect, screen, &rect );
      }
   }
} 



void HandleEvent(SDL_Event event)
{
       srcCam.x = 0;
srcCam.y = 0;  
  switch (event.type) {
    /* close button clicked */
    case SDL_QUIT:
      gameover = 1;
      break;
    /* handle the keyboard */
    case SDL_KEYDOWN:
      switch (event.key.keysym.sym) {
        case SDLK_ESCAPE:
        case SDLK_q:
          gameover = 1;
          break;
        case SDLK_a:
          if ( rcSrc.x == 192 )
            rcSrc.x = 224;
          else
            rcSrc.x = 192;
          rcSprite.x -= speedplayer1*32;
          srcCam.x -= 1;
          break;
        case SDLK_d:
          if ( rcSrc.x == 64 )
            rcSrc.x = 96;
          else
            rcSrc.x = 64;
          rcSprite.x += speedplayer1*32;
          srcCam.x += 1;
          break;
        case SDLK_w:
          if ( rcSrc.x == 0 )
            rcSrc.x = 32;
          else
            rcSrc.x = 0;
          rcSprite.y -= speedplayer1*32;
          srcCam.y -= 1;
          break;
        case SDLK_s:
          if ( rcSrc.x == 128 )
            rcSrc.x = 160;
          else
            rcSrc.x = 128;
          rcSprite.y += speedplayer1*32;
          srcCam.y += 1;
          break;
      }
      break;
  }
}       

int main ( int argc, char *argv[] )
{
  SDL_Surface *screen, *temp, *lol, *sprite;
  int colorkey;

  /* initialize SDL */
  SDL_Init(SDL_INIT_VIDEO);

  /* set the title bar */
  SDL_WM_SetCaption("Oxeria RPG", "MMORPG");
  

  /* create window */
  screen = SDL_SetVideoMode(640, 480, 0, 0);

  /* set keyboard repeat */
  SDL_EnableKeyRepeat(20, 20);
load_tiles();
draw_tiles(screen);
  
   if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
 {
  printf("Unable to init SDL: %s\n", SDL_GetError());
  gameover = 0;
 }

if( !screen ) {
	fprintf(stderr, "Couldn't create a surface: SCREEN%s\n",
			SDL_GetError());
	return -1;
}	

if( !tiles ) {
	fprintf(stderr, "Couldn't create a surface: TILES%s\n",
			SDL_GetError());
	return -1;
}	

if( !temp ) {
	fprintf(stderr, "Couldn't create a surface: TEMP%s\n",
			SDL_GetError());
	return -1;
}

if( !sprite ) {
	fprintf(stderr, "Couldn't create a surface: SPRITE%s\n",
			SDL_GetError());
	return -1;
}		
  
  /* load sprite */
  temp   = SDL_LoadBMP("data//graphic//sprite.bmp");
  sprite = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  
      // Load a bmp file as the icon of the program
  SDL_WM_SetIcon(SDL_LoadBMP("data//graphic//icon.bmp"),NULL);

  /* setup sprite colorkey and turn on RLE */
  colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
  SDL_SetColorKey(sprite, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);

  /* set sprite position */
  rcSprite.x = 150;
  rcSprite.y = 150;
  
  rcSrc.x = 128;
  rcSrc.y = 0;
  rcSrc.w = TILE_SIZE;
  rcSrc.h = TILE_SIZE;


  gameover = 0;

  /* message pump */
  while (!gameover)
  {
            SDL_Event event;

    /* look for an event */
    if (SDL_PollEvent(&event)) {
      HandleEvent(event);
    }

    /* collide with edges of screen */
    if ( rcSprite.x < 0 ) {
      rcSprite.x = 0;
    }
    else if ( rcSprite.x > WORLD_SIZEY-TILE_SIZE ) {
      rcSprite.x = WORLD_SIZEY-TILE_SIZE;
    }
    if ( rcSprite.y < 0 ) {
      rcSprite.y = 0;
    }
    else if ( rcSprite.y > WORLD_SIZEX-TILE_SIZE ) {
      rcSprite.y = WORLD_SIZEX-TILE_SIZE;
    }
    /* draw the sprite */
    SDL_BlitSurface(sprite, &rcSrc, screen, &rcSprite);

    /* update the screen */
    SDL_UpdateRect(screen, 0, 0, 0, 0);
  }


  /* clean up */
  SDL_FreeSurface(sprite);
  SDL_Quit();

  return 0;
}