【问题标题】:LibGDX drawing circles scales somehowLibGDX 绘图圆圈以某种方式缩放
【发布时间】:2015-05-17 12:43:39
【问题描述】:

我尝试使用带有 LibGDX 的 Java 纹理绘制 2 个圆圈。 我的类非常简单,GameObject 有一个圆(用于逻辑)和一个绘制方法。

这是我的绘制方法:

@Override
public void draw(Batch batch, float alpha){
    batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.x+circle.radius, circle.y+circle.radius);
}

这是我执行的代码:

GameObject go = new GameObjectBuilder().createNew()
                .withPosition(32, 32)
                .withRadius(32)
                .withTexture(new Texture(Gdx.files.internal("ball.png")))
                .withId(0)
                .build();

GameObject go2 = new GameObjectBuilder().createNew()
            .withPosition(64, 64)
            .withRadius(32)
            .withTexture(new Texture(Gdx.files.internal("ball.png")))
            .withId(1)
            .build();

stage.addActor(go);
stage.addActor(go2);

结果如下:

以某种方式使用相同大小的圆圈,当远离原点放置时会缩放它们。目前我的主类扩展了 ApplicationAdapter 就是这样。

这是我在构建器中进行的调用堆栈。

circle.setPosition(x, y); // LibGDX.Circle class call
circle.setRadius(radius); // LibGDX.Circle class call
sprite = new Sprite(texture);

使用 ShapeRenderer,调用相同的对象并绘制一个实心圆会产生以下结果:

shapeRenderer.setColor(Color.BLACK);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);

for(GameObject goo : objects.values()) {
    shapeRenderer.circle(goo.getX(), goo.getY(), goo.getRadius());
}

shapeRenderer.end();

最终编辑:

batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.radius*2, circle.radius*2);

成功了!

【问题讨论】:

  • 您是否尝试将宽度和高度的值硬编码到您的batch.draw() 调用中?这是否给出了预期的行为?
  • 我应该补充一点,迈克尔霍布斯的回答应该可以解决问题,这就是您的问题所在

标签: java libgdx image-scaling


【解决方案1】:

自从我使用 libGDX 以来已经有一段时间了,我可以说有些事情发生了变化。不过……

void draw(TextureRegion region,
      float x,
      float y,
      float width,
      float height)

绘制一个左下角为 x,y 的矩形,并拉伸该区域以覆盖给定的宽度和高度。

Batch.draw 从 x,y 到 x + width, y + height 绘制一个矩形。您所做的是根据对象内部位置缩放形状。

@Override
public void draw(Batch batch, float alpha){
    batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.x+circle.radius, circle.y+circle.radius);
}

对于第 1 圈,我们有 batch.draw(精灵, 32-32, 32-32, 32+32, 32+32); 这会将精灵从 0,0 绘制到 64,64

对于第 2 圈,我们有 batch.draw(精灵, 64-32, 64-32, 64+64, 64+64); 这会将精灵从 32,32 绘制到 128,128

这应该可以修复您的代码:

@Override
public void draw(Batch batch, float alpha){
    batch.draw(sprite, circle.x, circle.y, circle.radius, circle.radius);
}

这将根据圆的半径缩放对象。

参考:http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/Batch.html#draw-com.badlogic.gdx.graphics.Texture-float-float-float-float-

【讨论】:

  • 我用对 GameObject 的实际调用更新了问题。我只使用 Circles setPosition 和 setRadius。
  • 试过了,它只绘制了未缩放的巨大圆圈...这是结果:i.imgur.com/RfBKC23.png
  • 我在 libGDX 项目中帮助我调试 sprite 的其中一件事是添加一段代码,显示 sprite 的来源。公共无效drawAnchorPoints(ShapeRenderer sr){sr.setAutoShapeType(真); sr.setColor(Color.RED); sr.开始(); for (Entry vec : anchorPoints.entrySet()) { Vector2 temp = vec.getValue().cpy().add(getPosition();); sr.line(temp.x - 2, temp.y, temp.x + 2, temp.y); sr.line(temp.x, temp.y - 2, temp.x, temp.y + 2); } sr.end(); }
  • 好的,我现在记住了问题所在。让我看看我的项目是如何解决这个问题的。精灵是根据原始纹理大小绘制的,这就是你得到大球的原因。
  • 看看我的旧项目,我相信问题在于您没有设置精灵的宽度和高度。 Sprite.spriteWidth 和 Sprite.spriteHeight。没有这些设置,纹理将以其原始大小绘制。
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 2021-12-22
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多