撰写了文章 发布于 2018-10-26 23:24:03
《真菌洞窟(Fungus Cave)》十月开发日志
游戏简介
《真菌洞窟(Fungus Cave)》是一款正在开发的单人、回合制 Unity Roguelike 游戏。截止到目前(2018 年 10 月底),从 Github 提交记录来看制作了一个月,但是最初的构思八月份已经想好了。
图 1:演示动画,十月底。
图 2:演示动画,十月初。
关于寻找灵感,我写过两篇文章:《如何找到灵感,设计一款 Roguelike 游戏》,《再谈寻找灵感制作 Roguelike 游戏》,所以这篇文章不谈制作游戏,分享一点写代码的体会。
书籍和开发工具
前面提过,《真菌洞窟》是用 Unity 开发的,而 Unity 的脚本语言是 C#。这门语言不太适合初学者。如果你以前既没写过代码,也没做过 Roguelike 游戏,我建议先用 Javascript、Python 或者 Lua 做一款小游戏;然后学一点数据结构和算法,参考这篇文章:《浅谈 Roguelike 游戏中的算法》。说到 C# 和 Unity,我读过三本书:
- C# 7.1 and .NET Core 2.0 – Modern Cross-Platform Development
- Unity 2018 By Example
- Mastering Unity 2D Game Development
C# 7.1 这本书分为三部分:第一部分讲解 C# 语法,第二部分介绍 .NET Core,第三部分主要讲了用 ASP.NET Core 开发 App。第一部分仔细读,第二部分看一下前几章,C# 知识差不多够用了。Unity 那两本书,我没花太多时间研究具体的代码,重点关注 Unity 的开发流程和使用方法。
如果学有余力,我再推荐两本 C# 教材:
关于开发工具,除了多元宇宙最强 IDE Visual Studio,再推荐两个:沃冈人(Vogon)赞不绝口的(“那个 Push 按钮又大又圆”)代码管理软件 Sourcetree,从白银时代流传至今的文件管理器 Far Manager。后者的使用方法详见《Far Manager 快速上手指南》。
最后,经常浏览 Reddit 的 roguelikedev 分区,记得去 B 站看一下用 Unity 制作 Roguelike 的视频。还有啊,《真菌洞窟》的灵感来自《牙狼》,但是《牙狼》三部动画片,我觉得看现代背景的那一部就够了——满分五星,我给钉宫一万颗星。
图 3:那么,今天就先摸鱼吧!
算法:生成地形和渲染视野
简单说说游戏里的两个算法。
生成地形需要三个步骤:
- 生成墙壁。
- 把空地改成水池,但是不影响墙壁。
- 把墙壁改成真菌。
后两步很容易,讲一下生成墙壁的 海绵算法。首先生成一个二维数组,初始值是“地板”。接下来,把一部分“地板”改为“墙壁”。
- 随机选择一块矩形区域,内部没有墙壁。
- 把矩形向内收缩一格。这是为了确保玩家人物始终能绕过该区域。
- 用墙壁填满缩小的矩形。
- 选择矩形较长的边,从左到右或者从下往上挖一条隧道。
- 如果矩形特别大,再挖一条隧道。
- 矩形的每个角都有 66% 的几率被挖掉。
最后生成的墙块看起来像多孔海绵。
图 4:随机生成的墙壁。
视野由三个类(Class)合作完成渲染。
- FieldOfView 生成一个二维数组,数组中的每个元素对应地下城里的一格。每格有三种状态:未知,已知,在视野内。默认状态是“未知”,每次渲染的第一步是把所有的“在视野内”改成“已知”。
- RenderSprite 是渲染的最后一步。游戏对象(Game Object)查询自己在视野数组里的位置,根据视野状态改变颜色:“未知”是“黑色”,“已知”是“灰色”,“在视野内”是“白色”。
- FOVRhombus 读取观察者的坐标作为输入,改变视野数组的状态。这个类生成另一个二维数组,用来记录地下城里每一格到观察者的距离。
图 5:距离示意图。
FOVRhombus 先更新距离数组,再修改视野数组:
- 从观察者所处位置出发,遍历“距离数组”里的每个元素,计算每一格到观察者的距离。如果当前格是墙壁,把坐标压进 wallStack。
- 对于 wallStack 里的每一个坐标,检查附近菱形区域里的所有格子。向远离观察者的方向“投下阴影”(增加距离)。
- 检查“距离数组”里的每个元素。如果距离值小于等于观察者的最大视距,将“视野数组”里对应元素的状态改成“在视野内”。
图 6:渲染视野。
实际效果见图 1,测试动画见图 6。红色是不考虑阴影,菱形视野能看到的最大范围,白色是收缩后的视野。
目录
电波 1年前
Bozar [作者] 1年前
发布