SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
该挑战的目的是僵尸碰到敌人时,将其设置为无敌模式,具体要求如下:
• You should create a variable property to track whether or not the zombie is invincible.
• If the zombie is invincible, you shouldn’t bother enumerating the scene’s cat ladies.
• If the zombie collides with a cat lady, don’t remove the cat lady from the scene. Instead, set the zombie as invincible. Next, run a sequence of actions that first makes the zombie blink 10 times over three seconds, then runs the block of code described below.
• Theblockofcodeshouldsethiddentofalseonthezombie,makingsurehe’s visible at the end no matter what, and set the zombie as no longer invincible.
书上的实现如下:
func zombieHitEnemy(enemy: SKSpriteNode) {
enemy.removeFromParent()
runAction(enemyCollisionSound)
invincible = true
let blinkTimes = 10.0
let duration = 3.0
let blinkAction = SKAction.customActionWithDuration(duration) { node, elapsedTime in
let slice = duration / blinkTimes
let remainder = Double(elapsedTime) % slice
node.hidden = remainder > slice / 2
}
let setHidden = SKAction.runBlock() {
self.zombie.hidden = false
self.invincible = false
}
zombie.runAction(SKAction.sequence([blinkAction, setHidden]))
}
func checkCollisions(){
if invincible {
return
}
var hitEnemies: [SKSpriteNode] = []
enumerateChildNodesWithName("enemy") { node, _ in
let enemy = node as! SKSpriteNode
if CGRectIntersectsRect(
CGRectInset(node.frame, 20, 20), self.zombie.frame) {
hitEnemies.append(enemy)
}
}
for enemy in hitEnemies {
zombieHitEnemy(enemy)
}
}
我觉得有几点可以完善的地方:
- 每次都需要新建blinkAction,有点浪费.可以使用共享Action
- 僵尸变为无敌后,如果敌人出现够快还是会删除其他敌人
我把blinkAction设置为lazy的计算属性,然后直接在场景子节点枚举中处理与敌人的碰撞,然后直接跳出遍历,这可以保证只会删除第一个碰撞的敌人:
lazy var blinkAction:SKAction = {
let blinkTimes = 10.0
let duration = 3.0
let blinkAction = SKAction.customActionWithDuration(duration){node,elapsedTime in
let slice = duration/blinkTimes
let remainder = Double(elapsedTime) % slice
node.hidden = remainder > slice / 2
}
return blinkAction
}()
func checkCollisions(){
if zombieInvincible{
return
}
var hitEnemies:[SKSpriteNode] = []
enumerateChildNodesWithName("enemy"){node,stop in
let enemy = node as! SKSpriteNode
if CGRectIntersectsRect(CGRectInset(enemy.frame, 20, 20), self.zombie.frame){
hitEnemies.append(enemy)
self.zombieInvincible = true
let seq = SKAction.sequence([self.blinkAction,SKAction.runBlock(){
self.zombie.hidden = false
self.zombieInvincible = false
}])
self.zombie.runAction(seq)
stop.memory = true
}
}
for enemy in hitEnemies{
zombieHitEnemy(enemy)
}
}
SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法的更多相关文章
- 使用webstrom开发react-native时react-native代码会出现红色下划线的解决方法
问题:使用webstrom开发react-native时react-native代码会出现红色下划线的解决方法 解决方法:webstrom ->preferences->Laugrange ...
- Swift - 多层无缝循环滚动背景(SpriteKit游戏开发)
在游戏开发中,比如跑酷游戏.我们需要实现背景的无限循环滚动,来营造运动的效果.除了单层的背景滚动,还有视差滚动. 视差滚动是指让多层背景以不同的速度移动,形成立体的效果,从而带来非常出色的视觉体验. ...
- [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法
最近在开发一个工程,其中用到了一个开源的库项目Android-ViewPagerIndicator. 这个项目是作为一个库出现的,如下图: 这个项目中包含了android-support-v4.jar ...
- 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法
实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...
- 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法
因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...
- Swift - 跑酷游戏开发(SpriteKit游戏开发)
一,下面演示了如何开发一个跑酷游戏,实现的功能如下: 1,平台工厂会不断地生成平台,并且向左移动.当平台移出游戏场景时就可将其移除. 2,生成的平台宽度随机,高度随机.同时短平台踩踏的时候会下落. 3 ...
- SpriteKit游戏开发适配iPad/iPhone6/7/8/Plus及iPhoneX的尺寸及安全区域
未适配前:Ball球超过屏幕的上下方 适配后:Ball球就在屏幕的可视范围内运动了 一.那么如何适配不同的iPhone.iPhoneX及iPad的屏幕尺寸呢? 我们开发一个App的时候, 通常希望 ...
- Swift - 给游戏添加背景音乐和音效(SpriteKit游戏开发)
游戏少不了背景音乐和音效.下面我们通过创建一个管理音效的类,来实现背景音乐的播放,同时点击屏幕可以播放相应的音效. 声音管理类 SoundManager.swift 1 2 3 4 5 6 7 8 9 ...
- Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)
下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取. 样例说明: 1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机) 2,点击屏幕可以让熊猫跳跃 3,熊猫碰到苹果,苹果消失 运行效果: 样 ...
随机推荐
- [LeetCode] Smallest Good Base 最小的好基数
For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1. Now given a str ...
- Java基础知识回顾之四 ----- 集合List、Map和Set
前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...
- python字符串-内置方法用法分析
1.字母大小写相关(中文无效) 1.1 S.upper() -> string 返回一个字母全部大写的副本
- [SCOI 2016]背单词
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- 【luogu3174】【HAOI2009】毛毛虫
Description 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. Input 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...
- hdu 5112 (2014北京 水)
题意:有个人在跑步,一直每个时间他所在的位置,求最大速度 #include <iostream> #include <cstring> #include <cstdio& ...
- 【NOIP2017 OFO(下)】
·我不知道对不对,只是不想让大米兔就这样离开. by tkys_Austin; [另一只情绪化的兔子] 今年的11月12日NOIP提高组, ...
- bzoj 1875: [SDOI2009]HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- python设计模式浅析
今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...
- Python作业之多级菜单
作业之多级菜单 菜单实现要求: 1. 列出菜单选择供选择 2. 选择对应内容进入下一级菜单 3. 任何时候都可以选择退出程序或返回上一级菜单 具体代码如下: goods = {'华为':{'A系':{ ...