Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >碰撞和掩码 第2部分-生成不可预测的事件

碰撞和掩码 第2部分-生成不可预测的事件

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

在上一节中,我们通过触摸陷阱使我们的玩家死亡。通过练习,任何人都可以跳过静态陷阱并完美运行。出于这个原因,大多数游戏围绕着随机事件。在我们的游戏中,我们将通过向他射击一些流星来使Elon的生活更加艰难。

下载碰撞和掩码第2部分

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

产生一颗流星

首先,我们需要一个函数来产生流星。在碰撞掩码 Collision Mark后,添加一个新的大关流星。然后,创建一个新函数来生成流星。

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

    func spawnMeteor() {

    }
}

生成随机数

Swift 4中有不同的方法来生成随机数,在我们的例子中,我们只需要一个:arc4random_uniform(_:)。此函数返回零和第一个参数减1之间的随机数。

spawnMeteor函数内部,声明节点并为其命名:Meteor

然后,为randomXPosition创建一个新变量,使用arc4random_uniform(_:))函数并将第一个参数放入场景的大小。

将节点的位置设置为(x: randomXPosition, y: 270)。将节点的anchorPoint设置为(x: 0.5, y: 1),将其zPosition设置为5。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let node = SKSpriteNode(imageNamed: "meteor")
node.name = "Meteor"
let randomXPosition = Int(arc4random_uniform(UInt32(self.size.width)))
node.position = CGPoint(x: randomXPosition, y: 270)
node.anchorPoint = CGPoint(x: 0.5, y: 1)
node.zPosition = 5

PhysicBody的节点

就在流星定位的下方,让我们将物理体属性传给流星。如果您不记得这些属性是什么,这里是Apple的Collision页面的链接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let physicsBody = SKPhysicsBody(circleOfRadius: 30)
node.physicsBody = physicsBody

physicsBody.categoryBitMask = Collision.Masks.killing.bitmask
physicsBody.collisionBitMask = Collision.Masks.player.bitmask | Collision.Masks.ground.bitmask
physicsBody.contactTestBitMask = Collision.Masks.player.bitmask | Collision.Masks.ground.bitmask
physicsBody.fieldBitMask = Collision.Masks.player.bitmask | Collision.Masks.ground.bitmask

physicsBody.affectedByGravity = true
physicsBody.allowsRotation = false
physicsBody.restitution = 0.2
physicsBody.friction = 10

addChild(node)

实现计时器

当您需要以时间间隔运行功能时,计时器是必需的。在这种情况下,我们需要流星每2秒钟下降一次。在didMove方法中,调用timer类方法并在其中运行spawnMeteor函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Timer
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) {(timer) in
    self.spawnMeteor()
}

建立熔化物

运行模拟器后,您会注意到流星正在堆积在场景中。我们需要在接触地面时移除流星并用熔化的图像替换它。在spawnMeteor之后立即创建一个新函数,并将其命名为createMolten

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func createMolten(at position: CGPoint) {
    let node = SKSpriteNode(imageNamed: "molten")
    node.position.x = position.x
    node.position.y = position.y - 110
    node.zPosition = 4

    addChild(node)

    let action = SKAction.sequence([
        SKAction.fadeIn(withDuration: 0.1),
        SKAction.wait(forDuration: 3.0),
        SKAction.fadeOut(withDuration: 0.2),
        SKAction.removeFromParent(),
        ])

    node.run(action)
}

在括号之间,我们称之为熔化物将出现的位置,即CGPoint。然后,将图像熔化到节点并设置位置。声明几秒钟后移除熔化物的动作。

流星碰撞

创建一个if语句并将地面与一个查杀主体匹配。如果其中一个物体是Meteor,我们在其位置创建熔化物并移除流星节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if collision.matches(.ground, .killing) {
    if contact.bodyA.node?.name == "Meteor", let meteor = contact.bodyA.node {
        createMolten(at: meteor.position)
        meteor.removeFromParent()
    }

    if contact.bodyB.node?.name == "Meteor", let meteor = contact.bodyB.node {
        createMolten(at: meteor.position)
        meteor.removeFromParent()
    }
}

流星位掩码 Bitmasks

在场景中,我们需要改变地面和玩家的掩码以使它们与流星碰撞。

地面:

  • 分类掩码:8
  • 碰撞掩码:2
  • 场面掩码:0
  • 接触掩码:2

玩家:

  • 分类掩码:2
  • 碰撞掩码:8
  • 场面掩码:0
  • 接触掩码:1

熔化定位

你会注意到熔化的位置并不好,原因是流星会在陷阱和岩石之上产生。要解决此问题,您需要设置一个不可见的节点来限制流星坠落。关于熔化,您需要更改此行代码并为y位置设置正确的值。

修复跳跃状态

现在我们已经设置了碰撞,我们可以修复跳跃。在玩家和地面之间添加新的碰撞匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if collision.matches(.player, .ground) {
    playerStateMachine.enter(LandingState.self)
}

禁用多次跳转

playerStateMachine文件中,在跳转状态下启用此行并将返回值更改为false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if hasFinishedJumping && stateClass is LandingState.Type { return true }
return false

结论

在本节中,我们学习了如何使用arc4random_uniform(_:)在随机位置生成流星。然后,我们实施了一个计时器,每2秒产生一次流星。此外,当流星接触地面并固定多次跳跃时,我们添加了熔化物。

