设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3908|回复: 14
打印 上一主题 下一主题

[讨论] XP自动元件生成算法

[复制链接]

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

跳转到指定楼层
1
发表于 2020-4-7 18:22:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 guoxiaomi 于 2020-4-7 18:33 编辑

XP的自动元件总共有48个样式,在地图编辑器里绘制时会根据其周围8格有没有跟它一样的自动元件改变自己的样式,但是如果要在游戏里生成随机的地图,自动元件的ID就需要自己算了。

论坛上我找了找好像没有?不过我找了网上的一些分析文章:

1. 浅谈RPG Maker XP自动地图元件的绘制原理_xp_古的博客-CSDN博客
2. 浅析RMXP自动元件绘制原理_网络_sky的游戏开发博客-CSDN博客
3. Auto-tiling-algorithm

然后写了个方法,可以以二维数组输入地图上某个自动元件的占据情况,输出一个同样大小的二维数组,其元素是此处自动元件的ID

基本上是苦力活,原理上面的方法都讲清楚了

RUBY 代码复制
  1. # encoding: utf-8
  2.  
  3. # RMXP Autotiles 算法
  4. # 首先用以下标记来标注一个AutoTile
  5. # + - + - + - +
  6. # | 1 | 6 | 2 |
  7. # | 5 |   | 7 |
  8. # | 4 | 8 | 3 |
  9. # + - + - + - +
  10. # 1234 构成 0-15 的数 c = 4321
  11. # 5678 构成 0-15 的数 b = 8765
  12.  
  13. def get_autotile(b, c)
  14.   case b
  15.   when 0b1111
  16.     15 - c
  17.   when 0b1110
  18.     19 - (c / 2) % 4
  19.   when 0b1101
  20.     23 - (c / 4) % 4
  21.   when 0b1011
  22.     27 - c / 8 - (c * 2) % 4
  23.   when 0b0111
  24.     31 - c % 4
  25.   when 0b1010 then 32
  26.   when 0b0101 then 33
  27.   when 0b1100
  28.     35 - (c / 4) % 2
  29.   when 0b1001
  30.     37 - c / 8
  31.   when 0b0011
  32.     39 - c % 2
  33.   when 0b0110
  34.     41 - (c / 2) % 2
  35.   when 0b1000 then 42
  36.   when 0b0100 then 43
  37.   when 0b0010 then 44
  38.   when 0b0001 then 45
  39.   when 0b0000 then 46
  40.   end
  41. end
  42.  
  43. # t 是一个二维的数组
  44. def fill_table(t)
  45.   width = t[0].size
  46.   height = t.size
  47.   tt = []
  48.   tt << [1] * (width + 2)
  49.   for row in 1..height
  50.     tt << [1] + t[row - 1] + [1]
  51.   end
  52.   tt << [1] * (width + 2)
  53.   # 默认是 -1
  54.   id = Array.new(height) { [-1] * width }
  55.   for x in 1..width
  56.     for y in 1..height
  57.       if tt[y][x] == 1
  58.         b = tt[y + 1][x] * 8 + tt[y][x + 1] * 4 + tt[y - 1][x] * 2 + tt[y][x - 1]
  59.         c = tt[y + 1][x - 1] * 8 + tt[y + 1][x + 1] * 4 + tt[y - 1][x + 1] * 2 + tt[y - 1][x - 1]
  60.         a = get_autotile(b, c)
  61.         id[y - 1][x - 1] = a
  62.       end
  63.     end
  64.   end
  65.   return id
  66. end


用这个脚本在初始的地图里测试:
RUBY 代码复制
  1. t = Array.new(15) {
  2.   Array.new(20) { rand < 0.5 ? 1 : 0 }
  3. }
  4. id = fill_table(t)
  5. for i in 0...20
  6.   for j in 0...15
  7.     if id[j][i] > 0
  8.       $game_map.data[i,j,0] = 48 + id[j][i]
  9.     else $game_map.data[i,j,0] = 384
  10.     end
  11.   end
  12. end

效果如图:

评分

参与人数 8星屑 +160 +8 收起 理由
真·可乐 + 1
y967 + 1 看到了希望(也许)
SixRC + 1 塞糖
89444640 + 1 塞糖
fux2 + 1 精品文章
RyanBern + 160 + 1 精品文章
灯笼菜刀王 + 1 精品文章
MCCF + 1 嗷!触瞎

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
2
发表于 2020-4-7 19:26:27 | 只看该作者
本帖最后由 灯笼菜刀王 于 2020-4-7 19:34 编辑

这文章早点出来就好了, 正在做一个建设系统, 卡在自动元件上好久, 无法处理自动元件的变形, 后来干脆不用自动元件了... 把树全部割成图块使用, 也因此决定用铺事件调用图块的方式进行建造, 毕竟可以利用行走图做动态图块和循环动画~

点评

我也是心血来潮(  发表于 2020-4-7 21:17
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

3
发表于 2020-4-7 20:36:34 | 只看该作者
醋瞎。怕是自动生成地图的时候才用得到。

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42399
在线时间
7602 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

4
发表于 2020-4-7 21:11:30 | 只看该作者
这直接就强惊天,不过之前好像有见过一样的东西,忘了在哪里了

点评

做游戏[X]造轮子[√]  发表于 2020-4-7 21:35
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
5
发表于 2020-4-7 21:12:56 | 只看该作者
本帖最后由 89444640 于 2020-4-7 21:20 编辑

所以这个能做随机寻宝地图了?除了可能场景会限定比较单调。只有自动原件和底下图块,而且要可通行,

点评

↓↓是的,比如铺地毯  发表于 2020-4-7 21:45
至于怎么生成迷宫,就要找迷宫算法了,比如递归分割:https://blog.csdn.net/juzihongle1/article/details/73135920  发表于 2020-4-7 21:44
嗯,所以用这个辅助绘制地图涂层1也不错  发表于 2020-4-7 21:43
用自动元件画地图有更自然的边界,看上去就不像是生硬的拼接  发表于 2020-4-7 21:39
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

6
发表于 2020-4-8 00:46:41 手机端发表。 | 只看该作者
自动元件一直都觉得是一个谜团,这下好了~云开月明。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23191
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

7
发表于 2020-4-8 00:55:39 | 只看该作者
我当年发迷宫自动描边的时候就发过算法上来的啊……
https://rpg.blue/thread-388732-1-1.html

点评

猫大这个我用过很好用,细节边缘稍微修一下就行了,但是是室内迷宫的,guoxiaomi的可以画室外地板XD  发表于 2020-4-8 09:37
说明取一个合适的标题很重要(*°ー°)v  发表于 2020-4-8 01:12
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 04:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表