Project1

标题: 伪●破除地图999张的限制(跨越目录法)--更新范例工程 [打印本页]

作者: TERENCE    时间: 2008-4-11 23:01
标题: 伪●破除地图999张的限制(跨越目录法)--更新范例工程
{/hx}首先要感谢
wy29禾西冰水沉影不器4人在
[讨论]如何破除地图999张的限制帖子中
http://rpg.blue/viewthread.php?tid=83080&page=1
提供资讯(或思路),我才能发出这样的教程!

[LINE]1,#dddddd[/LINE]
在RMXP编辑器中限制了地图制作的张数!
虽然制作地图超过999张对一般人来说不太可能,
但我还是说明一下:万一超过999张该如何扩充制作地图?

首先我们先必须知道在地图做编辑时(存档后),
会在工程的Data资料夹下产生
Map001.rxdata ,Map002.rxdata ,Map003.rxdata....Map***.rxdata
再由Game_Map脚本中的
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
(其中%03d表示地图最大ID为3位数)
载入地图档案。

在RMXP编辑器中地图最大ID量默认是3位数的,应该破解编制器,把编号改成4位数
(並把Game_Map脚本中的%03d改成%04d),但是要破解编制器不容易,所以我们可以
利用脚本从不同的文件夹内(不同的路径)读取新地图DATA。

首先新建立N个Data资料夹(Data1,Data2,.....DataN)
再利用游戏某变量 $game_variables[变量编号]=数值 控制
把Game_Map类里@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
改成
(这里以游戏变量编号2为例)

  1. case $game_variables[2]
  2. when 0
  3.   @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  4. when 1
  5.   @map = load_data(sprintf("Data1/Map%03d.rxdata", @map_id))
  6. when 2
  7.   @map = load_data(sprintf("Data2/Map%03d.rxdata", @map_id))
  8. .........
  9. when [b]N[/b]
  10.   @map = load_data(sprintf("Data[b]N[/b]/Map%03d.rxdata", @map_id))
  11. end
复制代码
这样基本上 伪●破除地图999张的限制 已经完成了!

接下来要介绍:应该要如何编辑新的地图
当制作地图超过999张(该999张地图Data都存放在Data资料夹下),
新的工程开始制作新地图,做完后存档,
再把新的地图Data复制到以前的工程Data1资料夹下,
依此类推.......
但当然制作新的工程过程中必须注意:
事件里如果要用到其他数据那得确保所有数据编号跟以前的工程一致
像开关ID,Tilesets ID,变量ID..等等 要跟以前的工程配合才行!
所以我建议:
先把旧工程复制一份当新的工程用,再把复制的那一份(当新的工程用的那一份)里的地图
999张全部删除,再重新制作新的地图。
这样一来编辑不容易出错,
二来要添加开关,变数,图块Tilesets,..等等容易同步添加

最后要介绍的是:应该要如何跨越目录做地图场所移动
先使用游戏某变量 $game_variables[变量编号]=数值 控制帶入你要的Data资料夹数值,
然後跨越目录做地图场所移动前必须$game_map = Game_Map.new重新讀取
最后再利用变数指定场所移动的 (新目录下)目的地

在事件頁编辑后如下:

但如果是在对话完结束后要跨越目录地图场所移动时,至少要等待5桢以上
否则会出现以下错误:

对话完结束后正確事件頁编辑要如下所示:

范例工程:
主工程(195KB)
http://rpg.blue/upload_program/f ... MAP999_88365305.rar
子工程(189KB)
http://rpg.blue/upload_program/files/子工程_88365344.rar
(至目前为止这种方法还没有发现错误,如果范例工程有发现错误请告知,谢谢。)
补充:
范例工程中使用了地图显示名称的脚本,这个脚本也是要做小修改的,道理跟这个类似,
只是这次换成只有一个的MapInfos.rxdata了,自己看看哪里做了修改吧!!


作者: 非法用户    时间: 2008-4-11 23:08
超级无敌大压缩脚本:
case $game_variables[2]
when 0
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
when 1
@map = load_data(sprintf("Data1/Map%03d.rxdata", @map_id))
when 2
@map = load_data(sprintf("Data2/Map%03d.rxdata", @map_id))
.........
when N
@map = load_data(sprintf("DataN/Map%03d.rxdata", @map_id))
end

