如何在 xcode spritekit 中快速保持太空游戏中入侵者的节点数稳定?

Posted

技术标签:

【中文标题】如何在 xcode spritekit 中快速保持太空游戏中入侵者的节点数稳定?【英文标题】:How to keep node count of invaders in space game stable in xcode spritekit with swift? 【发布时间】:2018-06-20 20:44:24 【问题描述】:

我正在编写一个太空游戏,其中敌人在屏幕上随机生成,但是当节点数增加时我卡住了,因为我在 func override update() 中创建了一个新的敌人精灵

然后我决定将所有敌人的精灵放在一个数组中,并删除那些离开屏幕的精灵。

有没有更有效的方法来做到这一点? 提前致谢!

【问题讨论】:

我没有使用 SpriteKit 编程,但我假设你可以创建一个具有 4 倍以上活动敌人容量的 UnsafePointer<EnemyClass>,并保留两个值:offsetcount。然后,您只需在 count 值超过指针容量时移动所有 class 引用。这种方法当然不限于 SpriteKit,但我不能说它是否对您的具体情况有所帮助。 “我决定将所有敌人的精灵放在一个数组中,并删除那些离开屏幕的精灵”这听起来不像一个好情节。 【参考方案1】:

特别是我认为将这段代码放在更新函数上并不是一个好主意,因为它会在渲染每一帧之前运行你的代码......所以它每秒会运行 60 次。

更好的解决方案是创建一个函数来生成敌人并使用计时器调用它。首先在你的类中声明一个变量来处理敌人数量和计时器:

var enemies = 0
var enemyTimer = Timer()


func spawn()
//YOUR SPAWN CODE
enemies += 1 //Will increase 1 enemy to the enemies variable every time this function is called

启动计时器:

 enemyTimer = Timer.scheduledTimer(timeInterval: YOUR TIME INTERVAL TO SPAWN ENEMIES, target: self, selector: #selector(YOUR_CLASS_NAME.spawn), userInfo: nil, repeats: true)

游戏开始时启动计时器,游戏结束时和移动到另一个场景时使其无效! 此计时器将每隔“n”秒调用一次 spawn 函数!

关于屏幕外你可以使用更新功能:

      if scene?.frame.contains(enemyNode.position)
        //nothing here
    else
//Out of screen, do stuff here...
enemyNode.removeFromParent()

【讨论】:

避免使用Timer。如果有任何事情导致您的游戏暂停,此代码将导致不良影响:I.E.一个电话、一条消息、切换应用、睡眠等 如果不是计时器,我能用什么

以上是关于如何在 xcode spritekit 中快速保持太空游戏中入侵者的节点数稳定?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode SpriteKit:如何在 Xcode 13 中添加 Sprite Atlas

如何让 SpriteKit Playgrounds 在 Xcode 8 beta 中工作?

如何在情节提要中创建一个按钮以启动在 xcode swift 中使用 spritekit 创建的游戏

SpriteKit 动画意外停止

无法在 Xcode 6 Playground 中使用 SpriteKit

Spritekit - 在 didBecomeActive 时保持游戏暂停