Allegro 5 рисует растровое изображение поверх примитива

Недавно я попытался создать систему инвентаризации в allegro 5, где я рисую сетку квадратов 20×20 и перетаскиваю предметы. Проблема в том, что я вижу, как идет спрайт под фактическая сетка, которую я нарисовал, что является нежелательным эффектом. Вот мой код:

if(draw)
{
draw = false;
al_draw_bitmap(image, item.posx, item.posy, 0);

if(mouseKey)
{
grab = true;
item.posx = mouse.posx - (item.boundx-5);
item.posy = mouse.posy - (item.boundy-5);
}

else if(mouseKey == false && grab == true)
{
for(int i = 0; i < mouse.posx; i += 20)
{
if(i < mouse.posx)
item.posx = i;
}
for(int j = 0; j < mouse.posy; j += 20)
{
if(j < mouse.posy)
{
item.posy = j;
}
}
grab = false;
}

for(int i = 0; i <= width; i += 20)
{
al_draw_line(i, 0, i, height, al_map_rgb(0, 0, 0), 1);
al_draw_line(0, i, width, i, al_map_rgb(0, 0, 0), 1);
}

al_flip_display();
al_clear_to_color(al_map_rgb(40,40,40));
}

(Я знаю, что это ужасно написано и неоптимизировано, но я написал это примерно за 10 минут просто как тест)

Как сделать так, чтобы спрайт элемента не отображал над ним линии? Вот пример моей проблемы, если я был слишком расплывчатым:

Моя проблема

Я использую Codeblocks IDE на Windows XP

1

Решение

Если вы не возитесь с настройками OpenGL, вы всегда будете получать то, что рисуете в последнюю очередь сверху. Так что в этом случае просто двигаться al_draw_bitmap(image, item.posx, item.posy, 0); быть прямо над al_flip_display(),

Обратите внимание, что у вас будут некоторые проблемы, потому что вы манипулируете item.posx а также item.posy в этом разделе, так что вам придется сначала кэшировать результаты:

int x = item.posx;
int y = item.posy;

// ...

al_draw_bitmap(image, x, y, 0);
al_flip_display();

Тем не менее, это всего лишь повод для более масштабной проблемы: вам не нужно ничего менять внутри вашего блока рисования. Весь блок if / else должен быть в другом месте. т.е .:

if (event timer is a game tick)
{
do all logic stuff
draw = true
}

if (draw)
{
do all drawing stuff
draw = false;
}
2

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

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

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