Создайте пространство между символами на экране — SDL

У меня есть bmp-файл из цифр и символов. Моя программа считывает нажатия клавиш и перетаскивает соответствующий символ / число из растрового изображения на экран. Единственная проблема — если я нажму «A» — на экране появится «A», но если я нажму «B», она займет место «A». Поэтому у меня никогда не будет более одного персонажа на экране.

Вот мой код:

#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 keypresstemp = (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 так говорит).

2

Другие решения

Других решений пока нет …