Project1

标题: XP自动元件生成算法 [打印本页]

作者: guoxiaomi    时间: 2020-4-7 18:22
标题: XP自动元件生成算法
本帖最后由 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

效果如图:


作者: 灯笼菜刀王    时间: 2020-4-7 19:26
本帖最后由 灯笼菜刀王 于 2020-4-7 19:34 编辑

这文章早点出来就好了, 正在做一个建设系统, 卡在自动元件上好久, 无法处理自动元件的变形, 后来干脆不用自动元件了... 把树全部割成图块使用, 也因此决定用铺事件调用图块的方式进行建造, 毕竟可以利用行走图做动态图块和循环动画~
作者: RyanBern    时间: 2020-4-7 20:36
醋瞎。怕是自动生成地图的时候才用得到。
作者: fux2    时间: 2020-4-7 21:11
这直接就强惊天,不过之前好像有见过一样的东西,忘了在哪里了
作者: 89444640    时间: 2020-4-7 21:12
本帖最后由 89444640 于 2020-4-7 21:20 编辑

所以这个能做随机寻宝地图了?除了可能场景会限定比较单调。只有自动原件和底下图块,而且要可通行,
作者: Im剑侠客    时间: 2020-4-8 00:46
自动元件一直都觉得是一个谜团,这下好了~云开月明。
作者: SailCat    时间: 2020-4-8 00:55
我当年发迷宫自动描边的时候就发过算法上来的啊……
https://rpg.blue/thread-388732-1-1.html




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1