首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >碰撞和掩码-将物理属性应用于物件

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

作者头像
iOSDevLog
发布于 2019-03-11 06:30:34
发布于 2019-03-11 06:30:34
1.2K00
代码可运行
举报
文章被收录于专栏:iOSDevLogiOSDevLog
运行总次数:0
代码可运行

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

下载碰撞Collisions和掩码Masks

要学习本教程,您将需要Xcode 9,您可以下载最终项目,以帮助您与自己的进度进行比较。

SKPhysicContactDelegate

我们需要将此方法调用到GameScene以在联系人开始或结束时启用响应。现在,添加以下扩展以在项目底部实现委托方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MARK: Collision
extension GameScene: SKPhysicContactDelegate {

}

设置contactDelegate

contactDelegate当两个物理机构进来相互接触属性被调用。让我们在physicsWorld上设置contactDelegate属性。在didMove函数中,将此代码设置在节点的初始化之上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
physicsWorld.contactDelegate = self

通过设置此代码,当两个物理实体发生碰撞时,将调用一些方法。

结构体

Collision Extension中,我们将添加一个结构,它是一个“命名类型”。在Swift中,“struct”允许您封装相关的属性和行为,并为它们提供关键字。在我们的例子中,它是“碰撞”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Collision {
}

枚举

然后,在struct中添加enum,它是一组相关值的公共类型的枚举。让我们将组的名称设置为Masks,值为Int

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enum Mask: Int {
}

位掩码和原始值

枚举掩码中,我们将声明四种情况:敌人kill,玩家,奖励和地面。由于我们没有为它们分配原始值,因此Swift会自动为它们分配一个。每个案例的隐含值必须比前一个案例多一个,第一个案例是0所以:kill(0),player(1),reward(2)和ground(3)。然后,为位掩码声明一个变量,这是一个UInt32,我们将进行一些操作。这是一个高级主题,因此这里有一个链接以获取更多信息。在位操作之后,敌人的位掩码的值为1,玩家为2,奖励为4,地面为8

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case killing, player, reward, ground
var bitmask: UInt32 { return 1 << self.rawValue }

匹配掩码

结构碰撞下方,声明掩码变量。然后,创建一个匹配两个物理实体的函数。我们需要指出哪个物理体是BodyA或BodyB并不重要,因为它匹配的那一刻,我们希望事件发生。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
func didBegin(_ contact: SKPhysicsContact) {

    let collision = Collision(masks: (first: contact.bodyA.categoryBitMask, second: contact.bodyB.categoryBitMask))
}

让玩家死亡

