从零开始的8-bit迷宫探险【Level 12】把迷宫涂上喜欢的颜色

刚踏入黑森林的第一步,就吹来一股寒风。
「究竟,这是座什麽样的森林呢?」
「不管了,我想成为第一个站上山顶的人!」山姆喃喃自语地说。

今日目标

  • 绘制图片
  • 将迷宫套上不同的图片

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


风格与绘图

这次的游戏想做像素风格,让游戏有点怀旧的味道!
笔者选用这款「八位元画家」APP,作画,使用 16x16 的画布尺寸,并汇出成 256x256 px 的图片
觉得好用的功能:

  • 支援透明度
  • 不同尺寸的画布
  • 可以移动、水平翻转、旋转
  • 可以复制画过的图片
  • 汇出图片时可以选择不同图片大小

操作画面:
https://imgur.com/cYWtaXV.png

来源:八位元画家

开始准备素材

依据企划书定的墙壁种类,我们准备以下素材:
其中白色文字的是真实的墙壁,黄色文字是假的墙壁 (能隐身的树)
https://imgur.com/xtGaiqu.png


将迷宫套上图片

先写墙壁的对应表,将字元及代表的图片档名定义好:

  • GameScene.swift
let wallMapping: [Character: String] = [
    "a": "wall-line-1",
    "b": "wall-line-2",
    "c": "wall-line-3",
    "d": "wall-line-4",
    "e": "wall-line-5",
    "f": "wall-line-6",
    
    "g": "wall-corner-1",
    "h": "wall-corner-2",
    "i": "wall-corner-3",
    "j": "wall-corner-4",
    "k": "wall-corner-5",
    "l": "wall-corner-6",
    "m": "wall-corner-7",
    "n": "wall-corner-8",
    
    "o": "wall-intersection-1",
    "p": "wall-intersection-2",
    
    "q": "wall-end-1",
    "r": "wall-end-2",
    "s": "wall-end-3",
    "t": "wall-end-4",
    "u": "wall-end-5",
    "v": "wall-end-6",
    
    "w": "lake-1",
    "x": "lake-2",
    "y": "lake-3",
    "z": "lake-4",
    
    "1": "tree-green",
    "2": "leaf",
    "3": "wood",
    
    "#": "tree-purple"
]

参考前一天定义的 map 阵列,将墙壁 "w" 调整为想显示的图片的对应字元,命名为另一个绘图的阵列 mapDraw
目前我们有两个地图阵列:

  • map:可用来判断是否为墙壁
  • mapDraw:画迷宫时的依据
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",
]

调整前一天绘制迷宫的方法:

  • map 改为 mapDraw,改从绘图的阵列取得资讯
  • 使用 wallMapping.keys 取得墙壁对应表的所有 key
  • switch case 中,利用 where 来侦测当前的字元是否有被涵盖在 mapKeys 中。如果有则使用 wallMapping 来取得对应的图片名称
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));
                self.mapNode!.addChild(spriteItem);
            default:
                break
            }
        }
    }
}

运行後可以看到以下成果:
https://imgur.com/N4X8gd3.png


今日小结

我们的迷宫变得更精致了!是不是更有游戏的 FU 了呢!
大家可以用程序写出自己想要的迷宫样子,并且自由地套上不同样式的图片,制作成属於自己的迷宫。
明天开始来制作主角吧~/images/emoticon/emoticon08.gif


<<:  [Day06] Flutter with GetX shared_preference

>>:  用订便当讲解订定题目的用途 | ML#Day12

30天学习笔记 -day 29-bottomsheetDialog

bottomsheetDialog是一种底部弹出的Dialog。今天会实作一个简单的自定义botto...

Golang 转生到web世界 - gin新手村

Golang Gin初探 网路上都有golang的各种框架,也不乏各式各样的比较文 ,我原本是选好要...

Day 6:Hello....iOS world! 建立第一个KMM专案(iOS)

Keyword:Xcode,simulator 到Day6完成第一个KMM专案的Code放在 KMM...

用 Line LIFF APP 实现信箱验证绑定功能(4) - 表单验证电子邮件地址

前几天完成了一个简单发送认证码的 LIFF APP,其实还有很多可以优化的地方,像是在送出 Requ...

# Day 7 Supporting PMUs on RISC-V platforms (三)

今天没意外的话,会是 Supporting PMUs on RISC-V platforms 的最後...