我知道我可以使用PolygonRegion
来做这件事,但问题是我使用scene2d.Stage
和几个演员。您可能知道阶段使用SpriteBatch
而我无法渲染PolygonRegion(方法batch.draw(polygonRegion)不存在)。
我想要的结果:
当我输入我的Actor的绘图方法时,这段代码:
polygonSpriteBatch.begin();
polygonSpriteBatch.draw(polygonRegion, getX(), getY(), getWidth(), getHeight());
polygonSpriteBatch.end();
我得到这样的东西:
答案 0 :(得分:3)
据我所知,您应该在Stage
PolygonSpriteBatch
调用的顶部使用draw(..)
,我的意思是将PolygonSpriteBatch
用于2D地形。
如果您所需的Actor/Image
是矩形大小,那么您可以包裹纹理:
Texture texture=new Texture("tex1.png");
texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
textureRegion=new TextureRegion(texture,300,300);
创建PolygonSpriteBatch
对象并传入Stage的构造函数。
stage=new Stage(new ScalingViewport(Scaling.stretch, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), new OrthographicCamera()),new PolygonSpriteBatch());
为了更具凝聚力,您可以通过继承创建自己的舞台。
然后创建Actor
类来处理/绘制特定纹理图像的PolygonRegion
。
public class PolyActor extends Actor {
PolygonRegion polygonRegion;
public PolyActor(PolygonRegion region){
this.polygonRegion=region;
}
@Override
public void draw(Batch batch, float parentAlpha) {
Color color = getColor();
batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
((PolygonSpriteBatch)batch).draw(polygonRegion,getX(),getY());
}
}
创建PolyActor
并添加到舞台,下面是我的测试代码和输出:
float a = 100;
float b = 100;
PolygonRegion polygonRegion=new PolygonRegion(textureRegion,new float[] {
a*0, b*0,
a*0, b*2,
a*1, b*2,
a*1.5f, b*1.5f,
a*3, b*1.5f,
a*3.5f, b*1,
a*4, b*1,
a*4.5f, b*1.5f,
a*5f, b*1.5f,
a*5f, b*0f},new short[] {
0, 1, 2,1,2,3,0,2,3,0,3,4,0,4,5,0,5,6,0,6,9,6,7,9,7,8,9
});
PolyActor polyActor =new PolyActor(polygonRegion);
polyActor.setPosition(75,0);
stage.addActor(polyActor);
我使用的纹理:
我的预期输出:
修改强>
Texture
只不过是GPU内存中的2D字节数组。这个2D数组有大小,这些字节通常被解释为颜色。字节数据的缩放不会产生场景,但你几乎可以按照你想要的方式使用这些数据。
您可以通过Pixmap
创建自己的缩放纹理:
Pixmap originalPix = new Pixmap(Gdx.files.internal("badlogic.jpg")); // 256 * 256
Pixmap scaledPix = new Pixmap(700, 700, originalPix.getFormat());
scaledPix.drawPixmap(originalPix, 0, 0, originalPix.getWidth(), originalPix.getHeight(), 0, 0, scaledPix.getWidth(), scaledPix.getHeight());
Texture texture = new Texture(scaledPix); // 400 * 400
originalPix.dispose();
scaledPix.dispose();