将精灵附加到 Bullet - Box2D LibGDX kotlin

Attach sprite to Bullet - Box2D LibGDX kotlin

我正在学习一些教程以实现抛物线运动。在调试中一切正常,抛物线运动正确响应并且结果有效。现在我想插入一个 Sprite,我的问题就从这里开始。事实上,精灵完美地执行了执行抛物线运动的对象的旋转,但它绝对不遵循 X 和 Y 坐标。提前致谢:

项目符号函数:

private fun createBullet() {
    val circleShape = CircleShape()
    circleShape.radius = 0.5f
    circleShape.position = Vector2(convertUnitsToMeters(firingPosition.x), convertUnitsToMeters(firingPosition.y))
    val bd = BodyDef()
    bd.type = BodyDef.BodyType.DynamicBody
    bullet = world!!.createBody(bd)
    bullet!!.createFixture(circleShape, 1f)
    circleShape.dispose()
    val velX = abs(MAX_STRENGTH * -MathUtils.cos(angle) * (distance / 100f))
    val velY = abs(MAX_STRENGTH * -MathUtils.sin(angle) * (distance / 100f))
    bullet!!.setLinearVelocity(velX, velY)
}

我是如何尝试创建精灵的:

override fun render(delta: Float) {
    sprite.setPosition(bullet!!.position.x - sprite.width / 2,
            bullet!!.position.y - sprite.height / 2)
    sprite.rotation = Math.toDegrees(bullet!!.angle.toDouble()).toFloat()

    batch!!.use {
        it.draw(sprite, sprite.x, sprite.y, sprite.originX,
                sprite.originY,
                sprite.width, sprite.height, sprite.scaleX, sprite.scaleY, sprite.rotation)
    }
}

这是使用 Sprite 的不正确方法 class。 libGDX 中有一个不幸的设计决定,即 Sprite 是 TextureRegion 的子 class,这允许您将它传递给 SpriteBatch.draw(),就像它是 TextureRegion 一样。当您这样做时,它会忽略 Sprite 上的所有设置。

如果您使用 Sprite class,则必须使用 Sprite.draw() 而不是 SpriteBatch.draw()

在我看来,您根本不应该使用 Sprite class。您应该编写自己的游戏 object class,它具有您需要的确切参数,并且可能保留对 TextureRegion 的引用。然后当你使用 SpriteBatch.draw 绘制它时,你传递了所有与位置、旋转等相关的数据。然后你就不必同步地保持 box2d body 数据的冗余副本。