在这里,我在一张简单的基于图块的地图上以所谓的幻影冲突进行了战斗,该地图以圆圈为玩家角色。

在圆上施加脉冲时,它首先会开始正确地反弹,然后或早或晚会反弹错误(角度错误)。

在互联网上查找时,我读到有关Box2D的问题(我将iOS Swift与Box2d端口一起用于Swift)。

使用b2ChainShape没有帮助,但看起来我误会了它。我还需要使用“ prevVertex”和“ nextVertex”属性来设置幻影顶点。

但是我很困惑。我有一个由盒子组成的简单地图(简单的正方形),所有盒子彼此相邻放置,形成一个封闭的房间。在它的圈子里,我冲动地看到了这个问题。

现在,在哪里为我放置在视图上的每个正方形/框放置那些幻影顶点,以解决此问题?我是否需要将任何一个顶点放置在chainShape的最后一个顶点和第一个顶点附近,还是需要成为当前框的下一个框的顶点之一?我不明白。 Box2D的手册未解释这些重影顶点坐标来自何处。

您可以在下面看到描述问题的图像。

ios - Box2D:如何将b2ChainShape用于具有正方形的基于图块的 map-LMLPHP

一些代码显示了墙和圆的物理部分:

首先是墙部分:

let bodyDef = b2BodyDef()
bodyDef.position = self.ptm_vec(node.position+self.offset)
let w = self.ptm(Constants.Config.wallsize)
let square = b2ChainShape()
var chains = [b2Vec2]()
chains.append(b2Vec2(-w/2,-w/2))
chains.append(b2Vec2(-w/2,w/2))
chains.append(b2Vec2(w/2,w/2))
chains.append(b2Vec2(w/2,-w/2))
square.createLoop(vertices: chains)

let fixtureDef = b2FixtureDef()
fixtureDef.shape = square
fixtureDef.filter.categoryBits = Constants.Config.PhysicsCategory.Wall
fixtureDef.filter.maskBits = Constants.Config.PhysicsCategory.Player

let wallBody = self.world.createBody(bodyDef)
wallBody.createFixture(fixtureDef)


圆圈部分:

let bodyDef = b2BodyDef()
bodyDef.type = b2BodyType.dynamicBody
bodyDef.position = self.ptm_vec(node.position+self.offset)

let circle = b2CircleShape()
circle.radius = self.ptm(Constants.Config.playersize)
let fixtureDef = b2FixtureDef()
fixtureDef.shape = circle
fixtureDef.density = 0.3
fixtureDef.friction = 0
fixtureDef.restitution = 1.0
fixtureDef.filter.categoryBits = Constants.Config.PhysicsCategory.Player
fixtureDef.filter.maskBits = Constants.Config.PhysicsCategory.Wall

let ballBody = self.world.createBody(bodyDef)
ballBody.linearDamping = 0
ballBody.angularDamping = 0
ballBody.createFixture(fixtureDef)

最佳答案

如果每个图块可能具有不同的物理特性,我不确定我是否知道一个简单的解决方案。

如果您的墙壁都是水平和/或垂直的,则可以编写一个类来容纳一排盒子,创建一个单边或矩形主体,然后在碰撞时计算应该相互作用的盒子(简单的a

10-07 19:54
查看更多