前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >碰撞和掩码-将物理属性应用于物件

碰撞和掩码-将物理属性应用于物件

作者头像
iOSDevLog
发布2019-03-11 14:30:34
9220
发布2019-03-11 14:30:34
举报
文章被收录于专栏:iOSDevLogiOSDevLog

在本节中,我们将了解一个必要且非常令人兴奋的主题:碰撞!您可能没有注意到它,但它无处不在。当两个物体撞击另一个物体时发生碰撞。涉及碰撞的最明显的游戏功能是让我们的玩家死亡。让我们进入吧!

下载碰撞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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载碰撞Collisions和掩码Masks
  • SKPhysicContactDelegate
  • 设置contactDelegate
  • 结构体
  • 枚举
  • 位掩码和原始值
  • 匹配掩码
  • didBegin实例方法
  • 让玩家死亡
  • scene掩码
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档