Я работаю над маленькой игрой для школы. Я выложил изображение на экране, но каждый раз, когда мой персонаж перемещается, я должен переставлять его (плитки находятся позади персонажа, потому что это сетка, и персонаж перемещается в ячейках). Я попытался выложить все на другую поверхность, и затем эту поверхность вспыхнуло на моей поверхности экрана, чтобы избежать необходимости повторять ее каждый раз и экономить время процесса.
Это на самом деле не сработало, это как поверхность, на которую я кладу плитку, забывает, что на ней было. Это не ошибка, просто не отображает плиточную поверхность на поверхности моего окна.
Вот мой код (соответствующая часть по крайней мере)
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);
}
//--------------------------------------------------------------//
Стоит упомянуть, что мозаика каждый раз работает нормально, но я хочу разложить ее один раз, нанести ее на поверхность, а затем просто приклеить эту поверхность на поверхность моего экрана.
П.С .: Извините за то, что большинство переменных и имен функций не на английском
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);
}
Не уверен, что код завершен, как опубликовано, но, похоже, вы не инициализируете offsetcell. Это соответствует симптому отсутствия ничего. Явное определение offsetcell может быть лучше, чем предоставленный вами инкрементный метод. Например:
for( offsetcell.x = 0; offsetcell.x < 450; offsetcell.x += 50) {
for( offsetcell.y = 0; offsetcell.y < 450; offsetcell.y += 50) {
...
}
}