
玩转SpriteKit
文章平均质量分 76
大熊猫猪侯佩带你一起玩转SpriteKit
大熊猫侯佩
一枚贪吃路痴还未秃码农。优快云 博客专家,iOS 与 Swift 版块版主,热爱苹果开发。
人生看淡,不服就干!
展开
-
SpriteKit游戏如何一步一步重构在场景中增加金币动画(二)
上一篇我们迅速构建了一个生成金币的原型,现在我们需要进一步完善我们的功能。首先,我们需要让小飞机碰到金币不会爆炸,稍后我们让“金币”更像一个金币 ;)现在飞机的物理对象设置如下:player.physicsBody = SKPhysicsBody(texture: playerTexture, size: playerTexture.size())player.physicsBody!.conta原创 2017-05-18 08:13:18 · 2139 阅读 · 0 评论 -
SpriteKit游戏如何一步一步重构在场景中增加金币动画(一)
一个类似flappy bird的游戏,作者基本为我们实现了所有有趣的东东,不过为了更富趣味性,我们再加点料:在场景中自动生成一些金币。运行原来的游戏画面如下:下面我来带领大家一步一步把功能完善成型 ;)首先我们写一个小的coinsCreate方法,简单测试一下原型是否可行。在写这个方法之前请允许我先明确两件事:1.金币的位置需要和岩石(rock)位置相呼应,你没道理把金币放到岩石里面去,那个太反人类原创 2017-05-18 06:33:53 · 1748 阅读 · 2 评论 -
SpriteKit可摧毁物理场景的进一步完善
例子举了一个早期DOS下的双人游戏,类似于百战天虫类型。不过有趣的是游戏中实现了可摧毁的物理场景,而且只用了很少的代码:游戏实现起来十分巧妙和简单,利用了CoreGraphic中的clear混合模式,将香蕉炸弹以中心位置的纹理全部消除,从而实现“摧毁”效果。游戏中为建筑物单独创建一个类,继承于SKSpriteNode,其中有一个currentImage用来存放当前楼体的纹理:class Buildi原创 2017-05-02 08:13:55 · 2820 阅读 · 4 评论 -
SpriteKit对于“子弹”物体的模拟
Second, SpriteKit uses a number of optimisations to help its physics simulation work at high speed. These optimisations don't work well with small, fast-moving objects, and our banana is just such a th翻译 2017-05-01 16:40:49 · 1365 阅读 · 0 评论 -
SpriteKit小球被旋涡吞噬动画的进一步改进
App首先找到map文件,然后将场景地图载入游戏。map是一个人可读的ASCII字符文件,每个单元是一个“瓦块”,在cocos2d中对瓦块地图有非常好的的支持,不过在SpriteKit中,至少目前为止瓦块地图功能还不是那么太丰富。不管怎样把,地图中游戏元素分为star,旋涡和终点几种。当player碰到终点则游戏过关;如果碰到star则player得分;若是player不幸碰到了旋涡,对不起GAME原创 2017-04-28 15:23:30 · 2977 阅读 · 0 评论 -
SpriteKit在游戏中模拟一个按钮
首先我们需要将在游戏中创建一个初始化方法initGame,我们将原来在didMove方法中的部分代码移至该方法中:func initGame(){ if gameTimer != nil{ gameTimer.invalidate() gameTimer = nil } gameOver = false原创 2017-04-26 19:36:58 · 2191 阅读 · 0 评论 -
HWS中SpriteKit教程实际运行错误的调整
Hacking With Swift(以下简称hws)是一本以独特视角展示Swift编程乐趣的书籍,1000+页也算大部头了…其中作者按照UIKit,SpriteKit,Tech的顺序循序渐进的将iOS编程的奥秘逐一呈现出来,非常棒!但是初学者按照其中的SpriteKit代码实际运行时会发现App显示的UI是错滴…别就这样放弃啊!就让本猫带领大家将这些障碍一一扫除,让你专注作者的初心哦 ;)1.首先原创 2017-04-19 21:22:50 · 1233 阅读 · 0 评论 -
SpriteKit中节点存储个性数据的办法
我们知道大多数情况下,我们可以在SKNode实例的name属性中添加一些个性数据,不过一来只能使用一次,如果还有其他数据就无解了,二来只能存放String类型,如果还要存放其他类型呢?还是无解!不过不知各位是否注意,其实SKNode还提供一个非常有用的属性,可以用它存放任意数据类型,它就是userData!它是一个字典类型,我们可以任意组织数据存入其中供后来使用:let imageName = rn原创 2017-04-15 16:35:06 · 1217 阅读 · 0 评论 -
SpriteKit中Node数量只增不降的原因和解决
上篇 SpriteKit代码动态调整sks文件中粒子的颜色 博客中的App,运行中发现场景中的Node数量不断在增多,并没有减少,只见内存占用不断变大,虽然增长幅度很小,但强迫症伤不起…只有一个可能,Node没有被释放!检查代码发现,动态生成的Node只有小球和粒子效果,将粒子产生的代码注释掉后发现Node数量恢复正常了!!!那么就是粒子没有从场景中删掉.虽然粒子正常播放完后会hide,但并没有从删原创 2017-04-15 16:26:36 · 1199 阅读 · 0 评论 -
SpriteKit代码动态调整sks文件中粒子的颜色
在Xcode中我们可以很方便的使用粒子模板制作粒子,然后保存为sks文件,这样我们随时就可以在代码中使用它们了:if let fireParticles = SKEmitterNode(fileNamed: "FireParticles"){ //do anything you want!!!}我们想要制作的效果是当小球调入时间空隙时显示被吞噬的粒子效果,不过sks文件中的粒子消逝效果是粉原创 2017-04-15 15:17:19 · 3769 阅读 · 0 评论 -
SpriteKit改变Node锚点其物理对象位置不正确的解决
在创建Node的物理对象后,默认情况下物理对象和Node的实际边界对应的很好,因为此时Node的默认锚点是其中心位置即(0.5,0.5),不过如果我们改变了Node的锚点,就会发现其物理边界还是保持原来的位置,这可不是我们想要的结果:let bouncer = SKSpriteNode(imageNamed: "bouncer") bouncer.anchorPoint = CGPo原创 2017-04-14 10:27:40 · 2461 阅读 · 0 评论 -
SpriteKit:开启物理逐像素(Per-Pixel)碰撞检测后发现的问题及解决(续)
正传传送门:SpriteKit:开启物理逐像素(Per-Pixel)碰撞检测后发现的问题及解决之后还是发现一个小问题,就是虽然player可以正确处理碰撞scoreDetect出发点和其他障碍物,但是由于启用了Per-Pixel,还是会发生多次接触的情况,这时玩家的得分就会被多次累加!相关代码如下:if contact.bodyA.categoryBitMask == Mask.scoreDetec原创 2016-11-04 11:20:55 · 1166 阅读 · 0 评论 -
SpriteKit:开启物理逐像素(Per-Pixel)碰撞检测后发现的问题及解决
下面是一个开源的iOS小游戏,类似于 Flappy Bird,玩家需要不停点击屏幕让小飞机从峭壁中穿过,如果飞机撞上峭壁或地面游戏宣告结束,否则每穿过一次峭壁,玩家加一分.因为只是飞机和其他任何物理对象碰撞,而其他物理对象相互之间均不会发生碰撞.所以原作者将飞机的接触掩码(contact mask)设置为任何对象,将碰撞掩码设置为0,表示不和任何对象碰撞:player.physicsBody!.co原创 2016-11-04 11:01:16 · 1817 阅读 · 0 评论 -
SpriteKit:模拟器中播放效果音有延时的解决办法
以下代码在模拟器(Xcode 8.1 + iPhone7)中运行会在第一次播放效果音时有半秒到1秒(甚至更长!)的延时,随后再播放就没有延时了:let sound = SKAction.playSoundFileNamed("explosion.wav", waitForCompletion: false)run(sound)player.removeFromParent()我们这里播放声音使用原创 2016-11-03 16:46:02 · 2342 阅读 · 0 评论 -
SpriteKit中Scene中物理世界属性speed
SpirteKit中Scene拥有一个speed属性.所有SpriteKit的节点可以有附加其上的actions,并且默认他们全部以实时运行—–也就是说,动作中的1秒等同于真实时钟里的1秒.这个speed属性是一个时间的倍乘器,让你可以调整附加在节点上的动作应该运行多快.默认是1.0(真实时钟),但是你可以设置为2.0使得动作速度为原来的两倍.即”在5秒中fade out”,将实际变为”在2.5秒中翻译 2016-11-03 14:09:51 · 1156 阅读 · 0 评论 -
SceneKit一个3D场景角色的代码重构
SuperSpaceMan3D是一个以SceneKit为基础的小游戏项目,作者展示了用SceneKit开发3D游戏的强大威力.不过在实际运行时会发现有一些小bug,这里我们依次尝试将其修复首先,当spaceman接触到敌人的时候,游戏结束,弹出GameOver视图,然后当玩家再触摸屏幕时,开始新的游戏.在实际游戏中发现,spaceman接触敌人后GameOver视图很快闪过,游戏随即重新开始,不能达原创 2016-07-08 13:29:26 · 2509 阅读 · 0 评论 -
SceneKit做一个旋转的地球效果
SceneKit可以用寥寥几行帮你完成很多OpenGL复杂的3D设置代码,下面本猫就带大家完成一个旋转的3D地球的场景.首先需要地球表面图片,将其导入到Xcode中:我们用SceneKit内置的几何球体类创建一个球的实例,并且将地球表面图片应用在球的表面上:let globe = SCNSphere(radius: 15.0)let globeNode = SCNNode(geometry: gl原创 2016-07-02 21:29:59 · 7458 阅读 · 0 评论 -
SceneKit:简单的3D游戏场景搭建
SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情.首先你必须用其他3D建模工具生成你需要的3D模型,后缀为dae或者scn,应该还附带一张纹理图片.可以将3D模型文件连同纹理图片导入Xcode,以下是一个例子可能有些童鞋不知道如何打开场景图(scene graph)原创 2016-06-30 20:18:58 · 8328 阅读 · 1 评论 -
SpriteKit给游戏弹跳角色添加一个高度标示器
这是一个类似于跳跃涂鸦的小游戏,主角不断吃能量球得到跳跃能量向更高的地方跳跃,如果图中碰到黑洞就挂了…在游戏调试过程中如果能实时知道主角的高度就好了,这将有助于程序猿动态的判断游戏胜败逻辑.你可以用print将高度显示在控制台中,不过这观看起来可不是太方便,索性就让我们把高度标示和游戏主角自己紧密结合起来吧! ;]因为在SpriteKit中任何SKNode对象及其子对象都可以包含孩子,它们可以和父节原创 2016-06-28 15:29:24 · 3528 阅读 · 1 评论 -
SpriteKit:检测当新场景显示以后
Detecting When a New Scene Is PresentedSprite Kit在SKScene类中提供2个可以重载的方法用来检测当一个场景过渡出去或过渡进来的时候.第一个方法是SKScene的willMoveFromView()方法,该方法在一个SKScene被view删除时调用,为了重载该方法,你可以添加如下代码到你的SKScene实现中去:override func will翻译 2016-06-27 12:16:45 · 2189 阅读 · 0 评论 -
SpriteKit:在场景过渡中暂停动画
Pausing Scenes During a Transition你应该意识到两个重要的SKTrnsition属性在场景之间的过渡中.它们是pausesIncomingScene和pausesOutgoingScene,这些属性是bool类型,分别用来暂停入口和出口场景的动画.如果你想要在场景过渡中继续运行场景的动画,你只需要在显示场景之前将对应的属性设置为false.这两个属性的默认值都是tru翻译 2016-06-27 12:10:31 · 2090 阅读 · 0 评论 -
SKSpriteNode对象初始化在iPhone 6 plus中显示不正确的分析及解决
一个SpriteKit项目在其他设备上运行都无问题(无论是真机或是模拟器),但是在iPhone6 Plus上会出现精灵对象纹理被过度放大的现象:从上图中大家可以看到无论是主角或是道具球都过大了.看了一下精灵图片是放在atlas纹理集文件夹中的:可以看到PowerUp和Player都有对应缩放的版本:Player.png,Player@2x.png以及Player@3x.png.在各个图片的属性中检查原创 2016-06-23 17:53:22 · 4686 阅读 · 0 评论 -
SpriteKit物理引擎碰撞中5个重要信息
我们知道在SpriteKit物理引擎实际是基于Box2D!在SpriteKit中当你设置好适当的碰撞参数后,通过遵守SKPhysicsContactDelegate,你可以选择实现2各碰撞回调方法:didBeginContactdidEndContact方法中会传递一个参数,其类型为SKPhysicsContact,其中含有5个非常重要的碰撞信息,下面分别介绍一下:bodyA 类型为SKPhy原创 2016-06-21 10:09:35 · 3764 阅读 · 0 评论 -
SpriteKit关于SKScene中的渲染Loop
在本节中,我将来说明一下SKScene在SKView显示之后发生了神马.在更传统的iOS app中,你可能只会渲染view的内容仅仅一次,然后它将保持静态直到view的模式发生了显示的改变,这对于商业app很好,但是游戏app会潜在发生连续不断的改变.因为这个动态的因素,SpriteKit会连续不断的更新scene和它的内容,这种连续更新称之为渲染循环(rendering loop):如上图所示,每翻译 2016-06-16 12:31:59 · 5339 阅读 · 0 评论 -
一张图带你看懂SpriteKit中Update Loop究竟做了神马!
1首先Scene中只有开始一点时间用来回调其中的update方法 ;]2然后是Scene中所有动作的模拟3接下来是上一步完成之后,给你一个机会执行一些代码4然后是Scene模拟其中的物理世界5在第4步完成后,照例给你一个机会做一些操作6Scene应用其中精灵上的一些限制7在应用限制之后给你一个执行的机会8全部Update都已完成,你可以在这里做最后的调整.比如修正精灵的位置,大小等9SKView最终原创 2016-06-13 21:05:23 · 3769 阅读 · 1 评论 -
SpriteKit游戏Delve随机生成地牢地图一个Bug的修复
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图都是随机生成的.至于如何在生成地图时兼顾随机性和一定模式,网上有很多不错的建议.你也可以从Delve的源代码中找到答案(如果学习目的需要源代码的可以Q我,或者自行度娘)这里只是谈一下源代码中有一个原创 2016-05-16 15:17:58 · 5600 阅读 · 6 评论 -
SpriteKit塔防游戏动态改变防御塔价格标签的颜色
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)本篇blog在DinoDefense塔防游戏基础之上做一处小的修改,如果不知道该游戏是啥,请自行度娘或谷哥补脑…该游戏在用户点击防御塔基座时会弹出购买菜单:游戏HUD界面上方有用户剩余金币数量,每个防御塔有其自己的价格,如果用户持有的金币数量小于塔的价格,应原创 2016-05-12 10:34:27 · 1631 阅读 · 0 评论 -
Swift中方法闭包参数不能省略括号的一种情况
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)我们知道在swift中,如果方法的最后一个参数是一个闭包类型,则可以省略该参数,直接在函数后面跟一个闭包,比如:func test(count:Int,(Int)->Bool){ //...}可以这么调用:test(11){(x)->Bool in原创 2016-05-07 09:03:04 · 2156 阅读 · 0 评论 -
Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)在新的Xcode中之前可以正常运行的SKAudioNode代码貌似会有一些小问题,这发生在场景转换后.比如游戏主场景GameScene在New Game后会创建自身一个新的实例然后转换过去:let newScene = GameScene(fileNamed原创 2016-05-04 22:09:13 · 4666 阅读 · 0 评论 -
Xcode7.3中SKAudioNode"诡异"初始化的解决
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)我没有在之前版本的Xcode中测试,不过很多人反映SKAudioNode的初始化代码在Xcode7.3之前工作的十分美好,不过在7.3中以下代码出错:var bgMusic:SKAudioNode!func playBgMusic(name:String){原创 2016-05-04 08:58:34 · 2936 阅读 · 0 评论 -
Xcode的playground中对于SpriteKit物理对象的更新为何无效
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)为了便于SpriteKit中物理行为的调试,我们可以借助于Xcode的playground的强大机制.我们只需要随时修改我们的代码,就可以在观察窗中立即观察到物理对象的变化.现在为了给眼睛观察一定延时时间,我们写一个延时方法:public func dela原创 2016-04-26 11:34:53 · 3612 阅读 · 0 评论 -
SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)该挑战的目的是僵尸碰到敌人时,将其设置为无敌模式,具体要求如下: • You should create a variable property to track whether or not the zombie is invincible. •原创 2016-04-20 17:05:40 · 1528 阅读 · 0 评论 -
SpriteKit中的共享动作(Sharing Actions)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)在SpriteKit中某些动作需要一些额外的延时,如果每次都重新创建就会代码不必要的性能浪费,比如SKAction.playSoundFileNamed动作.该动作加载一个声音文件然后播放.比如我希望场景中每个圆球碰撞时就播放一次(相同的)声音,我可以这么写原创 2016-04-20 13:16:41 · 1033 阅读 · 0 评论 -
SpriteKit中为何不要在update方法中测试碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)我们若要在游戏中做碰撞检测有2种办法,一是利用物理引擎,二是自己写代码做每个Node的碰撞检查.如果自己写检测代码,将检测代码放在哪里是一个问题.一般的你可能想到的第一个地方是update方法中,所以你可能会这么写代码:override func updat原创 2016-04-20 12:55:21 · 1511 阅读 · 0 评论 -
SpriteKit中类似Cocos2D的CCActionSpawn并发方法GroupAction
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)我们知道在Cocos2D中对于并发Action的处理可以使用CCActionSpawn来完成,默认的我们还可以使用自然的方式,比如两次调用runAction来实现相同的效果,比如:target.runAction(action1)target.runAct原创 2016-04-20 09:22:41 · 988 阅读 · 0 评论 -
SpriteKit中反转Action需要注意的问题
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)我们知道在SpriteKit中同样有Cocos2D中类似的Action的概念,某些Action也是可以反转的.你可能要问我怎么知道哪些Action是可反转的,哪些不能?这个好办,一般你可以通过看Action的类型初步的判断,比如哪些MoveByXXX的动作都原创 2016-04-19 20:35:15 · 1508 阅读 · 0 评论 -
SpriteKit中节点的z-position
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!每一个节点都有一个zPosition属性,默认值是0每一个节点按照翻译 2016-04-17 07:57:44 · 1631 阅读 · 0 评论