如何在 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>
,并保留两个值:offset
和 count
。然后,您只需在 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 创建的游戏