循环后图像无法渲染

时间:2014-03-12 00:40:15

标签: java graphics2d

我最近开始学习Java并且正在尝试制作基本游戏。为了渲染地图,我配置了两个布尔数组(arr_mapx,arr_mapy),然后使用两个for循环和两个if语句检查它们,以确定两者是否都为真。如果两者都为真,则图像应该渲染,但事实并非如此。我已成功在循环外渲染图像,因此对图像变量或文件没有问题。

public void paint(Graphics g)
{
    Graphics2D g2 = (Graphics2D)g;
    g2.drawImage(img_player1, int_player1_x, int_player1_y, this);
    if (map_drawn == false)
    {
        map_drawn = true;
        for(int int_x = 0; int_x < 20; int_x ++)
        {
            if(arr_mapx[int_x] == true)
            {
                for(int int_y = 0; int_y < 20; int_y ++)
                {
                    if(arr_mapy[int_y] == true)
                    {
                        g2.drawImage(img_obstacle, (int_x + 1)*32, (int_y + 1)*32, this);
                        //Appears to do nothing
                        showStatus("It Works!" + int_x + int_y +map_drawn);
                        //Draws fine, with correct variables
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我重构了代码以减少嵌套。 (请参阅下面的代码块。警告:只使用文本编辑器,所以不要指望无错误的代码。)首先突然出现的是map_drawn永远不会设置为false。它绘制一次并设置为true,并在随后的条目中输入您在循环中绘制任何内容之前退出的函数,因为map_drawn的值从未在任何地方更改为false

很难说它应该改变的地方,因为我们只看到你游戏的一小部分。另一个函数中是否有逻辑来设置map_drawn的值?

顺便说一句,要小心你在油漆处理程序中做了什么(这就是你在这里工作的)。由于函数的行为,像这样的自定义动画很难调试。例如,如果您使用调试器停在其中然后运行paint函数将立即再次启动,因为显示需要更新。我不知道showStatus做了什么,但它不应该是一个对话框。它应该记录到控制台或其他地方。你绝对不希望用户与从paint中启动的UI进行交互!

祝你好运!

public void paint(Graphics g)
{
    Graphics2D g2 = (Graphics2D)g;
    g2.drawImage(img_player1, int_player1_x, int_player1_y, this);

    if (map_drawn) return;

    map_drawn = true;

    for(int int_x = 0; int_x < 20; int_x ++)
    {
        if(!arr_mapx[int_x]) continue;

        for(int int_y = 0; int_y < 20; int_y ++)
        {
            if(!arr_mapy[int_y]) break;

            g2.drawImage(img_obstacle, (int_x + 1)*32, (int_y + 1)*32, this);
            //Appears to do nothing
            showStatus("It Works!" + int_x + int_y +map_drawn);
            //Draws fine, with correct variables
        }            
    }
}