1

私は最近、アレグロ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分で書きました)

アイテムスプライトに線が表示されないようにするにはどうすればよいですか?漠然としすぎた場合の問題の例を次に示します。

私の問題

WindowsXPでCodeblocksIDEを使用しています

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ブロック全体を別の場所に配置する必要があります。すなわち:

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 に答える