变变变。。。
@map = load_data(sprintf("Data#{$game_variables[2]}/Map%03d.rxdata",@map_id)

作者: TERENCE    时间: 2008-4-11 23:17
你不会用到那麼多的,顶多做到第二个Data资料夹就很了不起了。
case $game_variables[2]
when 0
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
when 1
@map = load_data(sprintf("Data1/Map%03d.rxdata", @map_id))
end
就可以了~~~~~

还有LS你这样写$game_variables[2]=0时就不是载入Data资料夹了~~~
而且我这样写可以自由替 新的DATA资料夹("Data1/.....") 作命名
作者: 非法用户    时间: 2008-4-12 00:14
以下引用TERENCE于2008-4-11 15:17:52的发言:
你不会用到那麼多的,顶多做到第二个Data资料夹就很了不起了。
case $game_variables[2]
when 0
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
when 1
@map = load_data(sprintf("Data1/Map%03d.rxdata", @map_id))
end
就可以了~~~~~

还有LS你这样写$game_variables[2]=0时就不是载入Data资料夹了~~~
而且我这样写可以自由替 新的DATA资料夹("Data1/.....") 作命名

我总是缩短供参考{/lh}。
多以各分歧判断2号变量是不是0之后就真的可以做到无限地图层了,只是举例,只是举例。。。

作者: TERENCE    时间: 2008-4-12 02:01
{/dy}更新范例工程。
[LINE]1,#dddddd[/LINE]
以下引用非法用户于2008-4-11 16:14:16的发言:
我总是缩短供参考。
多以各分歧判断2号变量是不是0之后就真的可以做到无限地图层了,只是举例,只是举例。。。

我知道~~~
我只是想解释我这样做的想法。
谢谢参考!
{/hx}
作者: 越前リョーマ    时间: 2008-4-12 02:16
暂时没见过地图超过999张的游戏……
作者: TERENCE    时间: 2008-4-12 02:29
以下引用越前リョーマ于2008-4-11 18:16:47的发言:

暂时没见过地图超过999张的游戏……

虽然制作地图超过999张不太可能,
但万一超过999张,就用得上啊!
凡是都要未雨绸缪嘛~~~~~
{/kuk}


作者: 琉璃之血    时间: 2008-4-12 02:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: 非法用户    时间: 2008-4-12 02:47
以下引用琉璃之血于2008-4-11 18:44:24的发言:
以下引用TERENCE于2008-4-11 15:17:52的发言:

你不会用到那麼多的,顶多做到第二个Data资料夹就很了不起了。
case $game_variables[2]
when 0
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
when 1
@map = load_data(sprintf("Data1/Map%03d.rxdata", @map_id))
end
就可以了~~~~~

还有LS你这样写$game_variables[2]=0时就不是载入Data资料夹了~~~
而且我这样写可以自由替 新的DATA资料夹("Data1/.....") 作命名


[本贴由作者于 2008-4-11 15:59:37 最后编辑]


这样呢?
@map = load_data(sprintf("Data#{$game_variables[2] == 0 ?"":$game_variables[2]}/Map%03d.rxdata",@map_id)

Ruby语法Very Good的字符内判式哦,哎~~~

这样就跟我本来的宗旨一样了,自动无限判断,省事而已{/hx}。
作者: orochi2k    时间: 2008-4-12 02:48
这个...嗯...貌似诡异度接近我了{/gg}
作者: TERENCE    时间: 2008-4-12 03:42
以下引用琉璃之血于2008-4-11 18:44:24的发言:
这样呢?
@map = load_data(sprintf("Data#{$game_variables[2] == 0 ?"":$game_variables[2]}/Map%03d.rxdata",@map_id)

Ruby语法Very Good的字符内判式哦,哎~~~

这样写是可以~~~~
但写程式时,要注意可读性!
提高程式的可读性,就是我们在撰写程式时所要注意的。
因为如果撰写一句程式太复杂时,不仅会容易出错让其他人看不懂,
当你想回头进行维护时,你会想抓狂的~~~~
作者: 水迭澜    时间: 2008-4-12 03:44
LZ还没有结帖呢
作者: 非法用户    时间: 2008-4-12 03:45
以下引用水迭澜于2008-4-11 19:44:14的发言:
LZ还没有结帖呢

果然是水水,尽责到这里来了~{/qiang}
作者: 琉璃之血    时间: 2008-4-12 03:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: TERENCE    时间: 2008-4-12 03:53
以下引用水迭澜于2008-4-11 19:44:14的发言:

LZ还没有结帖呢

我结帖过啦~~~~

积分分完了,也没直接结帖的钮了啊.....
奇怪??{/yiw}
作者: TERENCE    时间: 2008-4-12 04:03
以下引用琉璃之血于2008-4-11 19:47:57的发言:
程式要从内往外读= =bbb

读到抓狂的往往是新手ORZ
(1...32).find_all{|v| $data_weapons[v].atk > 32 and v % 2 == 0}
这样的式子从外往内读会很麻烦,而从迭代方式读到外面的range就没难度了。

我比较希望一些新手也能看的懂教程,
所以大众化嘛......
{/tp}
(而且用case容易懂这是在做什麼的....)
[LINE]1,#dddddd[/LINE]
所谓的可读性是:
你写的程式能不能让大部分的人看的懂

作者: 96310376    时间: 2008-4-14 16:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-4-14 17:23
我記得上次說過,在initialize那裏增加參數比之用變量控制來得容易。
def initialize(num=1)
  @num = num
  。。。。
end

然後只需要改
@map = load_data(sprintf("Data#{@num}/Map%03d.rxdata",@map_id)


在事件當中調用只要寫:
$game_map = Game_Map.new(num)
就可以了==
作者: TERENCE    时间: 2008-4-15 01:17
以下引用禾西于2008-4-14 9:23:31的发言:

我記得上次說過,在initialize那裏增加參數比之用變量控制來得容易。

def initialize(num=1)
@num = num
。。。。
end


然後只需要改

@map = load_data(sprintf("Data#{@num}/Map%03d.rxdata",@map_id)


在事件當中調用只要寫:
$game_map = Game_Map.new(num)
就可以了==

我知道~~~~
但如果这篇教程我 照你的方法写 我就不是把你的方法给抄出来??
禾西的想法变成 我的原创东西发布,不就.......
所以我还是采用我那个笨方法发布出来,才不会抄袭禾西的想法。
因为当初 破除地图999张的方法 最早想出来的笨方法就是我吧~~~~~
这笨方法才是我的原创发布!!
{/wx}
作者: 火鸡三毛老大    时间: 2008-4-15 04:34
这个 ..
要没有任何问题才能发正式版的游戏吧...
作者: TERENCE    时间: 2008-4-15 04:55
以下引用火鸡三毛老大于2008-4-14 20:34:54的发言:

这个 ..
要没有任何问题才能发正式版的游戏吧...

我的方法也是可以的~~~~只是比较笨而已~~~~
不过話說我真不太習慣用增加參數的方法
{/yun}
作者: 禾西    时间: 2008-4-15 05:23
以下引用TERENCE于2008-4-14 17:17:36的发言:
我知道~~~~
但如果这篇教程我 照你的方法写 我就不是把你的方法给抄出来??
禾西的想法变成 我的原创东西发布,不就.......
所以我还是采用我那个笨方法发布出来,才不会抄袭禾西的想法。
因为当初 破除地图999张的方法 最早想出来的笨方法就是我吧~~~~~
这笨方法才是我的原创发布!!

不用那麽拘泥==
作者: TERENCE    时间: 2008-4-19 02:48
以下引用鸿剑于2008-4-18 18:18:05的发言:

TERRENCE你的RPG制作大师XP是英特卫正版的吧?

你~~~
你怎么.....知道我是......
我的身分被拆穿了.........
{/bz}

作者: 禾西    时间: 2008-5-28 08:21
發布完成!
TERENCE.VIP += 1
{/hx}
作者: TERENCE    时间: 2008-5-28 08:41
哇~~好一个老旧的东西,我还以為不会发布了呢!
感謝禾西!





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