查看: 4483|回复: 14

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

[复制链接]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2020-4-7 18:22:11 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 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

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

[pre lang="ruby"]# encoding: utf-8

# RMXP Autotiles 算法
# 首先用以下标记来标注一个AutoTile
# + - + - + - +
# | 1 | 6 | 2 |
# | 5 |   | 7 |
# | 4 | 8 | 3 |
# + - + - + - +
# 1234 构成 0-15 的数 c = 4321
# 5678 构成 0-15 的数 b = 8765

def get_autotile(b, c)
  case b
  when 0b1111
    15 - c
  when 0b1110
    19 - (c / 2) % 4
  when 0b1101
    23 - (c / 4) % 4
  when 0b1011
    27 - c / 8 - (c * 2) % 4
  when 0b0111
    31 - c % 4
  when 0b1010 then 32
  when 0b0101 then 33
  when 0b1100
    35 - (c / 4) % 2
  when 0b1001
    37 - c / 8
  when 0b0011
    39 - c % 2
  when 0b0110
    41 - (c / 2) % 2
  when 0b1000 then 42
  when 0b0100 then 43
  when 0b0010 then 44
  when 0b0001 then 45
  when 0b0000 then 46
  end
end

# t 是一个二维的数组
def fill_table(t)
  width = t[0].size
  height = t.size
  tt = []
  tt << [1] * (width + 2)
  for row in 1..height
    tt << [1] + t[row - 1] + [1]
  end
  tt << [1] * (width + 2)
  # 默认是 -1
  id = Array.new(height) { [-1] * width }
  for x in 1..width
    for y in 1..height
      if tt[y][x] == 1
        b = tt[y + 1][x] * 8 + tt[y][x + 1] * 4 + tt[y - 1][x] * 2 + tt[y][x - 1]
        c = tt[y + 1][x - 1] * 8 + tt[y + 1][x + 1] * 4 + tt[y - 1][x + 1] * 2 + tt[y - 1][x - 1]
        a = get_autotile(b, c)
        id[y - 1][x - 1] = a
      end
    end
  end
  return id
end[/pre]

用这个脚本在初始的地图里测试:
[pre lang="ruby"]t = Array.new(15) {
  Array.new(20) { rand < 0.5 ? 1 : 0 }
}
id = fill_table(t)
for i in 0...20
  for j in 0...15
    if id[j] > 0
      $game_map.data[i,j,0] = 48 + id[j]
    else $game_map.data[i,j,0] = 384
    end
  end
end[/pre]
效果如图:
捕获.PNG

评分

参与人数 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 网络脚本 *
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2020-4-7 19:26:27 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2020-4-7 19:34 编辑

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

点评

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

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2020-4-7 20:36:34 | 显示全部楼层
醋瞎。怕是自动生成地图的时候才用得到。

评分

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

查看全部评分

回复

使用道具 举报

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2020-4-7 21:11:30 | 显示全部楼层
这直接就强惊天,不过之前好像有见过一样的东西,忘了在哪里了

点评

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

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 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
回复

使用道具 举报

梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

发表于 2020-4-8 00:46:41 来自手机 | 显示全部楼层
自动元件一直都觉得是一个谜团,这下好了~云开月明。
回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 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] 到本站一游。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部