加入
发新帖
发表于 2014-4-11 10:01 | 查看: 1539| 回复: 19
开发日志
进度: 30 %
本帖最后由 大饼土博 于 2014-4-21 10:28 编辑

第一次来这里发新贴,兴奋地发一个我们在做的独立游戏的预告(应该是首发)。
游戏名为 Pagic,意为 Pattern Magic (中文名没想好)。

1. 背景:

主角 Pagicka (暂定)是一个小女孩,也是一个小魔法师,她的家在一片魔法森林里。

每天半夜,森林都会变一个摸样,所有的路、树、花和灌木都会重新排列。

有一天,森林不知为何中了一种邪恶的魔法,不停地有树被黑色的魔法所污染,邪恶的魔法链条缠绕着这些可怜的树,如果不及时制止,这些被污染的树将会死去,树下出现的邪恶沼泽还会让附近的植物一同死去。

Pagicka 当然不能允许这样的事情发生,于是,每天她都去森林里用她的魔法净化那些被污染的树。

但是,不管 Pagicka 如何努力,每天都还是有新的树被污染,似乎只有找出邪恶的源头才能彻底阻止这些污染,那么邪恶的魔法究竟来自哪里?

2. 初衷

有一天,我和一个小伙伴在吃饭时聊起现在的触屏上的动作游戏,我们都觉得那种在触摸屏上显示一个虚拟的游戏手柄的方式弱爆了,玩家必须要经常用眼睛看着那个虚拟的手柄上的按键才能保证自己不按错。但是,当玩得很投入时,这会造成注意力的分散,严重影响体验。

虽然有一些游戏对这一点进行了改进,比如 ReaperBardbarian,但我们总觉得还缺点什么,不够爽,总觉得还没有把触屏的特点发挥出来,因为它们用的都是一些很简单的手势。

然后,我的小伙伴提到了 “魔法阵”,不错!我们可以让玩家画魔法阵,表示玩家所要释放的魔法类型,这是物理手柄做不到的,也是鼠标所难以做到的(鼠绘达人是存在的,但不是一般人能很容易做到的),但在触屏上,却很容易用手指做到。前段时间很火的那个什么你画我猜的应用证明了在触屏上画图的可行性。

后来,Pagic 项目就开始了。当然,虽然我们一开始想到的是动作游戏,但把 Pagic 看作是一个动作游戏似乎不太合适,因为它的主题是魔法,游戏角色不会有近距离肢体接触。

我们相信,手绘魔法阵会是一种很酷的操作体验。


/*****分割线*****/

Pagic 是一个必须要有触摸屏才能玩的游戏。

目前完成度还不高,所以只能先放一些地图截图。

我们只有一个美工呀,所以就只好增加程序的工作量来做过程生成的地图以减少美工的工作量了(笑)。

2014-04-11_083542.png
2014-04-11_083351.png

2014-04-11_083429.png

2014-04-11_083452.png

2014-04-11_083517.png

2014-04-11_083607.png

PS: 中间的透明框框是实际的可视窗口,为了截图时能够看到整个地图,所以整体缩小了。



收藏回复 显示全部楼层 道具 举报

发表于 2014-4-30 22:06
那个nds游戏叫失落的魔法(lost magic)

点评 回复 显示全部楼层 道具 举报

boywu1985 发表于 2014-5-2 10:41
我记得那个游戏画魔法阵的过程是:游戏暂停——弹出魔法阵界面——面魔法阵,我觉得你们的游戏可以做成即时画阵,这样节奏快一些
大饼土博 发表于 2014-4-30 22:21
看到视频了,核心的操作方式确实和我们一样
发表于 2014-4-28 15:25
nds上过去有个rts游戏 名字忘了 主题也是手绘魔法阵打怪物的 可以参考一下 是ds早期的一个游戏

点评 回复 显示全部楼层 道具 举报

大饼土博 发表于 2014-4-30 12:12
我去找找看,谢谢
发表于 2014-4-22 17:57
今晚要做一个 cocos2d 的 action,实现一段很萌的动画,模仿迪斯尼动画中那种柔软有弹性的角色的感觉。

回复 显示全部楼层 道具 举报

