资讯专栏INFORMATION COLUMN

[原创]SpriteKit+Swift学习笔记(六)-生成大量精灵

FleyX / 894人阅读

摘要:下面就简单介绍几种方案需要时生成。这种方法适合生成敌人,或者一些间隔时间长的对象。这个目前我没有测试到子弹间隔时间的极限,秒应该是毫无问题的。

之前写了一个打飞机的游戏,在飞机子弹的问题上,走过很多坑。下面就简单介绍几种方案:
1.需要时生成。做一个action序列,间隔一定时间发射一个或者一组子弹,发射的时候用纹理初始化成精灵节点,然后附加到一个子弹组的sknode上。超出边界的时候,自动把自己从父节点移除。这是我最开始采用的方案,但是因为子弹需要设置的属性很多,包括物理边界、碰撞检测等,所以当间隔时间小于0.15秒左右时,很可能导致crash。这种方法适合生成敌人,或者一些间隔时间长的对象。
伪代码:

bullets.runAction(SKAction.repeatActionForever(SKAction.sequence[SKAction.waitForDuration(0.5),SKAction.runBlock({
    var bullet = SKSpriteNode(...)
    ...
    self.bullets.addChild(bullet)
})]))

2.需要时拷贝。看了几个别人写的demo和git上的项目,发现这样写的不多,做iOS两年经验的同学也不赞成这种方式。不过还是有人这样写,于是我就尝试了一下,先建立一个标准的bullet作为样板,然后每次需要新子弹,就调用bullet模板的copy函数,拷贝一份。我试验了一下,速度快了很多,如果没记错的话,大概间隔可以缩小到0.1秒以内了,0.05左右还是可以的。但是还是伴随着大量的初始化和销毁操作,实在不是太好的解决方式。
伪代码:

var bullet = SKSpriteNode()SKSpriteNode
...
bullets.runAction(SKAction.repeatActionForever(SKAction.sequence[SKAction.waitForDuration(0.5),SKAction.runBlock({
    self.bullets.addChild(bullet.copy() as SKSpriteNode)
})]))
SKSpriteNode

3.也就是我的最终方案了,预先生成一定数量的子弹,然后复用。我在场景初始化时,就生成好了30个子弹放在bulletGroup这个数组里,然后逐个add到bullets这个SKNode节点下,子弹超出边界时,remove掉,但是因为有bulletGroup数组的引用,子弹并不会消失,可以进入下一次复用。add的时候,只需要调整一下子弹的position就可以了,连子弹飞行的action都不需要改动。这个目前我没有测试到子弹间隔时间的极限,0.01秒应该是毫无问题的。
抱歉,涉及代码比较多,就不附加伪代码了,思路很清楚,很好实现。不过归根结底,用哪种方案还是要看是哪种需求。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15480.html

相关文章

  • [原创]SpriteKit+Swift学习笔记(四)-纹理部分缩放

    摘要:如果要把血条缩放,肯定是一端固定,另一端延长或者缩短。最后进行缩放,就会按照中心矩形进行缩放了。 这个纹理部分缩放,可能初次接触游戏开发的小伙伴,不知道是什么东西,简单地说,部分边和角不缩放,只缩放中心的部分纹理。其实这个用途非常广,最常见的就是血条蓝条和玩家角色对话框。血条蓝条应该怎么做?(对话框同理)根据开发经验和需求的不同,可以有多种形式:第一种,用一个矩形条,设置x轴缩放xSc...

    woshicixide 评论0 收藏0
  • [原创]SpriteKit+Swift学习笔记(五)-场景清理

    摘要:追了很久总算发现了原因是游戏结束之后,场景清理不干净,导致游戏资源未释放或者重复赋值。第一种将之前的旧场景置空。第二种场景复用。清理的时候,只是把进行了操作,之后又重新对它赋值了一遍。只是将子节点从父节点移除,却并不会销毁它。 有一小段时间,游戏总是在重新开始的时候崩溃掉。追了很久总算发现了原因:是游戏结束之后,场景清理不干净,导致游戏资源未释放或者重复赋值。游戏场景清理,是很多初学s...

    OnlyLing 评论0 收藏0
  • [原创]SpriteKit+Swift学习笔记(三)-dynamic参数

    摘要:所以设置之后,地面就不会收到任何影响,死守在自己的岗位上。总结来说,就是障碍,地面,小物件等需要固定在某个位置,不受模拟器任何影响的东西,需要设置为。 ground.physicsBody.dynamic = false文档里的解释是A Boolean value that indicates whether the physics body is moved by the physi...

    galois 评论0 收藏0
  • [原创]SpriteKit+Swift学习笔记(一)-父节点坐标系

    摘要:众所周知,推出只有一年的时间,虽然苹果文档一直非常坚挺,但是和的普及程度受欢迎程度和易用程度还有很大的距离,所以使用的人也很少。不光如此,这样还简化了子节点的坐标设置。注意如果父节点被移除,子节点也会被移除。 最近一个月硬是啃下了Swift和SpriteKit,回首这一个月,有垂头丧气,也有得意忘形,但是遇到最多的,还是无助和无奈。众所周知,SpriteKit推出只有一年的时间,虽然苹...

    MAX_zuo 评论0 收藏0
  • [原创]SpriteKit+Swift学习笔记(七)-简述碰撞检测

    摘要:碰撞检测,默认所有物体之间互相可碰撞。当你对某种接触感兴趣时,单独设置,监听这类碰撞消息。 碰撞检测设置步骤:1.添加场景代理SKPhysicsContactDelegate2.设置self.physicsWorld.contactDelegate = self 3.设置接触抛事件ground.physicsBody?.contactTestBitMask = horseCategor...

    bladefury 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<