#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; }