将精灵附加到 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 数据的冗余副本。
我正在学习一些教程以实现抛物线运动。在调试中一切正常,抛物线运动正确响应并且结果有效。现在我想插入一个 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 数据的冗余副本。