从零开始的8-bit迷宫探险【Level 22】奥义隐身术 & 时间静止术

山姆开始发现这座森林里还有一些奇妙的情况。
偶而时间会变得缓慢,宁静的像是只有自己一个人在行走。
彷佛和森林处在两种平行时空中...

今日目标

  • 在迷宫中加上香菇,主角吃到後会使怪物停止移动一段时间
  • 主角移动到能隐身的树的位置时,可以防止怪物的攻击

PS. 这里是开发 iOS 手机游戏的系列文,如果还没看过之前 剧情 文章的朋友,欢迎先点这边回顾唷!


在迷宫中加上香菇

地图阵列加上香菇

在先前的章节已经设定过我们地图上要画的图片代号,想复习的朋友可以点这边

  • 我们使用 + 代号代表这个位置要画上香菇
  • GameScene.swift
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",
]

准备香菇图片

请准备好图片,并且拖拉进专案中
https://imgur.com/f7DWyiz.png

加上香菇

  • 先宣告香菇阵列的变数 mushrooms,虽然目前游戏只设定有一个香菇,但用阵列的好处是未来还可以再扩充
  • 在先前的 drawMap 方法里,再加上 "+" 的 case
  • 新增收集物类别 Collection 的实体 mushroom,将需要的参数带入
  • mapNode 里加入香菇的 node
  • 将香菇的实体存在 mushrooms 阵列中
  • GameScene.swift
class GameScene: SKScene {
    ...
    var mushrooms: [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 mushroom = Collection(gridWH: self.gridWH, gridX: j, gridY: i, imageName: "mushroom")
                    self.mapNode!.addChild(mushroom.node);
                    self.mushrooms.append(mushroom)
                default:
                    break
                }
            }
        }
    } 
}

执行结果

画面上出现一个香菇了!
https://imgur.com/VWjgqeG.gif


收集到香菇後,时间暂停

  • update 方法里,再加上主角跟香菇之间的位置判断,这边的方式与先前的其他收集物判断方式一样,当香菇还没有被收集、并且位置跟主角一样时,做以下动作:
    • 将香菇设定为已收集 setGotten(isGotten: true)
    • 将所有怪物都设定为不能移动 setCanMove(isCanMove: false)
    • 新增 stopWeatherTimer,设定 10 秒过後执行 stopWeatherAction
  • stopWeatherAction
    • 让所有怪物恢复成可以移动 setCanMove(isCanMove: true)
    • 让所有怪物开始自动移动 startMove(direction: .NONE)
  • stopTimer 方法中,将 stopWeatherTimer 停止
  • GameScene.swift
class GameScene: SKScene {
    ...
    var stopWeatherTimer: Timer? = nil
    ...
    override func update(_ currentTime: TimeInterval) {
        ...
        for mushroom in self.mushrooms where !mushroom.isGotten && mushroom.gridX == sam.gridX && mushroom.gridY == sam.gridY {
            mushroom.setGotten(isGotten: true)
            for weather in self.weathers {
                weather.setCanMove(isCanMove: false)
            }
            self.stopWeatherTimer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(stopWeatherAction), userInfo: nil, repeats: false)
        }
    }
    @objc func stopWeatherAction() {
        self.stopWeatherTimer = nil
        for weather in self.weathers {
            weather.setCanMove(isCanMove: true)
            weather.startMove(direction: .NONE)
        }
    }
    func stopTimer() {
        if let stopWeatherTimer = self.stopWeatherTimer {
            stopWeatherTimer.invalidate()
            self.stopWeatherTimer = nil
        }
    }
}

来看一下成果吧

吃到香菇後,怪物们暂停了 10 秒钟,之後又恢服原样
https://imgur.com/JWdyaph.gif


能隐身的树

我们在先前制作迷宫的章节已经加上能隐身的树 (紫色的树),现在我们来制作它的效果吧!

调整层级

  • 首先,先回忆一下之前已经加好的层级,紫色的树是在最上方,由於他不属於真正的墙壁,所以主角跟怪物都可以移动到这一格的位置
  • GameScene.swift
enum ZPosition {
    static let HIDE = -1
    static let COLLECTION = 1
    static let SAM = 2
    static let WEATHER = 3
    static let PURPLE_TREE = 4
}
  • 回到之前画地图的方法,加上判断字元为 #,则将 zPosition 调整为 ZPosition.PURPLE_TREE
  • GameScene.swift
class GameScene: SKScene {
    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 _ where mapKeys.contains(mapRowArr[j]):
                    let spriteItem = SKSpriteNode(imageNamed: wallMapping[mapRowArr[j]]!);
                    spriteItem.anchorPoint = CGPoint(x: 0.5, y: 0.5);
                    spriteItem.size.width = CGFloat(gridWH);
                    spriteItem.size.height = CGFloat(gridWH);
                    spriteItem.position = CGPoint(x: gridWH * j + (gridWH/2), y: -gridWH * i - (gridWH/2));
                    if mapRowArr[j] == "#" {
                        spriteItem.zPosition = CGFloat(ZPosition.PURPLE_TREE)
                    }
                    self.mapNode!.addChild(spriteItem)
                ...
                }
            }
        }
    }
}

让主角与怪物在这格碰触时,没有反应

  • 定义紫色的树的格子位置
  • GameScene.swift
struct gridMapping {
    ...
    struct purpleTree {
        static let x = 9
        static let y = 13
    }
}
  • 将侦测怪物与主角碰触的判断,再加上主角不位於紫色的树的位置时,才做後续的动作
    • 判断 gridMapping.purpleTree.x 不等於主角的格子 x 且 gridMapping.purpleTree.y 不等於主角的格子 y
  • GameScene.swift
class GameScene: SKScene {
    override func update(_ currentTime: TimeInterval) {
        ...
        for weather in self.weathers where (weather.gridX == sam.gridX && abs(weather.node.position.y - sam.node.position.y) <= CGFloat(self.gridWH + 6) || weather.gridY == sam.gridY && abs(weather.node.position.x - sam.node.position.x) <= CGFloat(self.gridWH + 6)) && (gridMapping.purpleTree.x != sam.gridX && gridMapping.purpleTree.y != sam.gridY)
        {
            ...
        }
    }
}

执行结果

https://imgur.com/EJYTik2.gif


今日小结

大家可以发挥个人创意,新增更多种类的道具在游戏中喔!/images/emoticon/emoticon69.gif


<<:  Day18 vue.js新增文章

>>:  停下来,回头望,比较快

CompTIA SY0-601 Braindumps - All About The SY0-601 Exam

Most of the aspiring professionals are getting cer...

[Day30] 後记

很谢谢各位的支持, 让这趟连续30天的教学旅程能告一段落。 在参考官方文件整理内容的过程中, 让我...

Day 22. 列表渲染 – v-for

昨天讲了条件渲染,今天来讲列表渲染(List Rendering)吧!! v-for 当我们在页面上...

Day03:小姐,你手上那是什麽?

昨天提到了一个奇怪的现象: byte num = 128; 如上撰写,你的IDE将会在128底下亮出...

Day 26 [其他04] ES6的Symbol竟然那么强大,面试中的加分点啊

文章选自 作者:xiaohesong 连接:https://juejin.im/post/68449...