在本节中,我们将了解一个必要且非常令人兴奋的主题:碰撞!您可能没有注意到它,但它无处不在。当两个物体撞击另一个物体时发生碰撞。涉及碰撞的最明显的游戏功能是让我们的玩家死亡。让我们进入吧!
下载碰撞Collisions和掩码Masks
要学习本教程,您将需要Xcode 9,您可以下载最终项目,以帮助您与自己的进度进行比较。
SKPhysicContactDelegate
我们需要将此方法调用到GameScene以在联系人开始或结束时启用响应。现在,添加以下扩展以在项目底部实现委托方法:
代码语言:javascript复制// MARK: Collision
extension GameScene: SKPhysicContactDelegate {
}
设置contactDelegate
该contactDelegate当两个物理机构进来相互接触属性被调用。让我们在physicsWorld上设置contactDelegate属性。在didMove函数中,将此代码设置在节点的初始化之上。
代码语言:javascript复制physicsWorld.contactDelegate = self
通过设置此代码,当两个物理实体发生碰撞时,将调用一些方法。
结构体
在Collision Extension中,我们将添加一个结构,它是一个“命名类型”。在Swift中,“struct”允许您封装相关的属性和行为,并为它们提供关键字。在我们的例子中,它是“碰撞”。
代码语言:javascript复制struct Collision {
}
枚举
然后,在struct中添加enum,它是一组相关值的公共类型的枚举。让我们将组的名称设置为Masks,值为Int。
代码语言:javascript复制enum Mask: Int {
}
位掩码和原始值
在枚举掩码中,我们将声明四种情况:敌人kill,玩家,奖励和地面。由于我们没有为它们分配原始值,因此Swift会自动为它们分配一个。每个案例的隐含值必须比前一个案例多一个,第一个案例是0所以:kill(0),player(1),reward(2)和ground(3)。然后,为位掩码声明一个变量,这是一个UInt32,我们将进行一些操作。这是一个高级主题,因此这里有一个链接以获取更多信息。在位操作之后,敌人的位掩码的值为1,玩家为2,奖励为4,地面为8。
代码语言:javascript复制case killing, player, reward, ground
var bitmask: UInt32 { return 1 << self.rawValue }
匹配掩码
在结构碰撞下方,声明掩码变量。然后,创建一个匹配两个物理实体的函数。我们需要指出哪个物理体是BodyA或BodyB并不重要,因为它匹配的那一刻,我们希望事件发生。
代码语言:javascript复制let masks : (first : UInt32, second : UInt32)
func matches (_ first : Masks, _ second : Masks) -> Bool {
return (first.bitmask == masks.first && second.bitmask == masks.second) ||
(first.bitmask == masks.second && second.bitmask == masks.first)
}
冲突%20Explained
didBegin实例方法
当两个物理实体相互接触时,会调用此函数。在Collision扩展中,在struct Collision之后,添加didBegin函数。在其中,声明碰撞变量。
代码语言:javascript复制func didBegin(_ contact: SKPhysicsContact) {
let collision = Collision(masks: (first: contact.bodyA.categoryBitMask, second: contact.bodyB.categoryBitMask))
}
让玩家死亡
为了让玩家死亡,我们需要创建一个动作来将玩家节点返回到其初始位置。在didBegin中,让我们首先添加一个if语句。然后,如果玩家和敌人之间发生碰撞,则创建一个动作以将玩家返回到CGPoint(x:-300,y:-100)。
代码语言:javascript复制if collision.matches( .player, .killing) {
let die = SKAction.move(to: CGPoint(x: -300, y: -100), duration: 0.0)
player?.run(die)
}
scene掩码
现在,我们需要设置场景。从媒体库中,将spike-big拖放到场景中。把它放在宝石的左边,并命名为:trap陷阱。
将陷阱的body type设置为“Bounding rectangle”,然后取消选中“ 动态Dynamic”,“允许旋转”和“受重力影响”。由于陷阱必须是静态的,请检查Pinned属性。要了解有关掩码的更多信息,请访问Apple的页面链接。将陷阱和玩家的掩码更改为以下内容:
陷阱:
- 分类掩码:1
- 碰撞掩码:2
- 字段掩码:默认
- 接触掩码:2
玩家:
- 分类掩码:2
- 碰撞掩码:1
- 字段掩码:默认
- 接触掩码:1
运行模拟器并将玩家移动到陷阱。您将看到玩家返回其初始位置。
结论
通过实现碰撞功能,您现在可以创建一个惊人的游戏,让您的创造力自由。在本节中,我们了解了冲突的工作原理以及它们如何相互作用。
原文: https://designcode.io/spritekit-collision