Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx SpriteBatch.draw()指定4个顶点_Java_Opengl_Sprite_Draw_Libgdx - Fatal编程技术网

Java Libgdx SpriteBatch.draw()指定4个顶点

Java Libgdx SpriteBatch.draw()指定4个顶点,java,opengl,sprite,draw,libgdx,Java,Opengl,Sprite,Draw,Libgdx,我正在使用libGdx创建一个2d游戏,并尝试使用这个特殊的方法来绘制一个简单的2d纹理,单独指定4个顶点 draw(Texture texture, float[] spriteVertices, int offset, int length) 说明:使用给定顶点绘制矩形。必须有4个顶点,每个顶点按以下顺序由5个元素组成:x、y、颜色、u、v 其他的画法很好用,但我不能用这个。我尝试的是这个 batch.draw(boxTexture, new float[] {-5, -5, 0, Col

我正在使用libGdx创建一个2d游戏,并尝试使用这个特殊的方法来绘制一个简单的2d纹理,单独指定4个顶点

draw(Texture texture, float[] spriteVertices, int offset, int length)
说明:使用给定顶点绘制矩形。必须有4个顶点,每个顶点按以下顺序由5个元素组成:x、y、颜色、u、v

其他的画法很好用,但我不能用这个。我尝试的是这个

batch.draw(boxTexture, new float[] {-5, -5, 0, Color.toFloatBits(255, 0, 0, 255), 0, 0, 
                5, -5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 0, 
                5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 1, 
                -5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 0, 1}, 3, 3);
我不太熟悉OpenGL的工作原理,特别是偏移量和长度应该是多少。有谁更了解这项工作吗

更新:

它使用网格工作,但后来发现没有透明度,这很烦人。最后,我只是在SpriteBatch中添加了一个自定义方法,因为它更容易让我动脑。顶点是顺时针绘制的

public void drawQuad (Texture texture, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float col) {
        if (!drawing) throw new IllegalStateException("SpriteBatch.begin must be called before draw.");

        if (texture != lastTexture) {
            switchTexture(texture);
        } else if (idx == vertices.length) //
            renderMesh();

        final float u = 0;
        final float v = 1;
        final float u2 = 1;
        final float v2 = 0;

        vertices[idx++] = x1;
        vertices[idx++] = y1;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v;

        vertices[idx++] = x2;
        vertices[idx++] = y2;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v2;

        vertices[idx++] = x3;
        vertices[idx++] = y3;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v2;

        vertices[idx++] = x4;
        vertices[idx++] = y4;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v;
    }

偏移量和长度用于获取
精灵顶点的切片。在您的例子中,它们应该是
0
和数组
.length
(将顶点放在局部变量中以计算长度)

另外,我不确定它是否需要,但我强烈怀疑应该以三角形友好的方式传递顶点。您当前正在执行逆时针枚举。通常,对于四边形,您应该使用如下的Z模式:

3-4
 \
1-2  
4-3

1-2

(这是因为OpenGL获取列表中的每组3个顶点并渲染生成的三角形,因此顶点1、2、3和2、3、4都应该是有用的三角形。)

偏移量是数组中开始的位置(对于您来说为0),长度是数组需要经过的索引数。对于您的情况:4个点,每个点有5条数据:4*5=20

Draw从未开始渲染过程,因为值3浮动不足以生成三角形(最小值为15)

至于p.T.的答案,这个特殊的函数做扇形渲染,所以正确的顺序是顺时针或逆时针

此外: 你将这些点和纹理放在其中的顺序将使纹理倒置(我不知道这是否是有意的)

这是错误的,需要这样:

3-4
 \
1-2  
4-3

1-2

谢谢,但还是不走运。我是通过绘制网格来实现的,所以我会朝这个方向去做。我注意到你的浮点数组每个顶点应该有5个元素,但是在你的例子中你指定了6个元素-x,y,?未知?,颜色,u,v-也许这就是为什么这对你不起作用的原因?另外,不确定为什么将偏移量/长度指定为3,3-是否应该使用0,floatarray.length?(我意识到这是一个古老的问题,但对我来说,这是谷歌搜索结果中最重要的一个。)