Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
 
Reply to this topicStart new topic
> 《真菌洞窟(Fungus Cave)》十月开发日志
Bozar
2018-10-26, 22:53
Post #1


GEEKs will Eventually Evolve into Kryptonians. | All my jokes are cries for help.
Group Icon
 1406
   88

Group: Avatar
Posts: 1156
Joined: 2008-05-18
Member No.: 21346




## 游戏简介

[《真菌洞窟(Fungus Cave)》](https://github.com/Bozar/FungusCave)是一款正在开发的单人、回合制 Unity Roguelike 游戏。截止到目前(2018 年 10 月底),从 Github 提交记录来看制作了一个月,但是最初的构思八月份已经想好了。

» Click to show Spoiler - click again to hide... «

图 1:演示动画,十月底。

» Click to show Spoiler - click again to hide... «

图 2:演示动画,十月初。

关于寻找灵感,我写过两篇文章:[《如何找到灵感,设计一款 Roguelike 游戏》](https://trow.cc/board/showtopic=30178&st=0&p=188045&#entry188045),[《再谈寻找灵感制作 Roguelike 游戏》](https://trow.cc/board/showtopic=36932),所以这篇文章不谈制作游戏,分享一点写代码的体会。

## 书籍和开发工具

前面提过,《真菌洞窟》是用 Unity 开发的,而 Unity 的脚本语言是 C#。这门语言不太适合初学者。如果你以前既没写过代码,也没做过 Roguelike 游戏,我建议先用 Javascript、Python 或者 Lua 做一款小游戏;然后学一点数据结构和算法,参考这篇文章:[《浅谈 Roguelike 游戏中的算法》](https://trow.cc/board/showtopic=36945)。说到 C# 和 Unity,我读过三本书:

* [C# 7.1 and .NET Core 2.0 – Modern Cross-Platform Development](https://www.amazon.cn/dp/B0751HBGHK/)
* [Unity 2018 By Example](https://www.amazon.cn/dp/B0789J4DVP/)
* [Mastering Unity 2D Game Development](https://www.amazon.cn/dp/B01HY3TC6I/)

C# 7.1 这本书分为三部分:第一部分讲解 C# 语法,第二部分介绍 .NET Core,第三部分主要讲了用 ASP.NET Core 开发 App。第一部分仔细读,第二部分看一下前几章,C# 知识差不多够用了。Unity 那两本书,我没花太多时间研究具体的代码,重点关注 Unity 的开发流程和使用方法。

如果学有余力,我再推荐两本 C# 教材:

* [C# 7.0 in a Nutshell](https://www.amazon.cn/gp/product/B076DMK61S/)
* [Programming WPF](https://www.amazon.cn/gp/product/B0043D2EP4/)

关于开发工具,除了多元宇宙最强 IDE Visual Studio,再推荐两个:沃冈人(Vogon)赞不绝口的(“那个 Push 按钮又大又圆”)代码管理软件 [Sourcetree](https://www.sourcetreeapp.com/),从白银时代流传至今的文件管理器 [Far Manager](https://farmanager.com/)。后者的使用方法详见[《Far Manager 快速上手指南》](https://trow.cc/board/showtopic=37039)。

最后,经常浏览 Reddit 的 roguelikedev 分区,记得去 B 站看一下用 Unity 制作 Roguelike 的视频。还有啊,《真菌洞窟》的灵感来自《牙狼》,但是《牙狼》三部动画片,我觉得看现代背景的那一部就够了——满分五星,我给钉宫一万颗星。

» Click to show Spoiler - click again to hide... «

图 3:那么,今天就先摸鱼吧!

## 算法:生成地形和渲染视野

简单说说游戏里的两个算法。

生成地形需要三个步骤:

* 生成墙壁。
* 把空地改成水池,但是不影响墙壁。
* 把墙壁改成真菌。

后两步很容易,讲一下生成墙壁的 [海绵算法](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/BlueprintSponge.cs)。首先生成一个二维数组,初始值是“地板”。接下来,把一部分“地板”改为“墙壁”。

* 随机选择一块矩形区域,内部没有墙壁。
* 把矩形向内收缩一格。这是为了确保玩家人物始终能绕过该区域。
* 用墙壁填满缩小的矩形。
* 选择矩形较长的边,从左到右或者从下往上挖一条隧道。
* 如果矩形特别大,再挖一条隧道。
* 矩形的每个角都有 66% 的几率被挖掉。

最后生成的墙块看起来像多孔海绵。

» Click to show Spoiler - click again to hide... «

图 4:随机生成的墙壁。

视野由三个类(Class)合作完成渲染。

* [FieldOfView](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/FieldOfView.cs) 生成一个二维数组,数组中的每个元素对应地下城里的一格。每格有三种状态:未知,已知,在视野内。默认状态是“未知”,每次渲染的第一步是把所有的“在视野内”改成“已知”。
* [RenderSprite](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/RenderSprite.cs) 是渲染的最后一步。游戏对象(Game Object)查询自己在视野数组里的位置,根据视野状态改变颜色:“未知”是“黑色”,“已知”是“灰色”,“在视野内”是“白色”。
* [FOVRhombus](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/FOVRhombus.cs) 读取观察者的坐标作为输入,改变视野数组的状态。这个类生成另一个二维数组,用来记录地下城里每一格到观察者的距离。

» Click to show Spoiler - click again to hide... «

图 5:距离示意图。

FOVRhombus 先更新距离数组,再修改视野数组:

* 从观察者所处位置出发,遍历“距离数组”里的每个元素,计算每一格到观察者的距离。如果当前格是墙壁,把坐标压进 wallStack。
* 对于 wallStack 里的每一个坐标,检查附近菱形区域里的所有格子。向远离观察者的方向“投下阴影”(增加距离)。
* 检查“距离数组”里的每个元素。如果距离值小于等于观察者的最大视距,将“视野数组”里对应元素的状态改成“在视野内”。

» Click to show Spoiler - click again to hide... «

图 6:渲染视野。

实际效果见图 1,测试动画见图 6。红色是不考虑阴影,菱形视野能看到的最大范围,白色是收缩后的视野。



This post has been edited by Bozar: 2018-10-27, 00:11
TOP
Fast ReplyReply to this topicStart new topic
 


Time is now: 2024-06-28, 13:01