[英]libgdx spritebatch not drawing based on a texture's Origin
我在這里繪制一組精靈,在縮小時使用較小的(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);
您可以看到我使用AssetsManager在放大版本(16x16)上使用動畫,在縮小版本(4x4)上使用靜態圖像。
spriteWidth
, spriteHeight
變量在16或4都是正確的,具體取決於放大還是縮小。
變量spriteOriginX
和spriteOriginY
在8和2都是正確的(我假設),具體取決於放大還是縮小。
我會想到如上設置的原點,它將根據該原點繪制精靈(作為左下角的偏移)
我在batch.draw()
中的調用是否正確?
非常感謝,J
不,這不對。 draw()
總是使用左下角作為位置。 原點僅用於縮放和旋轉。
所以對你而言,這意味着你必須從你的位置中減去原點:
batch.draw(sprite.getTexture(), this.x - spriteOriginX, this.y - spriteOriginY,
spriteOriginX, spriteOriginY, spriteWidth, spriteHeight, 1.0f, 1.0f,
this.directionFaced, sprite.getRegionX(), sprite.getRegionY(),
sprite.getRegionWidth(), sprite.getRegionHeight(), false, false
);
通過這樣做,您只需將左下角(即位置)向左下方“推”半寬半高,以便您的位置真正定義精靈的中心。
再次:原點僅用於旋轉和縮放。 如果在draw()
方法中設置旋轉,它將圍繞原點旋轉(在您的情況下為中間)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.