Bar*_*ley 21 sprite-kit skphysicsbody swift
据我所知,物理体的默认值是当它们相互碰撞时相互反弹,直到你将collisionBitMask设置为相等的数字.
但是,我有一个很大的问题,因为碰撞我认为看起来应该非常简单.
let RedBallCategory : UInt32 = 0x1 << 1
let GreenBallCategory: UInt32 = 0x1 << 2
let RedBarCategory : UInt32 = 0x1 << 3
let GreenBarCategory : UInt32 = 0x1 << 4
let WallCategory : UInt32 = 0x1 << 5
greenBall.physicsBody?.categoryBitMask = GreenBallCategory
greenBall.physicsBody?.contactTestBitMask = RedBarCategory
greenBall.physicsBody?.collisionBitMask = GreenHealthCategory
redBall.physicsBody?.categoryBitMask = RedBallCategory
redBall.physicsBody?.contactTestBitMask = GreenBarCategory
redBall.physicsBody?.collisionBitMask = RedHealthCategory
let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody = borderBody
self.physicsBody?.friction = 0
borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory
borderBody.categoryBitMask = WallCategory
Run Code Online (Sandbox Code Playgroud)
所以这里我有2个球和我的边界.我可以得到我想要的碰撞检测,但是当我添加边框体的类别位掩码时,它允许球穿过和离开屏幕,这是我不想要的.
我也希望球能够相互反弹,但只有当我注意到球的类别之一时,他们才能反弹.否则他们会互相通过.
这对我来说完全没有意义,因为每个项目都有不同的碰撞比特.我也有时将所有数字设置为5将允许所有数据相互通过,但是将其全部设置为6将允许所有内容相互碰撞.
碰撞位掩码究竟是如何工作的,是否有适当的方法来管理大量的交叉碰撞规则?
Whi*_*ind 50
您无法获得所需的行为,因为您没有正确设置类别,接触和碰撞位掩码.以下是如何将其设置为工作的示例:
greenBall.physicsBody?.categoryBitMask = GreenBallCategory //Category is GreenBall
greenBall.physicsBody?.contactTestBitMask = RedBarCategory | WallCategory //Contact will be detected when GreenBall make a contact with RedBar or a Wall (assuming that redBar's masks are already properly set)
greenBall.physicsBody?.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory //Collision will occur when GreenBall hits GreenBall, RedBall or hits a Wall
redBall.physicsBody?.categoryBitMask = RedBallCategory //Category is RedBall
redBall.physicsBody?.contactTestBitMask = GreenBarCategory | GreenBallCategory | WallCategory //Contact will be detected when RedBall make a contact with GreenBar , GreenBall or a Wall
redBall.physicsBody?.collisionBitMask = RedBallCategory | GreenBallCategory | WallCategory //Collision will occur when RedBall meets RedBall, GreenBall or hits a Wall
let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody = borderBody
self.physicsBody?.friction = 0
borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory //Contact will be detected when red or green ball hit the wall
borderBody.categoryBitMask = WallCategory
borderBody.collisionBitMask = RedBallCategory | GreenBallCategory // Collisions between RedBall GreenBall and a Wall will be detected
Run Code Online (Sandbox Code Playgroud)
我建议你阅读有关categoryBitMask的文档,这是一个定义物理体属于哪些类别的掩码:
场景中的每个物理主体最多可以分配32个不同的类别,每个类别对应于位掩码中的一个位.您可以定义游戏中使用的蒙版值.结合collisionBitMask和contactTestBitMask属性,您可以定义哪些物理实体彼此交互以及何时向您的游戏通知这些交互.
contactTestBitMask - 一个掩码,用于定义哪些类别的主体导致与当前物理主体的交集通知.
当两个实体共享相同的空间时,通过执行逻辑AND操作,针对另一个主体的接触掩码测试每个主体的类别掩码.如果任一比较结果为非零值,则创建SKPhysicsContact对象并将其传递给物理世界的委托.为获得最佳性能,只需在联系人掩码中设置您感兴趣的交互位.
collisionBitmask - 一个掩码,用于定义哪些类别的物理实体可以与此物理主体发生冲突.
当两个物理实体相互接触时,可能会发生碰撞.通过执行逻辑AND运算,将该物体的碰撞掩模与其他物体的类别掩码进行比较.如果结果为非零值,则此实体会受到碰撞的影响.每个身体独立地选择是否想要受到另一个身体的影响.例如,您可以使用它来避免碰撞计算,这会对身体的速度产生微不足道的变化.
所以基本上,要设置所有这些,你应该问自己的东西:
好的,我现场有一个绿球,一个红球和墙上的物体.在哪些机构之间我想要发生碰撞,或者我想要注册联系人?我想要一个绿色和红色的球相互碰撞并碰撞墙壁.不是问题.我将首先正确设置类别,然后我将设置碰撞位掩码,如下所示:
greenBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory; //greenBall will collide with greenBall, redBall and a wall
redBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory
wall.collisionBitMask = GreenBall | RedBall
Run Code Online (Sandbox Code Playgroud)
现在,我想检测一些联系人何时发生(在didBeginContact
:方法中)...但我不想得到关于所有可能的联系人的通知,而是通知球之间的接触(球和墙之间的接触将被忽略了).所以让我们设置contactTestBitMasks
实现这个:
greenBall.contactTestBitMask = GreenBallCategory | RedBallCategory;
redBall.contactTestBitMask = GreenBallCategory | RedBallCategory;
Run Code Online (Sandbox Code Playgroud)
就是这样.重要的是当你不使用接触检测时,你不应该设置contactTestBitMask
.这是因为性能原因.如果您不需要碰撞检测,并且只对检测联系人感兴趣,则可以进行设置collisionBitMask = 0
.
重要:
确保您已设置物理世界的联系委托以便使用didBeginContact
和didEndContact
方法:
self.physicsWorld.contactDelegate = self; //where self is a current scene
Run Code Online (Sandbox Code Playgroud)
希望这个对你有帮助.
归档时间: |
|
查看次数: |
11131 次 |
最近记录: |