【问题标题】:libgdx spritebatch not drawing based on a texture's Originlibgdx spritebatch 不基于纹理的原点绘制
【发布时间】:2014-05-10 19:27:47
【问题描述】:

我在这里绘制一组精灵,缩小时使用较小的 (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) 上使用静态图像。

变量 spriteWidthspriteHeight164 处都是正确的,具体取决于放大还是缩小。

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

我原以为如果设置了上述原点,它会根据该原点绘制精灵(作为从左下角的偏移量)

我在batch.draw() 中的电话是否正确?

非常感谢, J

【问题讨论】:

    标签: java android textures libgdx sprite


    【解决方案1】:

    不,这是不正确的。 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() 方法中设置旋转,它将围绕原点(在您的情况下为中间)旋转。

    【讨论】:

    • 完美谢谢;工作一种享受。跑题了,您是否知道在这两个纹理交换之间进行平滑过渡的好/标准方法,而不是简单的一个或另一个?
    • 我认为这种改变没有必要。好吧,在您的情况下,可能是Animation 的原因,只有在您放大后才会播放,否则它不会可见。但即使在这里,我也不确定是否有必要,我认为不会有很大的性能提升。我会尝试使用TextureFilters。他们描述了如何计算像素的颜色,如果 1 Texel(纹理的像素)不是屏幕上的一个像素。有两种情况:缩小:1 Texel 小于 1 像素(如果缩小)和 Manification:1 Texel 大于 1 像素(放大)。但那是另一回事。
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2014-10-28
    • 2019-10-17
    • 1970-01-01
    • 2011-11-24
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多