Printable Version of Topic

Click here to view this topic in its original format

The Ring of Wonder _ The Plane of Unreal: Game General 『游戏荟萃』 _ 《真菌洞窟(Fungus Cave)》十二月开发日志

Posted by: Bozar 2019-01-01, 14:35



## 游戏简介

[《真菌洞窟(Fungus Cave)》](https://github.com/Bozar/FungusCave)是一款正在开发的单人、回合制 Unity Roguelike 游戏。这个月主要做了三件事情:

* 为 NPC 添加 AI。
* 学习怎样用 Dijkstra map 写逃离算法。
* 新增检查模式(Examine mode)。

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

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

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

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

## 演员 AI

NPC AI 的核心,[ActorAI](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/ActorAI.cs) ,是一棵非常简单的决策树:

* 如果 PC 在攻击距离内,攻击 PC。
* 如果 PC 在视线内,接近 PC。
* 原地等待一轮。

NPC 和 PC 共用一套攻击和等待的代码。[十一月开发日志](https://trow.cc/board/showtopic=37213) 里解释过 PC 的自动探索算法,这里只要把目的地从“PC 未知的区域”改为“PC 所在位置”,就能让 NPC 接近 PC 了。

## 逃离算法

先前没看懂 [Dijkstra Maps Visualized](http://www.roguebasin.com/index.php?title=Dijkstra_Maps_Visualized) 这篇文章提到的逃离 AI(Fleeing AI),这个月画了几张图,终于弄明白了。我们考虑一种简单的情况(见下图,D1):PC(@)在长方形房间内,左边的哥布林(g)试图逃离 PC,躲进走廊。

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

图 3:逃离算法。

* 第 1 步:假定 PC 所在位置是目的地,标记距离(图 I)。
* 第 2 步:所有距离乘以 -1.2(图 II-A)。
* 第 3 步:把图 II-A 中的最小值看作目的地,重新标记距离(图 III)。
* 第 4 步:将图 II-A 和图 III 的结果相加,得到最终的距离(图 IV-A)。

不难发现哥(乔)布(瑟)林(夫)有两条逃跑路线:往下走躲进南面走廊,或者往上走躲进东面走廊。如果在第 2 步乘以 -1,最终得到图 IV-B。此时处于蓝色格子的哥布林有 2/3 的可能性放弃南面走廊,逃往距离更远的东面走廊。

那么,为什么选择长方形房间,而不是正方形(图 D2)?最小距离为什么是 10?答案留作习题。

## 检查模式

检查模式的需求很明确:

* 按 x 进入检查模式。
* 按 Esc 退出检查模式。
* 在检查模式里,按方向键移动检查标记(X)。
* 当检查标记覆盖 NPC 时,显示 NPC 的相关信息。

考虑到方向键在普通模式和检查模式里有不同的含义,我添加了一类特殊的 Game object:[CreateDoppleganger()](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/ObjectPool.cs) 。进入检查模式后,暂时禁用 PC 这个 Game object,让 Examiner 监听按键事件。具体代码由四部分组成:

* [SubGameMode](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/SubGameMode.cs) 负责开关检查模式。
* [UIExamine](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/UIExamine.cs) 绘制 UI。
* [ExaminerActions](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/ExaminerActions.cs) 监听输入事件。
* [MoveExamineMarker](https://github.com/Bozar/FungusCave/blob/master/Assets/Scripts/MoveExamineMarker.cs) 移动检查光标。

写了三个月 C#,最近越来越发现理论知识不够用,吃了没文化的亏。所以新的一年要多读书啊!

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

图 4:这个可以有(指学习)。


Posted by: onlysam 2019-01-07, 21:28

shifty.gif https://itch.io/jam/7drl-challenge-2019日期和页面出来了,大佬不参加一个么

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)