发表于 2014-4-21 21:54
我现在想,先弄好手动的,自己知道要怎么铺图了,再搞成自动生成的

点评 回复 显示全部楼层 道具 举报

大饼土博 发表于 2014-4-21 22:02
你的顺序是对的,我们也是先手动再自动的。
发表于 2014-4-21 21:53
我现在想,先弄好手动的,自己知道要怎么铺图了,再搞成自动生成的

回复 显示全部楼层 道具 举报

发表于 2014-4-21 17:25
故事背景很喜欢~~

点评 回复 显示全部楼层 道具 举报

大饼土博 发表于 2014-4-21 17:59
thanks~
发表于 2014-4-21 17:16
神(美工)说:“应该有全屏模糊效果,还要实现不同区域不同的模糊强度。”于是我点开了一个新的技能树——GLSL。先把 pixel shader 这个分支的技能点满再说。

回复 显示全部楼层 道具 举报

发表于 2014-4-21 10:22
在1楼更新了游戏的介绍

回复 显示全部楼层 道具 举报

发表于 2014-4-17 20:31
不错不错,技术贴啊!学习了!

回复 显示全部楼层 道具 举报

发表于 2014-4-17 19:04
本帖最后由 大饼土博 于 2014-4-17 19:07 编辑

Pagic 使用的过程式地图生成算法


这个算法是过程生成算法的一种,个人推荐一个将该技术发挥到极致的游戏:无限星辰。在无限星辰中,只要是你能看得见的星星,你就一定能开着飞船飞过去,着陆并观赏它独特的地貌。它的整个宇宙(包括每个星球上的地貌)都是用算法生成的,而不是由美工一个顶点一个顶点编辑出来的。和它相比,我的这个算法只是一个小儿科而已。



另外还有一个经典的大量采用了过程生成技术的游戏是大名鼎鼎的 Dwarf Fortress。它的画面实在是难以恭维,以至于很多玩家(包括我)都难以坚持玩下去,这大概是它过于专注于过程生成技术的代价吧。


现在让我们回到我的“小儿科”:)


我们的算法总体上分为两步:1)路的生成和 2)其它景物的生成。


1)路的生成


这里我们也可以把路的生成看作是 “生长”。我们先把整个地图划分为一些方格,假设我们的地图有 w*h 个方格,并用 1 表示某个方格里有路, 0 表示没有路,那么初始的地图(假设有 5*5 个方格)就是下面这样:


0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0


然后我们选一个起点,比如最中间的那个方格,如果我们以左下角的方格为坐标原点,则这个最中间的方格的坐标就是 (2, 2)。


很显然,起点是一个表示路的方格,于是我们的地图就变成了下面这样:


0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0


接下来,我们可以开始“生长”路了。我们需要给路的生长指定下一个生长点,由于我们的地图是 8 连通地图,所以最简单的方法自然是等概率地从 8 个和 (2, 2) 相邻的方格中选择一个作为路的下一个生长点,然后依次类推,直到路长到了边界或者其它已经生成了路的方格。假设我们现在随机选出的方格是 (3, 2),那么地图就变成了:


0 0 0 0 0
0 0 0 0 0
0 0 1 1 0
0 0 0 0 0
0 0 0 0 0


虽然这在现在看起来没什么问题,不过当路已经生长了很久之后,这很可能不再会是个好策略。比方说,假如我们当前的地图是:


0 0 1 0 0
0 0 0 1 0
0 0 1 1 0
0 0 0 0 0
0 0 0 0 0


当前的生长点是 (3, 4)。这时,如果我们让路往下生长,就会变成:


0 0 1 0 0
0 0 1 1 0
0 0 1 1 0
0 0 0 0 0
0 0 0 0 0


这样的路看起来就不太好,因为看起来这里有一个很小的环。我们希望能够避免这种情况,所以选择下一个生长点时,各个方向上的临近的方格被选择的概率应该是不相等的,有些甚至可以被直接排除(被排除也意味着被选择的概率为 0)。


我们所采用的方法是动态地根据当前生长点周围的情况,计算各个临近方格被选择的概率,然后再选出下一个方格。


