2012-09-28 18 views
2

我有一個數字和字符的bmp文件。我的程序讀取按鍵並將適當的字符/數字從位圖傳送到屏幕上。唯一的問題是,如果我按'A' - 'A'會顯示在屏幕上,但如果我按'B',它將需要'A'的地方。所以我在屏幕上永遠不會有一個以上的角色。在屏幕上的字符之間創建空間 - SDL

這裏是我的代碼:

#include <SDL/SDL.h> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <SDL_image/SDL_image.h> 

using namespace std; 

const Uint32 FRAMES_PER_SECOND = 60; 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 
const int WIDTH = 21; 
const int HEIGHT = 25; 

SDL_Event sdlEvent; 


char getAsciiKey(const SDL_Event &sdlEvent); 

int main(int argc, char* args[]) 
{ 
    //The surfaces 
    SDL_Surface* image[2] = {NULL}; 
    SDL_Surface* screen  = NULL; 

    //Start SDL 
    SDL_Init(SDL_INIT_EVERYTHING); 

    //Set up screen 
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF); 

char filename[256]; //create a large enough C-string 

for(int index = 0; index < 2; index++) 
{ 
    sprintf(filename, "Text-types/Arial%d.bmp", index); //Arial0 and Arial1 

    //Load the image 
    image[index] = IMG_Load(filename); 

    if(image == NULL) 
    { 
     cout << "Error loading image: " << filename << endl; 
     exit(1); 
    } 
} 

Uint32 color = SDL_MapRGB(screen->format, 0xff,0xff,0xff); //White 
SDL_FillRect(screen, &screen->clip_rect, color);  //Backgroundcolor -> White 

bool quit = false;  


//Main program loop 
while(quit == false) 
{ 

    //Process any events from the event queue - such as key presses or mouse movements 
    while(SDL_PollEvent(&sdlEvent)) 
    { 
     if(sdlEvent.type == SDL_QUIT) 
     { 
      quit = true; 
     } 
     if (sdlEvent.type == SDL_KEYDOWN) //A key has just pressed 
     { 
      int x, y, temp; 
      SDL_Rect srcRect; 
      SDL_Rect dstRect; 

      //char letter = getAsciiKey(sdlEvent); //Getting keypress 


      temp = (static_cast<int>(getAsciiKey(sdlEvent)) - 12); 

      x = (temp % 20); //X-axis postion 
      y = (temp/20); //Y-axis position 

      srcRect.x = (x - 1) * WIDTH; 
      srcRect.y = (y - 1) * HEIGHT; 

      //PIXELSIZE 
      srcRect.w = WIDTH; 
      srcRect.h = HEIGHT; 

      dstRect.x = 0; 
      dstRect.y = 0; 

      dstRect.w = WIDTH; 
      dstRect.h = HEIGHT; 

      SDL_BlitSurface(image[1] , &srcRect, screen, &dstRect); //Putting image up     on screen 

      //Update Screen 
      SDL_Flip(screen); 

      //Pause 
      SDL_Delay(2000); 

     } 
    } 

} 
//Free any loaded images 
for(int index = 0; index < 2; index++) 
{ 
    SDL_FreeSurface(image[index]); 
} 


//Quit SDL 
SDL_Quit(); 

return 0; 

} 

char getAsciiKey(const SDL_Event &sdlEvent) 
{ 
    char key = 0; 
    if(sdlEvent.key.keysym.sym >= SDLK_a && sdlEvent.key.keysym.sym <= SDLK_z) 
    { 
     if(sdlEvent.key.keysym.mod & KMOD_SHIFT) 
     { 
      key = 'A' + char(sdlEvent.key.keysym.sym - SDLK_a); 
     } 

     else 
     { 
      key = 'a' + char(sdlEvent.key.keysym.sym - SDLK_a); 
     } 
    } 

    else if(sdlEvent.key.keysym.sym >= SDLK_0 && sdlEvent.key.keysym.sym <= SDLK_9) 
    { 
     key = '0' + char(sdlEvent.key.keysym.sym - SDLK_0); 
    } 

    return key; 
} 

回答

2
dstRect.x = 0; 
dstRect.y = 0; 

這是你塊傳輸的位置,我沒有看到你在任何地方改變它。爲每個新角色更新它。

此外,該:

dstRect.w = WIDTH; 
dstRect.h = HEIGHT; 

是多餘的,寬度和目的地的高度位圖傳輸時(至少reference for SDL_BlitSurface是這樣說的)將被忽略。

+0

非常真實。謝謝! –