我在这里与所谓的幽灵碰撞战斗,在一个简单的基于图 block 的 map 上,以圆圈作为玩家角色。
当对圆圈施加脉冲时,它首先开始正确弹跳,然后迟早会弹错(错误的角度)。
在互联网上查找时,我读到了 Box2D 中的一个问题(我使用 iOS Swift 和 Box2d Swift 端口)。
使用 b2ChainShape 没有帮助,但看起来我误解了它。我还需要使用“prevVertex”和“nextVertex”属性来设置幻影顶点。
但我很困惑。我有一张由盒子(简单的正方形)组成的简单 map ,所有盒子彼此相邻放置,形成一个封闭的房间。在我的圈子里,我看到这个问题就产生了冲动。
现在为了解决这个问题,我在 View 上放置的每个正方形/盒子的幽灵顶点应该放在哪里?我是否需要将任何顶点放置在 chainShape 的最后一个和第一个顶点附近,或者它是否需要成为当前框的下一个顶点之一?我不明白。 Box2D的手册没有解释这些幽灵顶点坐标从何而来。
下面您可以看到描述问题的图像。
一些显示墙壁和圆的物理部分的代码:
首先是墙壁部分:
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)
最佳答案
不确定我是否知道在每个图 block 可能具有不同物理特性的情况下有一个简单的解决方案。
如果您的墙壁都是水平和/或垂直的,您可以编写一个类来获取一排盒子,创建单个边缘或矩形主体,然后在碰撞时计算哪个盒子(一个简单的 a < x < b 测试)应该与碰撞对象交互,并适本地应用物理,手动调用 OnCollision 方法,否则您将指定为每个单独框的回调。
关于ios - Box2D:如何使用 b2ChainShape 制作带有正方形的基于图 block 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38979844/