具体来说,假设我们现在要考察的方向是x,我们就以当前的生长点为起点,沿着 x 方向尝试着生长路,直到碰到已经生成的路或者边界,并统计这条 “尝试” 的路的长度,记为 x 方向的分值 s_x,由此我们就可以为 8 个方向中的每一个都打一个分,得到 s_0, s_1, ... , s_7。然后,方向 x 被选择的概率就是 p_x = s_x/(s_0 + s_1 + ... + s_7)。这样做的效果就是,路会倾向于往地图上更加空旷的地方生长,而不会很容易出现小环。


上面这个方法只是一个例子,如果你希望路具备某些特点,都可以通过改变生长方向被选择的概率的计算方法来实现。比如,我们希望尽可能不会出现很长的直路,就可以把和前一个生长方向相同的方向被选择的概率设为某个很小的值或0;比如,我们不希望路的拐弯角度超过90度,就可以把那些和上一个生长方向的夹角超过90度的方向被选择的概率设为0。在 Pagic 中,我们就是这么干的。除此以外,还可以根据实际的需求得到很多很多不同的概率设定方法。


到目前为止,我们的路是没有岔路的。只生成一条没有岔路的路,是很难铺满整个地图的。所以,当一条路中止(即碰到边界或者其它已经生成了路的方格)之后,我们需要重新选择个起始生长点。


最简单的选择方式就是等概率地在已经有路的方格中选一个。但,这会产生问题。假设我们现在的地图是:


1 1 1 1 1
0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0


如果我们选择 (2, 3) 作为一个新的生长点,那么可以预见接下来生长出的路会不那么美观。所以,我们采用了一个策略来排除这些很可能会生成不美观的路的方格。我们的方法是观察一个有路经过的方格半径为 r 的邻域内是否有岔路口,如果有,则排除掉。在剩余的有路经过的方格中再等概率地选择一个作为新的生长点。


到这里我们就讲完了路的生成方法。


2)其它景物的生成


其它景物是指像树和花那样长在没有路的方格里的景物。这里先只考虑树。我们为每个方格设置一个值表示有树长于此的概率大小。我们希望得到的效果是,离路越远的树长得越密集。以此为目的,则离路越远的方格所设置的概率值就应该越小,当一个方格上有路经过时,概率值就为 0。


我们先把所有有路经过的方格上的值设为0,其它方格设为-1(无效值),则有


-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
0  0 -1 -1 -1
-1  0 -1 -1 -1
-1  0 -1 -1 -1


然后逐次将路边的方格的值设为临近的不为-1的方格的值加上一个固定的增量值,假设增量是1,则我们将逐步得到:


-1 -1 -1 -1 -1
1  1  1 -1 -1
0  0  1 -1 -1
1  0  1 -1 -1
1  0  1 -1 -1


2  2  2  2 -1
1  1  1  2 -1
0  0  1  2 -1
1  0  1  2 -1
1  0  1  2 -1


2  2  2  2  3
1  1  1  2  3
0  0  1  2  3
1  0  1  2  3
1  0  1  2  3


现在,我们再把所有的值缩放到0~1之内就可以作为概率值用了。


在“种”完树以后,我们可以在没树的地方再“种”上其它东西,每个方格“种”的概率和“种”树时相同。


看吧,方法很小儿科吧。

回复 显示全部楼层 道具 举报

发表于 2014-4-11 14:02

[删除]

跟错帖了

回复 显示全部楼层 道具 举报

发表于 2014-4-11 12:51
热烈欢迎分享开发进度。

回复 显示全部楼层 道具 举报

发表于 2014-4-11 12:30
不錯呀!加油~

点评 回复 显示全部楼层 道具 举报

大饼土博 发表于 2014-4-11 13:16
谢谢
发表于 2014-4-11 11:46
效果很好, 地图是怎么编辑的?

点评 回复 显示全部楼层 道具 举报

大饼土博 发表于 2014-4-11 13:15
其实算法不难的,有空我会写写的
肉山大魔王 发表于 2014-4-11 12:49
能介绍一下大概原理吗?
肉山大魔王 发表于 2014-4-11 12:49
自动生成的很神奇, 什么算法?
大饼土博 发表于 2014-4-11 11:51
用参数控制的,自动生成的地图,美工只做了单独的树和花之类。
您需要登录后才可以回帖 登录 | 加入

搜索

繁體   

返回顶部