2012-09-28 1 views
2

bmp 파일에 숫자와 문자가 있습니다. 내 프로그램은 키 누르기를 읽고 적절한 문자/숫자를 비트 맵에서 화면으로 블립합니다. 유일한 문제는 'A'를 누르면 화면에 'A'가 표시되지만 'B'를 누르면 'A'가 표시됩니다. 그래서 나는 화면에 한 명 이상의 성격을 갖지 않을 것이다.화면에서 blitted 문자 사이에 공백 만들기 - 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

매우 사실입니다. 감사! –