LibGdx PolygonSpriteBatch未绘制所有多边形

时间:2015-05-09 17:42:50

标签: java libgdx

我正在尝试使用libGdx中的PolygonSpriteBatch渲染一个简单的2D景观轮廓,以在屏幕上绘制填充的多边形。我不知道为什么,但代码似乎只是呈现每隔一个多边形,导致屏幕上出现条纹图案(参见下面的屏幕截图 - 背景为红色,景观为绿色)。

Game screenshot

我用来绘制风景的代码如下所示。这将遍历World坐标中的一组相邻点(使用landarray.getOnScreen()检索),计算屏幕坐标,为每个段创建PolygonRegion并绘制它们。我使用的纹理只是一个100x100像素的纯白色方块。我没有使用任何相机或视图,只是将世界坐标转换为屏幕坐标并直接绘制到图形屏幕。

请注意,我正在从使用Slick2D的工作版本重写此游戏(因此在此阶段不使用相机),并且下面的代码或多或少没有变化(除了翻转y轴高度计算)工作版,绘制连续的景观。

public void drawPoly() {
    System.out.println("Mountains - drawShape()");
    // Calculate screen bottom-edge Y taking into account values = bHEIGHT
    int scrBtmY = scrTopY - Gdx.graphics.getHeight();
    if (FastMath.abs(scrBtmY) == bHEIGHT) {         // Wrap-around bug at y == bHEIGHT
        scrBtmY = 0;
    }

    // Draw the land masses on-screen that are in the results list
    polyBatch.begin();
    polyBatch.setColor(landColour);
    ArrayList<Landmass> masses = landarray.getOnScreen(scrLeftX, scrTopY, scrBtmY);
    for (Landmass lm : masses) {
        /* Calculate the on-screen start and end x and y values taking into account
           wrapping in 'buffer space'
           Wrap around - low negative numbers (> -25) are 'just off screen' start or
           end points, large ones are wrap-around points
         */
        int sx = (int) lm.start.x - scrLeftX;
        if (sx < -Settings.Physics.LANDSITEWIDTH) {
            sx = sx + bWIDTH;
        }

        int sy = (int) lm.start.y - scrBtmY;

        int ex = (int) lm.end.x - scrLeftX;
        if (ex < -Settings.Physics.LANDSITEWIDTH) {     // Wrap around
            ex = ex + bWIDTH;          
        }

        int ey = (int) lm.end.y - scrBtmY;
        ex = ex - 1;        // In case over-lapping regions is causing stripes

        System.out.format("start (%d, %d)\t end (%d, %d)%n", sx, sy, ex, ey);

        // Construct and draw the polygon
        float[] vertices = new float[8];
        vertices[0] = sx;
        vertices[1] = 0;
        vertices[2] = ex;
        vertices[3] = 0;
        vertices[4] = ex;
        vertices[5] = ey;
        vertices[6] = sx;
        vertices[7] = sy;
        short[] triangles = new short[] {0, 1, 2, 0, 2, 3};
        PolygonRegion polyReg = new PolygonRegion(new TextureRegion(textureSolid), vertices, triangles);
        polyBatch.draw(polyReg, sx, 0);
    }
    polyBatch.end();
}

我已经包含了一个调试行来打印出各个多边形(landmass段)的屏幕坐标,并且下面显示了一个drawPoly()迭代的输出。这显示了应在屏幕上绘制的每个段的起始(x,y)和结束(x,y)坐标。从输出中,绘制的多边形看起来彼此相邻,因此它们之间不应有间隙。

Mountains - drawShape()
start (53, 265)  end (77, 358)
start (78, 358)  end (102, 376)
start (103, 376)     end (127, 406)
start (128, 406)     end (152, 371)
start (153, 371)     end (177, 429)
start (178, 429)     end (202, 447)
start (203, 447)     end (227, 433)
start (228, 433)     end (252, 415)
start (253, 415)     end (277, 478)
start (278, 478)     end (302, 490)
start (303, 490)     end (327, 524)
start (328, 524)     end (352, 519)
start (353, 519)     end (377, 551)
start (378, 551)     end (402, 556)
start (403, 556)     end (427, 543)
start (428, 543)     end (452, 470)
start (453, 470)     end (477, 505)
start (478, 505)     end (502, 482)
start (503, 482)     end (527, 513)
start (528, 513)     end (552, 476)
start (553, 476)     end (577, 479)
start (578, 479)     end (602, 460)
start (603, 460)     end (627, 475)
start (628, 475)     end (652, 426)
start (653, 426)     end (677, 453)
start (-22, 449)     end (2, 406)
start (3, 406)   end (27, 357)
start (28, 357)  end (52, 265)

我搜索了这个网站上的一系列帖子,这些帖子帮助我获取了上面的代码,但没有看到任何有关此特定问题的帖子。

注意我只将其作为桌面版运行,并为此目的启用了Java 8。使用libGdx 1.5.6和1.6.0进行测试,结果相同。

我已经制作了一个独立版本的代码来复制问题,以防有人想在家里尝试这个。这使用libGdx 1.6.0和(我假设)Java 6并显示如上所述的问题(至少在我的PC上)。可以在此处找到这些文件:java sourcepng imagewhole project在zip文件中。

有谁知道为什么我在屏幕上获得条纹效果?

2 个答案:

答案 0 :(得分:1)

PolygonRegion顶点坐标应该是相对于多边形的TextureRegion原点的偏移量,并且不应该是绝对的屏幕坐标,这就是我从输出中做出的认为(因为你'用未修改的坐标重新创建顶点。)

我建议你修改你的顶点坐标变成长度。

我有同样的问题,这是谷歌的唯一结果。我以为我会分享我的解决方案。

编辑:

为了清晰起见,这是我自己的解决方案。

vertices = new float[] { 0, 0,
                        lTX-lBX, lTY-lBY,
                        rTX-lBX, rTY-lBY,
                        rBX-lBX, rBY-lBY};

除了我可怕的命名方案之外,上面定义了一个根据UV坐标的四边形多边形。 lBX(左基x)和lBY(左基y)是我的多边形在屏幕坐标中的起始位置。它们直接位于TextureRegion的原点上,因此偏移0,0。 lTX(左上角x)和lTY(左上角y)是下一个位置。再次,我通过从lBX和lBY中减去两个来找到距离原点的距离。等等我的其余坐标等等。

答案 1 :(得分:0)

正如所承诺的,这是我使用PolygonSpriteBatch的工作测试程序:

double*