SDL 2 — Размытие поверхности на другую поверхность (SDL2, C ++, VS2015)

Я работаю над маленькой игрой для школы. Я выложил изображение на экране, но каждый раз, когда мой персонаж перемещается, я должен переставлять его (плитки находятся позади персонажа, потому что это сетка, и персонаж перемещается в ячейках). Я попытался выложить все на другую поверхность, и затем эту поверхность вспыхнуло на моей поверхности экрана, чтобы избежать необходимости повторять ее каждый раз и экономить время процесса.
Это на самом деле не сработало, это как поверхность, на которую я кладу плитку, забывает, что на ней было. Это не ошибка, просто не отображает плиточную поверхность на поверхности моего окна.

Вот мой код (соответствующая часть по крайней мере)

void postaviTiles() {

SDL_BlitSurface(cell, NULL, polje, &offsetcell); //cell

for (int i = 0; i < 89; i++) {
SDL_Delay(5);
if (offsetcell.x < 450) {
offsetcell.x += 50;
SDL_BlitSurface(cell, NULL, polje, &offsetcell);
}

else {
offsetcell.x = 9;
offsetcell.y += 50;
SDL_BlitSurface(cell, NULL, polje, &offsetcell);
}
SDL_UpdateWindowSurface(okno);
}

poljezrisano = true;
}

//--------------------------------------------------------------//

void tileCells() {

if (poljezrisano == false) {
postaviTiles();}

SDL_BlitSurface(polje, NULL, oknoSurface, NULL); //cell
SDL_UpdateWindowSurface(okno);
}

//--------------------------------------------------------------//

Стоит упомянуть, что мозаика каждый раз работает нормально, но я хочу разложить ее один раз, нанести ее на поверхность, а затем просто приклеить эту поверхность на поверхность моего экрана.

П.С .: Извините за то, что большинство переменных и имен функций не на английском

0

Решение

SDL_BlitSurface берет поверхность источника, клип этой поверхности источника, затем поверхность назначения и позицию, в которой вы хотите отобразить (бликать) ваш источник.

Последний параметр, который передается в SDL_BlitSurface, игнорирует ширину и высоту, он просто принимает значение x a y.

Вот цитата из документация:

Ширина и высота в srcrect определяют размер скопированного прямоугольника. В dstrect используется только позиция (ширина и высота игнорируются).

И прототип для функции:

int SDL_BlitSurface(SDL_Surface*    src,
const SDL_Rect* srcrect,
SDL_Surface*    dst,
SDL_Rect*       dstrect)

Об этом следует помнить, не зная, применимо ли это к вашему случаю, поскольку имена ваших переменных не английские.

Но по сути с этой строкой:

SDL_BlitSurface(cell, NULL, polje, &offsetcell);

Вы говорите SDL, что хотите, чтобы все ячейки были размещены внутри поля в позициях offsetcell.x и offsetcell.y с шириной cell.w и высотой cell.h.

Если вы хотите разместить ячейку внутри поля, используя ширину и высоту offsetcell, вам придется использовать другую функцию blit, а именно SDL_BlitScaled

Вот как я бы бликал плитки внутри сетки (карты).

SDL_Surface* grid; // assuming this is the new grid surface that holds the blited tiles
SDL_Surface* tile; // assuming this is a single tile of width 50, height 50
SDL_Surface* windowSurface;
SDL_Window* window;

int TileWidth = 50;
int TileHeight = 50;
int NumTiles = 90;
int TileColumns = 450 / TileWidth; // = 9, so we have a grid of 9X10

bool isFillGridTiles = false;

void FillGridTiles()
{
for (int i = 0;i < NumTiles; i++)
{
auto y = i / TileColumns; // divide to get the y position and...
auto x = i % TileColumns; // the remainder is the x position inside the grid

SDL_Rect srcClip;
srcClip.x = 0;
srcClip.y = 0;
srcClip.w = TileWidth;
srcClip.h = TileHeight;

SDL_Rect dstClip;
dstClip.x = x * TileWidth;
dstClip.y = y * TileHeight;
dstClip.w = TileWidth;
dstClip.h = TileHeight;

SDL_BlitSurface(tile, &srcClip, grid, &dstClip); //since we have the same width and height, we can use SDL_BlitSurface instead of SDL_BlitScaled

}

isFillGridTiles = true;
}

void BlitOnScreen()
{
if(!isFillGridTiles)
{
FillGridTiles();
}

SDL_BlitSurface(grid, NULL, windowSurface, NULL);
SDL_UpdateWindowSurface(window);
}
1

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

Не уверен, что код завершен, как опубликовано, но, похоже, вы не инициализируете offsetcell. Это соответствует симптому отсутствия ничего. Явное определение offsetcell может быть лучше, чем предоставленный вами инкрементный метод. Например:

for( offsetcell.x = 0; offsetcell.x < 450; offsetcell.x += 50) {
for( offsetcell.y = 0; offsetcell.y < 450; offsetcell.y += 50) {
...
}
}
1

По вопросам рекламы [email protected]