0

私が抱えている問題は、レンダー ループにあります。私のアプリケーションは、それぞれが x 座標と y 座標と画像を持つ一連の「Tile」オブジェクトです。プログラムが起動すると、これらのタイルの 10x10 グリッドが画面上に作成されます。ただし、すべての正方形を同時に表示できるわけではないため、矢印キーを使用してそれらの周りをパンできます。キーが押されると、for ループを使用して、現在レンダリングされているすべてのタイル (ArrayList に格納されている) を循環し、それらすべてを適切な方向に 16 シフトします。問題は、一部のタイルがちらつくことです。スクロールすると、画面の半分が適切な場所にレンダリングされるのに間に合わず、タイルの残りの半分との間に黒い隙間ができることがわかります。レンダリングの前にすべてのタイルが確実に移動されるようにするにはどうすればよいですか?

Core クラスの render 関数

public static void render()
{
    while(true)
    {
        Graphics g = buffer.getDrawGraphics();
        try
        {
            g.setColor(Color.black);
            g.fillRect(0, 0, 1280, 720);
            if(renderQueue != null)
            {
                for(int i = 0; i<renderQueue.size(); i++)
                {
                    Tile t = renderQueue.get(i);
                    g.drawImage(t.getImage(), t.getX(), t.getY(), null);
                }
            }
            if(!buffer.contentsLost())
            {
                buffer.show();
            }
        }
        finally
        {
            if(g != null)
            {
                g.dispose();
            }
        }
    }
}

そして、これが Input クラスの動きの更新関数です。

public void keyPressed(KeyEvent ke)
{
    int e = ke.getKeyCode();
    switch(e)
    {
        case 38://up
            if(scrollY > 0)
            {
                scrollY -= 16;
                for(int i = 0; i<Core.renderQueue.size(); i++)
                {
                    Core.renderQueue.get(i).incrementY(16);
                }
            }
            break;
        case 40://down
            if(scrollY < 560)
            {
                scrollY += 16;
                for(int i = 0; i<Core.renderQueue.size(); i++)
                {
                    Core.renderQueue.get(i).incrementY(-16);
                }
            }
            break;
        case 37://right
            if(scrollX < 0)
            {
                scrollX += 16;
                for(int i = 0; i<Core.renderQueue.size(); i++)
                {
                    Core.renderQueue.get(i).incrementX(16);
                }
            }
            break;
        case 39://left
            if(scrollX > 0)
            {
                scrollX -= 16;
                for(int i = 0; i<Core.renderQueue.size(); i++)
                {
                    Core.renderQueue.get(i).incrementX(-16);
                }
            }
            break;
    }

前もって感謝します!

4

1 に答える 1

0

一部のタイルの座標を で変更する必要があるのに、タイルがレンダリングされているようInput.keyPressedです。各タイルの座標を変更する代わりに、と を直接使用scrollXscrollYて でタイル イメージを描画することにより、これを修正できます。Core.renderの while ループの開始時にスクロール値を 2 つのローカル変数にコピーするとrender、同じ値が各タイルに使用されます。

別のオプションは、変更された座標を持つタイルを含む新しいリストを作成することです (現在のリストの画像を使用できます)。新しいリストが完成したら、newRenderQueuewhich will be pick up inのようなフラグを設定できますrender。while ループの新しい反復がrender開始されると、レンダー キューを新しいリストに置き換えて、フラグをリセットできます。

PS スタック オーバーフローへようこそ! Andrew Thompson が既に述べたように、問題の完全な例を提供することは非常に役に立ちます。このようにして、人々は問題をすばやく調査し、(うまくいけば役立つ) アドバイスを提供できます... ;-)

于 2013-01-27T15:10:14.943 に答える