java - LibGdx PolygonSpriteBatch 未绘制所有多边形

标签 java libgdx

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

Game screenshot

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

请注意,我正在使用 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();
}

我添加了一条调试行来打印各个多边形(陆地部分)的屏幕坐标,并且一次 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 source , png imagewhole project在 zip 文件中。

有人知道为什么我在屏幕上出现条纹效果吗?

最佳答案

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

我建议你将顶点坐标修改为长度。

我遇到了完全相同的问题,这是 Google 上的唯一结果。我想我应该分享我的解决方案。

编辑:

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

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 中减去两者来找到距原点的距离。对于我的其余坐标,依此类推。

关于java - LibGdx PolygonSpriteBatch 未绘制所有多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143140/

相关文章:

c# - 关于java实用类命名的思考

java - 在 android 中使用 Google map api v2 显示我的轨迹

java - last.fm java API 获取数据范围内用户的最近轨迹

libgdx - 纹理打包器不会运行

java - libgdx: Sprite 像玻璃一样 splinter

java - 如何将 2 个 HashMap 合并在一起?

java - 我们应该在 Web 应用程序注销时将 session 变量重置为 null 吗?

java - 关闭背景图像触摸 libgdx 上的对话框

java - LibGDX 创建项目失败

java - LibGDX Box2d 将主体与对象相关联