为什麽铁人 30 天的最後一篇标题是 Level 256 呢?
主要是致敬小精灵 Pac-Man 在第 256 关的时候,发生了知名的 Bug,画面上的乱码造成游戏无法再继续游玩。因为 8-bit 的正整数范围是 0~255,在第 256 关的时候发生了溢位 (overflow),导致关卡最多就停留在 256 关。
让我们来看一下游戏完成品吧!
在游戏实作的过程中,所使用到的技术及方法,整理在这边:
zPosition
childNode(withName:)
animate(with:timePerFrame:)
moveBy(x:y:duration:)
fadeAlpha(to:duration:)
sequence(_:)
run(_:)
repeat(_:count:)
repeatForever(_:)
update(_:)
SKTransition
SKLightNode
ambientColor
lightColor
shadowColor
falloff
categoryBitMask
lightingBitMask
viewSafeAreaInsetsDidChange()
sqrtf
random(in:)
abs(_:)
scheduledTimer(timeInterval:target:selector:userInfo:repeats:)
Codable
encode(_:)
contents(atPath:)
decode(_:from:)
AVAudioPlayer
整理了一下大纲,包含游戏实作各篇的成果,方便让大家能直接连结到想看的主题
前言
Xcode
Swift 基础语法
- 【Level 3】Swift 基础语法 (一)
- 变数及常数
- 字元、字串、整数、浮点数、布林值
- 【Level 4】Swift 基础语法 (二)
- 阵列 (Array)
- 字典 (Dictionary)
- 集合 (Set)
- 【Level 5】Swift 基础语法 (三)
- for-in、if-else、switch、function
- 【Level 6】Swift 基础语法 (四)
- 类别 (class)
- 协定 (protocol)
- 结构 (struct)
- 【Level 7】Swift 基础语法 (五)
- nil
- Optional
- if let、guard let
SpriteKit
- 【Level 8】与 SpriteKit 的初次见面 (一)
- SKView
- SKScene
- 【Level 9】与 SpriteKit 的初次见面 (二)
- SKNode
- SKSpriteNode
- SKLabelNode
- 座标系统
【Level 10】游戏故事及架构设计
- 游戏企划书
【Level 11】在 iPhone 里盖座迷宫,就。很。墙
- 创建专案
- 画面排版 (创建 SKSpriteNode 以及使用其属性)
- Safe Area 的概念
【Level 12】把迷宫涂上喜欢的颜色
- 绘制迷宫背景图片素材
- 将迷宫套上图片
【Level 13】主角总是孤独的
- 制作主角 (类别的概念)
- 主角的动画
【Level 14】让主角奔跑吧!Running Sam
- 新增方向按钮,控制主角的移动
- 在迷宫中的移动逻辑
【Level 15】迷人的反派角色-制作怪物
- 制作怪物
- 怪物的动画
【Level 16】丞相,起风了!远方飘来乌云怪物了
- 让怪物自动移动 (随机选方向移动)
【Level 17】稻草人也想要智慧大脑,给怪物一点灵魂跟一点点个性
- 让怪物追踪主角的位置来移动
- 让四种怪物各有不一样的追击方式
【Level 18】为什麽他们开始乱跑?捉摸不定的怪物移动模式
- 改变怪物的移动模式
- 使用计时器 (Timer)
【Level 19】这个相遇我等了一辈子了-侦测主角与怪物接触
- 侦测主角与怪物的接触
- 接触时的动画 (跌倒动画)
【Level 20】搜集水晶可以召唤神龙吗?
- 在迷宫中加入水晶 (收集物)
- 侦测主角碰触到水晶後,水晶消失
【Level 21】进击的主角!暴风雨来呐,你坐啊!
- 新增魔幻水晶
- 魔幻水晶的闪烁动画
- 主角收集魔幻水晶後的效果:怪物变成逃逸模式,主角可以反击怪物
【Level 22】奥义隐身术 & 时间静止术
- 新增香菇,主角吃到後可以让怪物停止移动一段时间
- 位於隐身的树,可以逃避怪物的攻击
【Level 23】长老,这个水晶值多少钱?
- 将主角收集到水晶、魔幻水晶、香菇、击退怪物後的得分,显示在画面上
【Level 24】谁才是高玩?纪录本机最高得分
- 将最高得分存到本机中,下次开启游戏时可以显示最高得分纪录
【Level 25】今天又是崭新的一天,回到原点
- 新增主角生命值机制
- 游戏重新开始流程
【Level 26】这游戏没有华佗,不能补血啊!Game Over 场景切换
- 生命值用尽时,切换至游戏结束场景
- 点击重新开始按钮,可重新回到游戏场景
【Level 27】神助攻-老弟帮我配个音效
- 帮游戏配上音乐及音效
【Level 28】看我把关卡难度提升-在场景加上聚光灯效果
- 主角收集完全部水晶後,游戏进入下一关
- 增加关卡难度:加上 SKLightNode
【Level 29】让你的 App 与众不同!设计 Icon 及 LaunchScreen
- 加上 App icon
- 将萤幕锁定为直屏
- 调整启动画面
你问说,主角有没有原型,当然有啊!而且原型的名字就叫做 Sam,是个爬过 30 座百岳的男人。
他刚刚才和我说最近想安排一日单攻的百岳,还好铁人赛完赛了,是时候该切换成户外模式了!
他爬山会自带水壶、对讲机、封箱胶带 (鞋子开口笑的时候可以补救),是个有如百宝袋一般的登山夥伴。
当初跟他说主角叫做山姆时,他就回了这麽一句:『不能画太丑』。殊不知,我把他画成了像素图 ^_^
最後,来聊一下 it 铁人 30 天的感想
人们常把人生比喻成爬山,我想,铁人赛也是类似爬山的一种感受吧!
『在 99% 的时间里痛苦挣扎,用 1% 的时间去享受登顶的喜悦』
这些成果是自己一点一滴累积起来,而最终完赛的喜悦也是属於自己的深刻感受吧!
最後的最後,谢谢大家的阅读及陪伴
参考来源:
Pac-Man
小精灵游戏中的幽灵是怎麽追踪人的? 鲜为人知的bug和最快全破世界纪录! | 啾啾鞋
zPosition
childNode(withName:)
animate(with:timePerFrame:)
moveBy(x:y:duration:)
fadeAlpha(to:duration:)
sequence(_:)
run(_:)
repeat(_:count:)
repeatForever(_:)
update(_:)
SKTransition
SKLightNode
ambientColor
lightColor
shadowColor
falloff
categoryBitMask
lightingBitMask
viewSafeAreaInsetsDidChange()
sqrtf
random(in:)
abs(_:)
scheduledTimer(timeInterval:target:selector:userInfo:repeats:)
Codable
encode(_:)
contents(atPath:)
decode(_:from:)
AVAudioPlayer
>>: [Day23]Vue3 E2E Testing: Cypress 基本介绍
前言 昨天介绍了 Content Security Policy 跟 HTTP Strict Tra...
LAST Day 终於到了铁人赛的最後一天,过程中复习了不少的东西,对某些用法有了更加的认识,过程中...
任天堂在红白机之後的这台後继机种超级任天堂、以下简称 SFC、是我家当年的第三台主机、也是我曾经拥有...
连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...
前几篇介绍了 Form 的基本操作与概念,也介绍了如何在表单中加入验证,最後要来介绍 Angular...