【问题标题】:Attach sprite to Bullet - Box2D LibGDX kotlin将精灵附加到子弹 - Box2D LibGDX kotlin
【发布时间】:2020-11-19 17:25:46
【问题描述】:

我正在学习一些教程以实现抛物线运动。在调试中一切正常,抛物线运动正确响应并且结果正常。现在我想插入一个 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)
    }
}

【问题讨论】:

    标签: android-studio kotlin libgdx box2d


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。你能给我一个一般的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多