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

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

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.


person Bugster    schedule 11.09.2012    source источник


Ответы (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;
}
person Matthew    schedule 11.09.2012
comment
Позже я понял, что это происходит, но ваш ответ правильный, так что спасибо :) - person Bugster; 12.09.2012