RainCat:第2课

创造运动!

我们将更新雨伞以响应触摸。 在GameScene.swift中 ,查看空函数touchesBegan(_ touches :,带有event 🙂touchesMoved(_ touches :,带有event 🙂 。 在这里,我们将告诉雨伞与游戏进行交互的位置。 如果我们基于当前触摸之一在这两个功能中都设置了伞形节点的位置,它将锁定到位并从屏幕的一侧转移到另一侧。

另一种方法可能是在UmbrellaSprite对象中设置目标,然后在调用update(dt :)时 ,我们可以朝该位置移动。

第三种方法可能是将SKActions设置为在touchesBegan(_ touches :,带有event 🙂touchesMoved(_ touches :,带有event 🙂上移动UmbrellaSprite ,但是我不建议这样做。 这将导致我们频繁创建和销毁这些SKAction ,并且可能性能不高。

我们将选择选项#2。 更新UmbrellaSprite中的代码,使其看起来像下面的代码:

检测我们的碰撞!

现在,我们不需要担心很多冲突。 我们可能在雨滴,雨滴和雨伞以及雨滴和地板之间发生碰撞。 但是,我们确实需要检测雨滴何时击中了某些东西,因此我们可以告诉它被删除。 我们将需要创建一些变量来对每个SKPhysicsBody进行分类,以便我们找出它们碰撞时该怎么办。

为此,我们应该创建另一个名为Constants.swift的文件。 右键单击“支持”组下的,单击“ 新建文件” >“ Swift文件” ,然后单击“下一步”按钮。 将文件重命名为Constants ,然后单击Create

该文件应包含以下代码:

 让RainDropCategory:UInt32 = 0x1 << 1 
让FloorCategory:UInt32 = 0x1 << 2
让UmbrellaCategory:UInt32 = 0x1 << 3

我们为每个SKPhysicsBody分配一个值,并使用它来确定每个物体碰撞时会听什么。

转至UmbrellaSprite.swift紧接着newInstance()中返回对象之前,我们需要添加以下代码:

 伞.physicsBody?.categoryBitMask = UmbrellaCategory 
伞.physicsBody?.contactTestBitMask = RainDropCategory

这告诉伞形精灵,其类别为UmbrellaCategory ,并且仅在与RainDropCategory接触时才在意。 我们还将雨滴的类别 BitMask也更新为RainDropCategory

GameScenespawnRaindrop()函数下,需要将以下代码添加到场景中:

  rainDrop.physicsBody?.categoryBitMask = RainDropCategory 

接下来,在同一文件中,我们需要在将floorNode添加到场景之前,将以下代码添加到sceneDidLoad函数中:

  floorNode.physicsBody?.categoryBitMask = FloorCategory 
floorNode.physicsBody?.contactTestBitMask = RainDropCategory

要监听这些节点之间的联系,我们需要继承SKPhysicsContactDelegate ,它将为我们提供在两个SKPhysicsBody发生碰撞和结束碰撞时将调用的功能。 将类声明更新为:

  GameScene类:SKScene,SKPhysicsContactDelegate { 

现在,我们需要告诉场景的physicsWorld ,我们想听听碰撞。 在函数顶部附近的sceneDidLoad()中添加以下行。

  self.physicsWorld.contactDelegate =自我 

然后,我们需要实现SKPhysicsContactDelegate函数。 didBegin(_ contact 🙂 。 每当发生与我们之前设置的contactTestBitMask匹配的冲突时,就会调用此方法。 将此代码添加到GameScene.swift的底部。

雨滴不再堆积,但您的fps仍在下降,并且节点数不断增加。 这些节点不再显示在屏幕上,也不再呈现,但是它们仍保留在内存中。 是时候剔除不需要的节点了!

剔除屏幕外的节点!

首先,我们将另一个类别添加到常量文件中,这样我们就知道世界的边缘受到了打击,而不是次要的事情。 Constants.swift现在应如下所示:

 让RainDropCategory:UInt32 = 0x1 << 1 
让FloorCategory:UInt32 = 0x1 << 2
让UmbrellaCategory:UInt32 = 0x1 << 3
让WorldFrameCategory:UInt32 = 0x1 << 4

返回GameScene ,并进入sceneDidLoad函数,我们可以更新场景的物理实体。 我们只关心屏幕上的节点,因此我们将创建一个CGRect ,它略大于屏幕边界。 当此CGRect被点击时,我们然后从父节点移除该节点并清除SKPhysicsBody 。 我们需要清除物理主体,因为场景将保持不变,以便在渲染周期内进行更新。

从以下位置替换我们将自己设置为sceneDidLoad()中contactDelegate的代码:

  self.physicsWorld.contactDelegate =自我 

至:

如果有问题,并且雨滴的行为不像上面的gif,请仔细检查以确保正确设置了每个categoryBitMaskcontactTestBitMask

这就是第二课! 在第3课中,RainCat将开始看起来更像游戏,(我保证!)。 我们将添加基本的猫精灵,并检测与猫的碰撞。 我们还将产生食物供猫食用,并且我们将解决基本游戏玩法中可能出现的所有问题(即,如果猫掉下来重生它,或者猫在移动时会面对正确的方向) 。

今天的源代码将在GitHub上在线提供。

你怎么做的? 您的代码看起来几乎和我的完全一样吗? 发生了什么变化? 您是否对代码进行了更好的更新,或者我不清楚要做什么? 在下面的评论中让我知道。

接下来的第三课!

RainCat:第1课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第3课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第4课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第5课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏

Facebook Twitter上 找到我们, 或者在 thirteen23.com 我们 联系