java - libgdx spritebatch 不基于纹理的原点绘制

标签 java android textures libgdx sprite

我在这里绘制了一组 Sprite ,在缩小时使用较小的 (4x4) 纹理,在放大时使用较大的 (16x16) 纹理。当缩放级别达到阈值时,就会发生交换。

然而,为了实现平滑过渡, Sprite (位于 [x,y] 处)需要以 Sprite 的中心为原点绘制。目前他们是根据他们的左下角绘制的。因此,当发生纹理交换时, Sprite 会轻微跳跃,因为原点不匹配。

我已经创建了一些变量来调试并确保它们是正确的。

    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) 上使用静态图像。

变量 spriteWidthspriteHeight164 时都是正确的,具体取决于是放大还是放大出。

变量 spriteOriginXspriteOriginY82 上都是正确的(我假设),这取决于是否放大或缩小。

我本以为原点设置如上,它会根据原点绘制 Sprite (作为从左下角的偏移量)

我在 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
);

通过这样做,您只需将左下角(即位置)向左和向下“推”一半宽度和一半高度,这样您的位置就真正定义了 Sprite 的中心。

同样:原点仅用于旋转和缩放。如果您在 draw() 方法中设置旋转,它将围绕原点旋转(在您的例子中是中间)。

关于java - libgdx spritebatch 不基于纹理的原点绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22761894/

相关文章:

java - 字符类减法

android - 如何防止传入的短信到达收件箱?

android - 有没有一种方法可以知道我应该向用户请求哪些所有权限,以便 google play 接受我的应用程序?

iphone - opengl es 纹理顶部的 32 像素间隙

ios - 在 SceneKit 中使用 MPMoviePlayerController 作为纹理

java - 仅显示最近添加的对象的数组列表

java - 按总排名获取排名

java - Spring Boot多部分文件上传集成测试-空文件

java - 如何在Android中将波斯日期转换为公历日期

opengl - 如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?