java libgdx spritebatch不基于纹理的原点绘制
我在这里画了一组精灵,缩小时使用较小的(4x4)纹理,放大时使用较大的(16x16)纹理。当缩放级别达到阈值时,将进行交换
但是,要使其平滑过渡,需要绘制精灵(位于[x,y]),其原点为精灵的中心。目前,它们是基于其左下角绘制的。因此,当纹理交换发生时,精灵会稍微跳跃,因为原点不匹配
我已经创建了一些变量来调试并确保它们是正确的
TextureRegion sprite = null;
boolean useHighResTexture = (_gameRef.cameraZoom < CAMERA_ZOOM_SWITCH_LO_RES);
if (useHighResTexture) {
//Zoomed in, Hi res, Use animation
sprite = animation.getKeyFrame(animationStateTime, true);
} else {
//Zoomed out, lo-res, Use static image
sprite = Assets.instance.getSmall();
}
float spriteWidth = sprite.getRegionWidth();
float spriteHeight = sprite.getRegionHeight();
float spriteOriginX = spriteWidth/2;
float spriteOriginY = spriteHeight/2;
//Draw(TEXTURE, x, y, originx, originy,
// width, height, scaleX, scaleY, rotation,
// srcX, srcY,
// srcWidth, srcHeight, boolflipX, boolflipY
//this.setCenter(spriteOriginX, spriteOriginY);
batch.draw(sprite.getTexture(), this.x, this.y, spriteOriginX, spriteOriginY,
spriteWidth, spriteHeight, 1.0f, 1.0f, this.directionFaced,
sprite.getRegionX(), sprite.getRegionY(),
sprite.getRegionWidth(), sprite.getRegionHeight(), false, false);
您可以看到,我使用AssetManager在放大版本(16x16)上使用动画,在缩小版本(4x4)上使用静态图像
变量spriteWidth
、spriteHeight
在16或4上都是正确的,这取决于放大还是缩小
变量spriteOriginX
和spriteOriginY
在8和2上都是正确的(我假设),这取决于放大还是缩小
我原以为,如果将原点设置为如上所示,它将基于该原点绘制精灵(作为从左下角的偏移)
我在batch.draw()
中的呼叫正确吗
非常感谢,, J
# 1 楼答案
不,这是不对的。
draw()
始终使用左下角作为位置。原点仅用于缩放和旋转对你来说,这意味着你必须从你的位置减去原点:
通过这样做,您只需将左下角(即位置)向左和向下“推”半宽半高,以便您的位置真正定义精灵的中心
同样:原点仅用于旋转和缩放。如果在
draw()
方法中设置旋转,它将围绕原点旋转(在您的例子中是中间)