0

我遇到的问题是我的渲染循环。我的应用程序是一系列“平铺”对象,每个对象都有一个 x 和 y 坐标和图像。当程序启动时,它会在屏幕上创建一个 10x10 的这些图块网格。但是,并非所有的方块都可以同时看到,因此您可以使用箭头键在它们周围平移。当按下该键时,它使用 for 循环循环遍历所有当前渲染的图块(存储在 ArrayList 中)并将它们全部移动 16 个以适当的方向。问题是一些瓷砖闪烁。我可以看到,当滚动时,屏幕的一半没有及时移动以在正确的位置进行渲染,从而在与另一半图块之间形成黑色间隙。如何确保在渲染之前移动所有图块?

我的核心课程中的渲染功能

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 循环开始时将滚动值复制到两个局部变量中render,则每个图块将使用相同的值。

另一种选择是创建一个新列表,其中包含已修改坐标的图块(您可以使用当前列表中的图像)。新列表完成后,您可以设置一个标志,例如newRenderQueue将在render. 当 while 循环的新迭代render开始时,您可以用新列表替换渲染队列并重置标志。

PS 欢迎来到堆栈溢出!正如 Andrew Thompson 已经提到的,提供一个完整的问题示例非常有帮助。通过这种方式,人们可以快速调查问题并提供(希望是有用的)建议...... ;-)

于 2013-01-27T15:10:14.943 回答