Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
 
Reply to this topicStart new topic
> 《斧头人(Axe Man)》七月开发日志
Bozar
2019-07-21, 18:34
Post #1


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

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




## 引言

QUOTE
(define (Haruhi world) (if (boring? world) destroy (new SOS)))

## 游戏简介

《斧头人(Axe Man)》([Github 页面](https://github.com/Bozar/AxeMan),[英文博客](https://github.com/Bozar/DevBlog/wiki/Latest))是一款正在开发的单人回合制 Unity Roguelike 游戏。今年四月看凉宫春日,一边看一边构思游戏原型;五月底开始写代码,到今天已经两个月了。从游戏角度看,玩家需要用四种优势和四种劣势自行组合出四个技能,消灭地下城的敌人;从编程角度看,我大量使用了 [《真菌洞窟(Fungus Cave)》](https://github.com/Bozar/FungusCave) 制作末期才学会的事件模式(event pattern)。目前画好了游戏主界面,按方向键或 QWER 能够移动玩家人物或使用技能。更多功能尚未完成。

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

图 1:演示动画,七月。

## 自学计算机知识

先前写过学习 [算法](https://trow.cc/board/showtopic=36945) 和 [设计模式](https://trow.cc/board/showtopic=48413) 的文章。已有的电脑知识做游戏基本够用,不过呢,看到程序员锅锅每天早上先按四十二个修饰键煮咖啡,然后立即写了一个新接口(interface),我不禁要问:为什么你会这么熟练呢?我很好奇!于是找到了 [这份书单](https://teachyourselfcs.com/)。

这些书是好书,但是挺难读的,所以我定了一个学习计划。第一,每个主题限定在三个月内学完一遍。第二,不做课后题,但是每读完一章,画图总结一下。限定时间是因为哪怕延长到六个月,未必能收获双倍的知识,反而有可能消磨学习热情。不如先快速浏览一遍,按自己的理解画图标记重点,之后重新深入学习。

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

图 2:Nand2Tetris,第 4 章。

到现在为止,我看完了 SICP 前三章,正在学习 Nand2Tetris。因为没做题,对写代码帮助有限,但是满足了很多好奇心。比方说怎样用过程(procedure)而不是数据(data)定义有理数;怎样用接口组合一系列模块,然后添加抽象层隐藏细节;怎样让计算姬理解二进制代码。这些奇妙的知识常常令我感慨——白金齿轮驱动的神之机器啊,你真美丽。暂停吧,世界!

最后,上述两本书都有配套的讲课视频,推荐看一下:[SICP 公开课](https://www.bilibili.com/video/av8515129),[Nand2Tetris 公开课](https://www.bilibili.com/video/av16778784)。

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

图 3:我喜欢哔哩哔哩,还有大家!

## 搜索 Unity 游戏对象

(本章内容翻译自 [How To Search Game Objects In Unity](https://github.com/Bozar/DevBlog/wiki/Program_SearchObjectInUnity),略有删减。)

Unity 提供了若干方法搜索游戏对象,不过这些方法在某些场合无法满足我们的需求。比方说,FindGameObjectsWithTag() 只能接受一个参数,如果我们希望用两个标签描述一个对象该怎么办?对于一个 2D 战棋类游戏,怎样找到处于 [2, 2] 位置的所有对象?

假设我们已经设计好了一个自定义方法 Search(),显然它应该输出一系列符合搜索条件的游戏对象,那么输入是什么呢?上文说了,输入可以是一对整数,或者是自定义的数据标签。所以我们可以这样定义 ISearchObject:

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

图 4:ISearchObject。

接下来要解决两个问题。第一,怎样创建一个对象集合?第二,当我们遍历上述集合中的每一个元素时,怎样判断当前元素是否符合搜索条件?这是下图所示的解决方案之一。

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

图 5:搜索系统结构。

既然游戏对象的位置能够表示为一对整数,每次创建新对象时,我们不妨把它存放进二维数组 GameObject[,] dungeonBoard。接下来,我们能够直接获取特定位置的对象,或者遍历整个数组,找到符合条件的对象。有两个注意事项。第一,如果多个对象可能堆叠在同一位置,我们可以把它们存入不同的二维数组,或者把单个二维数组的元素从游戏对象改成字典:Dictionary`<`CustomTag, GameObject`>`。第二,当我们移动或删除游戏对象时,必须及时更新二维数组的内容。

判断对象是否符合条件很简单。首先,我们写一个方法([ConvertCoordinate](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/ConvertCoordinate.cs))把游戏对象的 Vector3 位置转化成两个整数;其次,我们给每个对象添加一个组件([MetaInfo](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/MetaInfo.cs)),其中包含了该对象的自定义数据标签。

向二维数组里添加或移除游戏对象时容易犯错,处理堆叠对象又挺麻烦的。换一个思路,为什么不能发布搜索事件([SearchObject](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/SearchObject.cs)),让每个对象订阅事件并作出反应呢([SubscribeSearch](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/SubscribeSearch.cs))?(见图 5 右侧的路线。)搜索事件的参数定义如下:

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

图 6:搜索事件的参数。

每个游戏对象检查自己的位置和数据标签,如果符合条件,把自己压进 Stack`<`GameObject`>` Data。

总结一下,每次创建新对象时,我们可以把它存入某个集合,或者让它订阅某些事件。接下来在需要的时候,遍历集合中的所有元素,或者发布搜索事件,由此找到需要的对象。

## 思考题

最后留一道填空题。

三个人在牢房里聊天。

第一个说:我赞成凉宫是创世神。

第二个说:我反对凉宫是创世神。

第三个说:我就是——不是,在玫瑰色的宝可梦里寻找真实,`______________`。(2 分)

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

图 7:别人的团长,我们的团长。



This post has been edited by Bozar: 2019-07-21, 18:44
TOP
junislee
2019-07-29, 12:41
Post #2


主物质者
Group Icon
 0
   0

Group: Primer
Posts: 10
Joined: 2016-06-05
Member No.: 66639


佩服老哥,你是闲暇时间在自学这些,并在做自己的游戏的吗?
TOP
Bozar
2019-07-29, 15:59
Post #3


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

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


是自学的,业余时间做游戏
TOP
junislee
2019-07-30, 12:48
Post #4


主物质者
Group Icon
 0
   0

Group: Primer
Posts: 10
Joined: 2016-06-05
Member No.: 66639


QUOTE(Bozar @ 2019-07-29, 15:59) *

是自学的,业余时间做游戏
想问一下,我想搞一下自己的CRPG,老哥你这些知识是普适的吗
TOP
Bozar
2019-07-30, 13:18
Post #5


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

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


QUOTE(junislee @ 2019-07-30, 12:48) *

想问一下,我想搞一下自己的CRPG,老哥你这些知识是普适的吗
说不上来,你觉得有用的话可以学一下
TOP
junislee
2019-07-30, 21:49
Post #6


主物质者
Group Icon
 0
   0

Group: Primer
Posts: 10
Joined: 2016-06-05
Member No.: 66639


QUOTE(Bozar @ 2019-07-30, 13:18) *

说不上来,你觉得有用的话可以学一下
待洒家康康,遇到搞不掂的地方,还要请教老哥了
TOP
Dropkicker
2019-08-01, 21:23
Post #7


主物质者
Group Icon
 64
   2

Group: Speaker
Posts: 8
Joined: 2018-06-20
Member No.: 75066


佩服!在下也是自学编程,难得的到了暑假打算把以前的坑填完...(生物专业不配拥有课余时间 (IMG:style_emoticons/default/wacko.gif) )祝开发之途一路顺风!
TOP
Fast ReplyReply to this topicStart new topic
 


Time is now: 2019-10-18, 02:06