不知道跑了多久,可能有一世纪的感觉,山姆终於累得停了下来。
上帝关起了一道门,总会为你开启另一扇窗。
一片蓝色、发光的物体印入眼帘。
「难道这就是传说中的水晶!」山姆兴奋地拿起这个得来不易的珍宝。
PS. 这里是开发 iOS 手机游戏的系列文,如果还没看过之前
剧情文章的朋友,欢迎先点这边回顾唷!
我们新增一个共用的收集物类别,可以让水晶、魔幻水晶、香菇共同使用
首先新增一个 swift 档案
首先点选新增档案
选择 Swift File -> Next
将档案命名为 Collection,点击 Create 按钮,完成 .swift 档的新增
请记得先 import SpriteKit
import SpriteKit
记录收集物的属性:
在建构子 (init) 写上初始化时需带入的参数:
在建构子中,储存带入的参数值,并新增一个 SKSpriteNode
,imageNamed
带入图片名称,并将定位点 (anchorPoint)、尺寸 (size)、位置 (position)、层级 (zPosition) 都设定好。
新增 setGotten
方法
isGotten
的值isGotten
值,如果被收集了,就将 node 的 zPosition
设定为 ZPosition.HIDE
。反之则将 zPosition
设定为 ZPosition.COLLECTION
class Collection {
var node: SKSpriteNode
var gridX: Int = 0
var gridY: Int = 0
var isGotten: Bool = false
init(gridWH: Int, gridX: Int, gridY: Int, imageName: String) {
self.gridX = gridX
self.gridY = gridY
self.node = SKSpriteNode(imageNamed: imageName)
self.node.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.node.size.width = CGFloat(gridWH)
self.node.size.height = CGFloat(gridWH)
self.node.position = CGPoint(x: gridWH * gridX + (gridWH/2), y: -gridWH * gridY - (gridWH/2))
self.node.zPosition = CGFloat(ZPosition.COLLECTION)
}
func setGotten(isGotten: Bool) {
self.isGotten = isGotten
if isGotten {
self.node.zPosition = CGFloat(ZPosition.HIDE)
return
}
self.node.zPosition = CGFloat(ZPosition.COLLECTION)
}
}
在先前的章节已经设定过我们地图上要画的图片代号,想复习的朋友可以点这边
.
代号代表这个位置要画上水晶let mapDraw = [
"ccccccccpccccccci",
" .....e*......b",
"aam.1ji.s.11.zy.b",
" d.3gh....1.wx.b",
"jcl.....ji.1....b",
"d*...11.gh...rt.b",
"d.11.nm....2....b",
"d..1.kl.22.1.naah",
"ot... .b ",
"d..1.jcu vci.b ",
"d.12.d b.kccc",
"d+...gaaaaah. ",
"gaam. .11.n",
" d.rt.1#.q....b",
" d....21.e.ji.b",
"cccl.ji....e.gh.b",
" .gh.13.s....b",
"aaam....1....21.b",
" d...23.rt.1..b",
" d.1.........3b",
"jccl.1.rft.3.1.1b",
"d*.............*b",
"gaaaaaaaaaaaaaaah",
]
请准备好图片,并且拖拉进专案中
crystals
,准备将所有画面上的水晶存在这边drawMap
方法里,再加上 "." 的 casemapNode
里加入收集物的 node
crystals
阵列中class GameScene: SKScene {
...
var crystals: [Collection] = []
...
func drawMap() {
for i in 0..<gridYCount {
let mapRowArr = Array(mapDraw[i]);
for j in 0..<gridXCount {
let mapKeys = wallMapping.keys
switch mapRowArr[j] {
...
case ".":
let crystal = Collection(gridWH: self.gridWH, gridX: j, gridY: i, imageName: "crystal")
self.mapNode!.addChild(crystal.node);
self.crystals.append(crystal)
default:
break
}
}
}
}
}
水晶成功出现啦!
角色的层级也正常的显示在水晶上方。
接着再加上主角经过时,水晶消失的效果,就ok了!
update
方法里,再加上主角跟水晶之间的位置判断,当主角跟水晶的格子位置一样时,并且还没有被收集时,就将水晶设定成被收集了 setGotten(isGotten: true)
class GameScene: SKScene {
override func update(_ currentTime: TimeInterval) {
...
for crystal in self.crystals where !crystal.isGotten && crystal.gridX == sam.gridX && crystal.gridY == sam.gridY {
crystal.setGotten(isGotten: true)
}
}
}
成功出现水晶被收集的效果了!
有了收集物类别,明日来继续新增另一个魔幻水晶的类别吧!
纳粹德国的超强机器,唯有机器才能破解机器。 今天来介绍二战时期被纳粹大规模使用的加密机器 - Eni...
我们不能总在弹性限度里活动,要爆发,要超越,才会有质的提高。 《iT邦帮忙铁人赛的观点》(以下简称铁...
参、管理系统概述 品质管理系统应该是所有管理系统的基础,ISO/TC 176在制订品质管理系统的标准...
狙击气球 ( 两倍变焦 ) 教学原文参考:狙击气球 ( 两倍变焦 ) 这篇文章会延伸「 狙击望远镜 ...
在 Ruby 里,有类别 (class) 和模组 (module) ,但其实两者差别并不大哦! 他...