为了让玩家死亡,我们需要创建一个动作来将玩家节点返回到其初始位置。在didBegin中,让我们首先添加一个if语句。然后,如果玩家和敌人之间发生碰撞,则创建一个动作以将玩家返回到CGPoint(x:-300,y:-100)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
碰撞和掩码 第2部分-生成不可预测的事件
在上一节中,我们通过触摸陷阱使我们的玩家死亡。通过练习,任何人都可以跳过静态陷阱并完美运行。出于这个原因,大多数游戏围绕着随机事件。在我们的游戏中,我们将通过向他射击一些流星来使Elon的生活更加艰难。
iOSDevLog
2019/03/11
1.1K0
评分系统-能够计算游戏中的抽象数量
在本节中,我们将实施评分系统。此功能将允许我们收集珠宝并将计数器的数量增加1.当满足一定数量时,我们会将我们的玩家发送到下一级别。
iOSDevLog
2019/03/11
8450
评分系统-能够计算游戏中的抽象数量
生命系统-在临死前多次受伤
在本节中,我们将了解生命系统。游戏中生命系统的实现为玩家提供了多次在死亡或重置游戏之前清除等级的机会。有很多方法可以代表这个系统。您可以申请生活酒吧,或者像塞尔达的游戏一样,拥有心形。
iOSDevLog
2019/03/11
8620
ARKit 进阶:物理世界
ARKit的渲染能力是由其他框架实现的,除了苹果的SceneKit, Unity3D、UE, 或者其他自定义的OpenGL、Metal渲染引擎都可以与ARKit相结合。本文所介绍的技术都是基于SceneKit。
郭艺帆
2018/01/15
3K2
ARKit 进阶:物理世界
iOS开发实战-基于SpriteKit的FlappyBird小游戏写在前面SpriteKit简介效果分析代码关于游戏上架TipsDemo地址还没结束
写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的
gwk_iOS
2018/08/23
1.8K0
iOS开发实战-基于SpriteKit的FlappyBird小游戏写在前面SpriteKit简介效果分析代码关于游戏上架TipsDemo地址还没结束
碰撞以及如何检测碰撞详解
节点A 和节点B 都设置了物理身体(SCNPhysicsBody),那么如图所示,SCNPhysicsBody 有三个属性如下
酷走天涯
2022/05/13
1.3K0
碰撞以及如何检测碰撞详解
SceneKit_入门10_物理世界
SceneKit_入门01_旋转人物 SceneKit_入门02_如何创建工程 SceneKit_入门03_节点 SceneKit_入门04_灯光 SceneKit_入门05_照相机 SceneKit_入门06_行为动画 SceneKit_入门07_几何体 SceneKit_入门08_材质 SceneKit_入门09_物理身体 SceneKit_入门10_物理世界 SceneKit_入门11_粒子系统 SceneKit_入门12_物理行为 SceneKit_入门13_骨骼动画 SceneKit_中级01_模型之间的过渡动画 SceneKit_中级02_SCNView 详细讲解 SceneKit_中级03_切换照相机视角 SceneKit_中级04_约束的使用 SceneKit_中级05_力的使用 SceneKit_中级06_场景的切换 SceneKit_中级07_动态修改属性 SceneKit_中级08_阴影详解 SceneKit_中级09_碰撞检测 SceneKit_中级10_滤镜效果制作 SceneKit_中级11_动画事件 SceneKit_高级01_GLSL SceneKit_高级02_粒子系统深入研究 SceneKit_高级03_自定义力 SceneKit_高级04_自定义场景过渡效果 SceneKit_高级05 检测手势点击到节点 SceneKit_高级06_加载顶点、纹理、法线坐标 SceneKit_高级07_SCNProgram用法探究 SceneKit_高级08_天空盒子制作 SceneKit_高级09_雾效果 SceneKit_大神01_掉落的文字 SceneKit_大神02_弹幕来袭 SceneKit_大神03_navigationbar上的3D文字
酷走天涯
2022/05/13
7840
SceneKit_入门10_物理世界
Godot3游戏引擎入门之十二:Godot碰撞理论以及KinematicBody2D的两个方法
2018-12-30 by Liuqingwen | Tags: Godot | Hits
IT自学不成才
2019/01/08
2.3K0
Godot3游戏引擎入门之七:地图添加碰撞体制作封闭的游戏世界
2018-10-22 by Liuqingwen | Tags: Godot | Hits
IT自学不成才
2019/01/08
1.8K0
游戏开发中的物理介绍
在游戏开发中,您通常需要知道游戏中的两个对象何时相交或接触。这就是所谓的碰撞检测。当检测到碰撞时,您通常希望发生某些事情。这就是所谓的碰撞响应。
海拥
2021/08/23
1.5K0
Cocos2d-x初学者教程
本文翻译自 https://www.raywenderlich.com/网站上Guanghui Qu写的2015年4月30号的一篇博文 Cocos2d-x Tutorial for Beginners,他使用的Cocos2d-x的版本是 version 3.5。另外,关于在Windows10下使用Cocos2d-x 3.17.2构建项目的,可以参考我之前写的博客: Win10+Python2.7.14+cocos2d-x-3.17.2+VS2017环境搭建
ccf19881030
2020/10/09
6.9K0
玩家状态机-使用GameplayKit管理不同的状态和动画
在本节中,我们将了解GameplayKit状态机,然后我们将让我们的玩家跳转并给他一些其他动画,所以扣紧并为这一知识的骑行做好准备。
iOSDevLog
2019/03/11
2.2K0
玩家状态机-使用GameplayKit管理不同的状态和动画
Java游戏编程不完全详解-5
在2D游戏中,地图是整体结构,或者我们叫做游戏地图(game map),通常是几个屏幕的宽度表示。有些游戏地图是屏幕的20倍;甚至是100位以上,主要特点是跨屏幕之后,让地图滚动显示,这种类型的游戏又叫做2D平台游戏(2D platform game)。
老九君
2021/10/26
1.8K0
如何用Python实现超级玛丽的人物行走和碰撞检测?
在《如何用 Python 实现超级玛丽的界面和状态机?》这篇文章中我们讲解如何用代码实现界面和状态机,本文详解人物行走和碰撞检测的实现。
AI科技大本营
2019/12/31
1.2K0
如何用Python实现超级玛丽的人物行走和碰撞检测?
Ethernaut闯关录(下)
在合约的开头处有一个Building接口,定义了isLastFloor函数,返回值是bool,应该是用来返回这一楼层是否为最顶层,在接口里没有函数是已实现的,类似于抽象合约,可以理解为它仅仅用来提供一个标准,这样继承于它的合约就可以遵照它的标准来进行交互,而接口内的函数在其调用合约内定义即可。
Al1ex
2021/07/21
1.1K0
Ethernaut闯关录(下)
在Python游戏中模拟重力
我们的现实生活中充满了运动和生命。物理让我们的世界变得如此繁忙和生动。 同时我们要知道,物理阐释了物质在空间中移动的方式。 不过呢,因为我们的游戏世界本不存在物理,所以作为游戏程序员,我们必须在游戏中模拟物理。
五月Rambo
2019/12/09
2.3K0
在Python游戏中模拟重力
用 MelonJS 开发一个游戏[每日前端夜话0xD9]
游戏开发并不需要局限于使用 Unity 或 Unreal Engine4 的用户。JavaScript 游戏开发已经有一段时间了。实际上,最流行的浏览器(例如Chrome,Firefox和Edge)的最新版本提供了对高级图形渲染(例如WebGL【https://get.webgl.org/】)的支持,从而带来了非常有趣的游戏开发机会。
疯狂的技术宅
2019/10/29
1.7K0
用 MelonJS 开发一个游戏[每日前端夜话0xD9]
【一统江湖的大前端(8)】matter.js 经典物理
在前端开发领域,物理引擎是一个相对小众的话题,它通常都是作为游戏开发引擎的附属工具而出现的,独立的功能演示作品常常给人好玩但是无处可用的感觉。仿真就是在计算机的虚拟世界中模拟物体在真实世界的表现(动力学仿真最为常见)。仿真能让画面中物体的运动表现更符合玩家对现实世界的认知,比如在《愤怒的小鸟》游戏中被弹弓发射出去小鸟或是因为被撞击而坍塌的物体堆,还有在《割绳子》小游戏中割断绳子后物体所发生的单摆或是坠落运动,都和现实世界的表现近乎相同,游戏体验通常也会更好。
大史不说话
2020/03/12
3.6K1
Godot3游戏引擎入门之五:上下左右移动动画(上)
2018-10-10 by Liuqingwen | Tags: Godot | Hits
IT自学不成才
2019/01/08
2.1K0
游戏开发者使用code buddy能做成什么样? C# Unity
其实,腾讯的code buddy (下文简称为buddy) 和现在大多数的AI辅助编程一样,都是帮助各位IT行业的小伙伴更加高效的编辑代码(make your life better ),目前是免费的阶段(**个人版免费** 企业版与专业版收费详见官网).使用方法与cursor类似.在代码编辑器扩展中安装,然后登陆账号.即可开始使用.使用是很简单的,但是如何去用,也是一门学问.
张曙光
2025/05/13
3190
游戏开发者使用code buddy能做成什么样? C# Unity
推荐阅读
相关推荐
碰撞和掩码 第2部分-生成不可预测的事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档