美文网首页
碰撞和掩码 第2部分-生成不可预测的事件

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

作者: iOSDevLog | 来源:发表于2019-02-28 18:25 被阅读3次

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

下载碰撞和掩码第2部分

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

产生一颗流星

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

// 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。

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页面的链接。

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函数。

// Timer
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) {(timer) in
    self.spawnMeteor()
}

建立熔化物

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

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,我们在其位置创建熔化物并移除流星节点。

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位置设置正确的值。

修复跳跃状态

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

if collision.matches(.player, .ground) {
    playerStateMachine.enter(LandingState.self)
}

禁用多次跳转

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

if hasFinishedJumping && stateClass is LandingState.Type { return true }
return false

结论

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

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

相关文章

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

    在上一节中,我们通过触摸陷阱使我们的玩家死亡。通过练习,任何人都可以跳过静态陷阱并完美运行。出于这个原因,大多数游...

  • 2021-06-07 《反脆弱》第8章 预测是现代化的产物

    第8章 预测是现代化的产物 一、黑天鹅能预测吗?为什么? 黑天鹅不可预测,因为大部分黑天鹅事件发生在【极端斯坦】 ...

  • View事件分发---正文

    简介事件分发起源事件分发---正片ViewGroup的事件分发第1部分:第2部分:第3部分View的事件分发总结滑...

  • (四)子网掩码

    1、概念简介 子网掩码子网掩码又叫网络掩码、地址掩码,是一个32位地址,用于屏蔽IP地址的一部分以区别网络号和主机...

  • 创业这件小事——危机公关

    危机事件的发生大部分时候是不可预测的,不然怎么叫危机,可预测的那叫客服。虽说是危机,但是在危机发生之前,引发危机的...

  • 事件的不可预测性

    五点的时候我很焦虑,因为我要打电话给房东,传达两件事,一件是前几天才说过住到月底,现在变成要续住两个月,另一件是房...

  • 黑天鹅事件带给我们的思考

    什么是黑天鹅事件 黑天鹅事件指不可预测的重大稀有事件,它在意料之外又改变一切。它的三个特征事件: 1.不可预测,具...

  • Thinking, fast and slow 15(CH18笔

    第十八章,PART2部分完结 思维的陷阱:直觉预测的坑 1. 大脑要做什么判断? 事件预测 2. 这一过程大脑会犯...

  • 反脆弱之听书笔记

    本书会改变我们看待整个世界的角度和方法 黑天鹅事件的发生,基本上是不可预测的。而整个世界,因为不可预测的事情越来越...

  • 低头做事前,不忘抬头看路丨《营销管理》第3章、第4章笔记

    《营销管理》第2部分 洞察市场第3章:收集信息和扫描环境第4章:营销调研与需求预测 ———— 做营销的同学都知道什...

网友评论

      本文标题:碰撞和掩码 第2部分-生成不可预测的事件

      本文链接:https://www.haomeiwen.com/subject/noskuqtx.html