1

我最近尝试在 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 分钟内写了它只是作为一个测试)

我怎样才能使项目精灵不显示它上面的线条?如果我太含糊,这是我的问题的一个例子:

我的问题

我在 Windows XP 上使用 Codeblocks IDE

4

1 回答 1

2

除非您摆弄 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 块应该在其他地方。IE:

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

if (draw)
{
  do all drawing stuff
  draw = false;
}
于 2012-09-11T22:54:06.223 回答