原文: https://designcode.io/spritekit-collision-2

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
碰撞和掩码-将物理属性应用于物件
在本节中,我们将了解一个必要且非常令人兴奋的主题:碰撞!您可能没有注意到它,但它无处不在。当两个物体撞击另一个物体时发生碰撞。涉及碰撞的最明显的游戏功能是让我们的玩家死亡。让我们进入吧!
iOSDevLog
2019/03/11
1.2K0
碰撞和掩码-将物理属性应用于物件
iOS开发实战-基于SpriteKit的FlappyBird小游戏写在前面SpriteKit简介效果分析代码关于游戏上架TipsDemo地址还没结束
写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的
gwk_iOS
2018/08/23
1.8K0
iOS开发实战-基于SpriteKit的FlappyBird小游戏写在前面SpriteKit简介效果分析代码关于游戏上架TipsDemo地址还没结束
评分系统-能够计算游戏中的抽象数量
在本节中,我们将实施评分系统。此功能将允许我们收集珠宝并将计数器的数量增加1.当满足一定数量时,我们会将我们的玩家发送到下一级别。
iOSDevLog
2019/03/11
8380
评分系统-能够计算游戏中的抽象数量
生命系统-在临死前多次受伤
在本节中,我们将了解生命系统。游戏中生命系统的实现为玩家提供了多次在死亡或重置游戏之前清除等级的机会。有很多方法可以代表这个系统。您可以申请生活酒吧,或者像塞尔达的游戏一样,拥有心形。
iOSDevLog
2019/03/11
8580
新年开工啦,放个小烟花庆祝一下
2022年大年初八,正式开工大吉啦!我的技术输出路线也准备在今天正式开始营业。首先咱们今天就用 Apple 的 SpriteKit 2D 引擎给大家画一个小烟花吧!
HelloWorld杰少
2022/08/04
7660
新年开工啦,放个小烟花庆祝一下
ARKit 进阶:物理世界
ARKit的渲染能力是由其他框架实现的,除了苹果的SceneKit, Unity3D、UE, 或者其他自定义的OpenGL、Metal渲染引擎都可以与ARKit相结合。本文所介绍的技术都是基于SceneKit。
郭艺帆
2018/01/15
3K2
ARKit 进阶:物理世界
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.7K0
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
用 Cocos Creator 制作平台跳跃游戏
平台跳跃类游戏如《超级马里奥》《Celeste蔚蓝》等,非常考验玩家的操作和判断,有着非常本真的游戏乐趣。这类游戏乍一看,挺容易做的,但是要做好却不太容易。今天,我将使用 Cocos Creator v2.1.2 演示如何灵活快速地使用 Cocos Creator 来制作这类经典的横版平台跳跃类游戏,主要目的是帮助大家熟悉组件的用法,横版游戏实现方法很多,这里不做讨论!
一枚小工
2020/03/02
2.5K0
抖音国庆小游戏是如何实现的?
经过若干个月的点滴积累,我有幸参与到抖音国庆活动的开发,这是我第一次完整参与大型活动项目的开发,它是全员关注的一个重点项目,致力于让用户领略美好中国,指导用户在抖音中搜索与获取旅行攻略和出游信息。
ConardLi
2021/12/02
1.6K0
抖音国庆小游戏是如何实现的?
机器人相关学术速递[8.24]
【1】 Automatic Centralized Control of Underactuated Large-scale Mutli-robot Systems using a Generalized Coordinate Transformation 标题:基于广义坐标变换的欠驱动多机器人系统自动集中控制 链接:https://arxiv.org/abs/2108.10153
公众号-arXiv每日学术速递
2021/08/25
3390
机器人相关学术速递[8.17]
【1】 The Integrated Probabilistic Data Association Filter Adapted to Lie Groups 标题:适应李群的综合概率数据协会过滤 链接:https://arxiv.org/abs/2108.07265
公众号-arXiv每日学术速递
2021/08/24
4090
机器人相关学术速递[7.16]
【1】 Optimization-Based Quadrupedal Hybrid Wheeled-Legged Locomotion 标题:基于优化的四足混合轮腿运动
公众号-arXiv每日学术速递
2021/07/27
5730
计算机视觉学术速递[9.6]
【1】 Semantic Segmentation on VSPW Dataset through Aggregation of Transformer Models 标题:基于Transformer模型聚合的VSPW数据集语义分割 链接:https://arxiv.org/abs/2109.01316
公众号-arXiv每日学术速递
2021/09/16
5420
精通 Python OpenCV4:第三、四部分
在本书的第三部分中,您将体验一下机器学习和深度学习。 我们将探索和利用 OpenCV 的机器学习模块。 此外,您还将学习如何使用与人脸检测,跟踪和识别相关的最新算法来创建人脸处理项目。 最后,将向您介绍 OpenCV 和一些深度学习 Python 库(TensorFlow 和 Keras)的深度学习领域。
ApacheCN_飞龙
2023/04/27
1.5K0
计算机视觉与模式识别学术速递[11.12]
【1】 A Survey of Visual Transformers 标题:视觉Transformer综述 链接:https://arxiv.org/abs/2111.06091
公众号-arXiv每日学术速递
2021/11/17
9880
计算机视觉学术速递[10.18]
【1】 Tensor-to-Image: Image-to-Image Translation with Vision Transformers 标题:张量到图像:使用视觉变换器进行图像到图像的转换 链接:https://arxiv.org/abs/2110.08037
公众号-arXiv每日学术速递
2021/10/21
2.5K0
计算机视觉与模式识别学术速递[12.24]
【1】 ELSA: Enhanced Local Self-Attention for Vision Transformer 标题:ELSA:增强视觉转换器的局部自我注意 链接:https://arxiv.org/abs/2112.12786
公众号-arXiv每日学术速递
2021/12/27
1.4K0
统计学学术速递[11.10]
【1】 An Examination of Sport Climbing's Competition Format and Scoring System 标题:对运动攀岩竞赛形式和评分系统的考察 链接:https://arxiv.org/abs/2111.05310
公众号-arXiv每日学术速递
2021/11/17
6560
相关推荐
碰撞和掩码-将物理属性应用于物件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档