Project1

标题: RM_VX地形标志V3.5_图块版本(脚本优化) [打印本页]

作者: TERENCE    时间: 2009-1-10 08:37
标题: RM_VX地形标志V3.5_图块版本(脚本优化)
■ RM_VX地形标志V3.5_图块版本
前言:
在XP上有地形标誌的功能,但在VX却取消了该功能,
以至於要在VX地图上做一些特殊效果不容易达成,
不久前 我发了XP纯事件推箱子完美(无等待)效果
http://rpg.blue/viewthread.php?tid=114571
精灵问说没地形标誌的VX怎麼办.....

利用图块做出 的 地形标志脚本
现在都已经解决了
而且方法名称跟XP一样


第一次发的地形标志帖子过期帖处里!!

[LINE]1,#dddddd[/LINE]
地形标志设置方法:
A~E每张图块ID都是从最左上方开始计算(由左到右)
001,002,003,004,005,006,007,008
009,010,011,012,013,014,015,016
...............................
249,250,251,252,253,254,255,256

{ 图块ID=>地形标志值 ,图块ID=>地形标志值 ,.......}
如果没设置地形标志值 调用后默认值为0
------------------------------------------------------
★注意事项:
[B页]的第一格空白图块是"不能"设置地形标志的
因为它是专门清理图块B~E的工具   而非图块
所以图块[B页]的部分 ID从第二格002开始计算

001[X设置不能],002,003,004,005,006,007,008
...............................

另外如果图层地形标志重叠,
以高图层的B~E为主!!
------------------------------------------------------
调用方法:
获取角色当前所在地形标誌
$game_player.terrain_tag
   
获取某事件当前所在地形标誌
$game_map.events[事件编号].terrain_tag

------------------------------------------------------
事件脚本中常用的使用方法:
角色当前所在地形标誌  帶入 某变量中
$game_variables[变量编号] = $game_player.terrain_tag

某事件当前所在地形标誌  帶入 某变量中
$game_variables[变量编号] = $game_map.events[事件编号].terrain_tag

------------------------------------------------------
事件条件分歧脚本中常用的使用方法:
角色当前所在地形标誌  是否等于 值
$game_player.terrain_tag ==

某事件当前所在地形标誌  是否等于 值
$game_map.events[事件编号].terrain_tag ==

V3.5感谢流星姐的脚本优化)

  1. #==============================================================================
  2. # ■ RM_VX地形标志V3.0_图块版本 By TERENCE(龙皇)
  3. #------------------------------------------------------------------------------
  4. #  地形标志设置方法:
  5. #  A~E每张图块ID都是从最左上方开始计算(由左到右)
  6. #   001,002,003,004,005,006,007,008
  7. #   009,010,011,012,013,014,015,016
  8. #   ...............................
  9. #   249,250,251,252,253,254,255,256
  10. #
  11. #   { 图块ID=>地形标志值 ,图块ID=>地形标志值 ,.......}
  12. #   如果没设置地形标志值 调用后默认值为0
  13. #------------------------------------------------------
  14. #   ★注意事项:
  15. #   [B页]的第一格空白图块是"不能"设置地形标志的
  16. #   因为它是专门清理图块B~E的工具   而非图块
  17. #   所以图块[B页]的部分 ID从第二格002开始计算
  18. #
  19. #   001[X设置不能],002,003,004,005,006,007,008
  20. #   ...............................
  21. #------------------------------------------------------
  22. #   调用方法:
  23. #
  24. #   获取角色当前所在地形标誌
  25. #   $game_player.terrain_tag
  26. #   
  27. #   获取某事件当前所在地形标誌
  28. #   $game_map.events[事件编号].terrain_tag
  29. #------------------------------------------------------
  30. #   事件脚本中常用的使用方法:
  31. #
  32. #   角色当前所在地形标誌  帶入 某变量中
  33. #   $game_variables[变量编号] = $game_player.terrain_tag
  34. #
  35. #   某事件当前所在地形标誌  帶入 某变量中
  36. #   $game_variables[变量编号] = $game_map.events[事件编号].terrain_tag
  37. #------------------------------------------------------
  38. #   事件条件分歧脚本中常用的使用方法:
  39. #
  40. #   角色当前所在地形标誌  是否等于 值
  41. #   $game_player.terrain_tag == 值
  42. #
  43. #   某事件当前所在地形标誌  是否等于 值
  44. #   $game_map.events[事件编号].terrain_tag == 值
  45. #
  46. #==============================================================================

  47. class Game_Character
  48. #--------------------------------------------------------------------------
  49. # ● 地形标志设置区
  50. #--------------------------------------------------------------------------

  51.   # 图块A的部分_ID (ID:1~256)
  52.   MAP_TILE_A = {1=>0 ,256=>0}
  53.   MAP_TILE_A.default = 0

  54.   # 图块B的部分_ID  (ID:2~256) ★
  55.   MAP_TILE_B = {2=>0 ,256=>0}
  56.   MAP_TILE_B.default = 0

  57.   # 图块C的部分_ID  (ID:1~256)
  58.   MAP_TILE_C = {1=>0 ,256=>0}
  59.   MAP_TILE_C.default = 0

  60.   # 图块D的部分_ID  (ID:1~256)
  61.   MAP_TILE_D = {1=>0 ,256=>0}
  62.   MAP_TILE_D.default = 0

  63.   # 图块E的部分_ID  (ID:1~256)
  64.   MAP_TILE_E = {1=>0 ,256=>0}
  65.   MAP_TILE_E.default = 0

  66. #--------------------------------------------------------------------------
  67. # ● 获取地形标志
  68. #--------------------------------------------------------------------------
  69.   def terrain_tag   
  70.     # 计算图块ID数值
  71.     a = $game_map.data[@x, @y, 0]-2000
  72.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  73.     map_tile_id_1 = ($game_map.data[@x, @y, 1]-2000) / 48
  74.     map_tile_id_2 = ($game_map.data[@x, @y, 2]+1)
  75.          
  76.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  77.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  78.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  79.    
  80.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0 # 图块A的ID矫正
  81.    
  82.     case map_tile_id_2
  83.     when 1
  84.       # 获取图块A部分的地形标志
  85.       return MAP_TILE_A[map_tile_id_0] if ( (1..256) === map_tile_id_0)
  86.     when 2..256
  87.       # 获取图块B部分的地形标志
  88.       return MAP_TILE_B[map_tile_id_2]
  89.     when 257..512
  90.       # 获取图块C部分的地形标志
  91.       return MAP_TILE_C[map_tile_id_2-256]
  92.     when 513..768
  93.       # 获取图块D部分的地形标志
  94.       return MAP_TILE_D[map_tile_id_2-512]
  95.     when 769..1024
  96.       # 获取图块E部分的地形标志
  97.       return MAP_TILE_E[map_tile_id_2-768]
  98.     else
  99.       # 黑屏区未定义(尚未规划任何)图块区域  回传0
  100.       return 0   
  101.     end
  102.   end  
  103. end
复制代码

范例工程:(V3.0)
http://rpg.blue/upload_program/d/TERENCE_VX_111976575.rar

另P.S.
感谢snstar2006提供美兽写的计算图块ID的脚本
SORRY!!~连帖~我不是故意的

图块编辑器脚本在此:http://rpg.blue/viewthread.php?tid=115381
作者: 雪流星    时间: 2009-1-10 13:40
return 0 if MAP_TILE_B[map_tile_id_2]==nil
return MAP_TILE_B[map_tile_id_2]
可以縮短成
return MAP_TILE_B[map_tile_id_2] ? MAP_TILE_B[map_tile_id_2] : 0

或著 ==nil 也可以寫成 .nil?
[LINE]1,#dddddd[/LINE]
if (map_tile_id_2 >= 257) and (map_tile_id_2 <= 512) d等
可以寫成
if map_tile_id2 / 257 == 0/1/2/3
返回0就是B、返回1就是C....等
[LINE]1,#dddddd[/LINE]
還有哈表表的寫法可以改成:
{ 地形標記 => [圖塊ID, 圖塊ID, 圖塊ID, ...]}
這樣設置起來比較方便
方法參考沉影不器的關鍵字變色腳本

PS:
這段計算圖塊ID的腳本是我寫的
美獸寫的我沒找到,寫的可能會更漂亮
作者: 精灵使者    时间: 2009-1-10 17:27
还要注意一件事:A图块里也是有橡皮的
作者: TERENCE    时间: 2009-1-10 19:39
以下引用snstar2006于2009-1-10 5:40:13的发言:
還有哈表表的寫法可以改成:
{ 地形標記 => [圖塊ID, 圖塊ID, 圖塊ID, ...]}
這樣設置起來比較方便
方法參考沉影不器的關鍵字變色腳本

如此一來
使用者在算地图ID时 很不方便 要从1号数到1千多号
我之所以这样特别把A~E的ID分开
是為了方便  使用者  算地图ID
使用者可以利用简单的乘法与数ˇ数ˋ找出ID值
A~E每个都是从1256
(每張最多32行,所以使用计算复杂度只有8*(二位数))

{ 图块ID=>地形标志值 ,图块ID=>地形标志值 ,.......}
这种使用方法思维设计  类似RM_XP地形标志使用方法
只是图块ID位置要自己找!!

以上是龙仔的狂妄言语......不要PIA我


以下引用精灵使者于2009-1-10 9:27:58的发言:
还要注意一件事:A图块里也是有橡皮的

那个橡皮是可以设置ID的(它是透明的图块)
我說的
黑屏区未定义(尚未规划任何)图块区域  回传0
指的是新建地图时连像皮都没抹过的地方喔!!

此時map_tile_id_0等于-1407
抹了A图块里的橡皮
map_tile_id_0是137
作者: 雪流星    时间: 2009-1-10 19:55
我觉得直接在脚本中强制限制橡皮元件的地形标记为0就好了[LINE]1,#dddddd[/LINE]

龙黄你误会我的意思了
我不是说一次把全部的元件都设定好
是说这样

A={
1 => [1, 2, 3, 4, 5, 6],
2 => [7, 8, 9, 10],
3 => [],
4 => [11, 12, 23, 56],
5 => [22, 78, 99],
6 => [],
7 => []
}

一样只是要填需要的,只是 1、2、3这些地形标记只要一次

你看一下沉影的关键字变色脚本就明白了
作者: 柳无双    时间: 2009-1-10 20:10
{/fd}显然,tomy的vx地图编辑器自带地形标志扩展功能,
可视化,直观操作
作者: TERENCE    时间: 2009-1-10 20:13
以下引用snstar2006于2009-1-10 11:55:33的发言:

我觉得直接在脚本中强制限制橡皮元件的地形标记为0就好了

不設置A橡皮元件就是0
B~E的那个橡皮元件是不能设置成0
如果是这样没模B~E图块的地方 会永远回传0

即使你有設置
# 图块A的部分_ID (ID:1~256)
MAP_TILE_A = {1=>0 ,256=>0......}
也一樣
[LINE]1,#dddddd[/LINE]
话说我很想知道那个地图ID你是用甚麼办法做出来的
我曾也 p $game_map.map.data 看过(嘗試過)
但出来的只有一16进制的值而已
完全找不到資料的影子在內


snstar2006
你是怎麼办到的??


另P.S
p这个语法太好用了
脚本有问题时都能用这个在检验何处有问题

作者: 雪流星    时间: 2009-1-10 20:19
我是看美兽的暂时修改通行的脚本
反向计算得到的

在VX脚本中判断地图通行度的地方也有
那个十六进制是代表通行度,你可以去看F1
p $game_map.map.data 出来的是 data 的在记忆体里面的地址
data 是表格(table) 类

[LINE]1,#dddddd[/LINE]
还有,龙黄你误会我的意思了
我不是说一次把全部的元件都设定好
是说这样

A={
1 => [1, 2, 3, 4, 5, 6],
2 => [7, 8, 9, 10],
3 => [],
4 => [11, 12, 23, 56],
5 => [22, 78, 99],
6 => [],
7 => []
}

一样只是要填需要的,只是 1、2、3这些地形标记只要一次

你看一下沉影的关键字变色脚本就明白了
[LINE]1,#dddddd[/LINE]

刚才看了一下默认脚本的定义,发现 class Game_Map 那段不用
因为在Game_Map里面本来就有
  1.   #--------------------------------------------------------------------------
  2.   # ● 獲取地圖數據
  3.   #--------------------------------------------------------------------------
  4.   def data
  5.     return @map.data
  6.   end
复制代码

读取的时候用 $game_map.data 代替 $game_map.map.data 就可以了

作者: TERENCE    时间: 2009-1-10 20:47
以下引用snstar2006于2009-1-10 12:19:06的发言:
还有,龙黄你误会我的意思了
我不是说一次把全部的元件都设定好
是说这样
A={
1 => [1, 2, 3, 4, 5, 6],
2 => [7, 8, 9, 10],
3 => [],
4 => [11, 12, 23, 56],
5 => [22, 78, 99],
6 => [],
7 => []
}
一样只是要填需要的,只是 1、2、3这些地形标记只要一次
你看一下沉影的关键字变色脚本就明白了

恩~我現在已经知道你的意思了!!
原谅我这只不想再改的懒惰的龙.....


话说只要达到目的就行了(只是方法不同而已)~PIA


以下引用snstar2006于2009-1-10 12:19:06的发言:
在VX脚本中判断地图通行度的地方也有
那个十六进制是代表通行度,你可以去看F1

我家那个F1帮助是日文


以下引用柳无双于2009-1-10 12:10:47的发言:
显然,tomy的vx地图编辑器自带地形标志扩展功能,
可视化,直观操作

不过那套编辑器MS不适合每个用戶的樣子
好像很多人都反应不能使用.......

作者: 雪流星    时间: 2009-1-10 20:55
我的簽名...裡面有說明檔
作者: TERENCE    时间: 2009-1-10 20:58
以下引用snstar2006于2009-1-10 12:55:35的发言:

我的簽名...裡面有說明檔

恩~~我剛剛已經載好了。

作者: 柳无双    时间: 2009-1-10 21:40
没有装。net    装了就能用
人家本来就说明了怎么用,没有仔细看就,,,,
作者: TERENCE    时间: 2009-1-10 21:48
以下引用柳无双于2009-1-10 13:40:52的发言:
没有装。net    装了就能用
人家本来就说明了怎么用,没有仔细看就,,,,

不是每个人都是那麼勤劳的(我知道装。net....我有用过)


所以说我的这个脚本没有利用价值了~~狂泣

作者: 雪流星    时间: 2009-1-11 04:39
有人反應裝了.net還是不能用

所以我早就想要在寫一個
龍黃你不會作白功的{/qiang}
作者: TERENCE    时间: 2009-1-11 07:02
以下引用snstar2006于2009-1-10 20:39:47的发言:

有人反應裝了.net還是不能用

所以我早就想要在寫一個
龍黃你不會作白功的

謝謝~~流星姐  的  鼓励!!

作者: 柳无双    时间: 2009-1-11 07:06
以下引用TERENCE于2009-1-10 23:02:24的发言:


以下引用snstar2006于2009-1-10 20:39:47的发言:

有人反應裝了.net還是不能用

所以我早就想要在寫一個
龍黃你不會作白功的


謝謝~~流星姐  的  鼓励!!


主要是便利性上,有可视化界面方便的多,雪流星赞助龙皇一个编辑器吧。。。{/hx}
作者: 雪流星    时间: 2009-1-11 18:42
以下引用柳无双于2009-1-10 23:06:29的发言:
主要是便利性上,有可视化界面方便的多,雪流星赞助龙皇一个编辑器吧。。。

恩,已经在做了
主要是A图块好难算

@@! 终於把A1部分算完了
[LINE]1,#dddddd[/LINE]
显示的部分都弄完了 @@
明天继续弄输出的部分
顺便贴一下优化的脚本:
  1. #==============================================================================
  2. # ■ RM_VX地形标志V3.0_图块版本 By TERENCE(龙皇)
  3. #------------------------------------------------------------------------------
  4. #  地形标志设置方法:
  5. #  A~E每张图块ID都是从最左上方开始计算(由左到右)
  6. #   001,002,003,004,005,006,007,008
  7. #   009,010,011,012,013,014,015,016
  8. #   ...............................
  9. #   249,250,251,252,253,254,255,256
  10. #
  11. #   { 图块ID=>地形标志值 ,图块ID=>地形标志值 ,.......}
  12. #   如果没设置地形标志值 调用后默认值为0
  13. #------------------------------------------------------
  14. #   ★注意事项:
  15. #   [B页]的第一格空白图块是"不能"设置地形标志的
  16. #   因为它是专门清理图块B~E的工具   而非图块
  17. #   所以图块[B页]的部分 ID从第二格002开始计算
  18. #
  19. #   001[X设置不能],002,003,004,005,006,007,008
  20. #   ...............................
  21. #------------------------------------------------------
  22. #   调用方法:
  23. #
  24. #   获取角色当前所在地形标誌
  25. #   $game_player.terrain_tag
  26. #   
  27. #   获取某事件当前所在地形标誌
  28. #   $game_map.events[事件编号].terrain_tag
  29. #------------------------------------------------------
  30. #   事件脚本中常用的使用方法:
  31. #
  32. #   角色当前所在地形标誌  帶入 某变量中
  33. #   $game_variables[变量编号] = $game_player.terrain_tag
  34. #
  35. #   某事件当前所在地形标誌  帶入 某变量中
  36. #   $game_variables[变量编号] = $game_map.events[事件编号].terrain_tag
  37. #------------------------------------------------------
  38. #   事件条件分歧脚本中常用的使用方法:
  39. #
  40. #   角色当前所在地形标誌  是否等于 值
  41. #   $game_player.terrain_tag == 值
  42. #
  43. #   某事件当前所在地形标誌  是否等于 值
  44. #   $game_map.events[事件编号].terrain_tag == 值
  45. #
  46. #==============================================================================

  47. class Game_Character
  48. #--------------------------------------------------------------------------
  49. # ● 地形标志设置区
  50. #--------------------------------------------------------------------------

  51.   # 图块A的部分_ID (ID:1~256)
  52.   MAP_TILE_A = {1=>0 ,256=>0}
  53.   MAP_TILE_A.default = 0

  54.   # 图块B的部分_ID  (ID:2~256) ★
  55.   MAP_TILE_B = {2=>0 ,256=>0}
  56.   MAP_TILE_B.default = 0

  57.   # 图块C的部分_ID  (ID:1~256)
  58.   MAP_TILE_C = {1=>0 ,256=>0}
  59.   MAP_TILE_C.default = 0

  60.   # 图块D的部分_ID  (ID:1~256)
  61.   MAP_TILE_D = {1=>0 ,256=>0}
  62.   MAP_TILE_D.default = 0

  63.   # 图块E的部分_ID  (ID:1~256)
  64.   MAP_TILE_E = {1=>0 ,256=>0}
  65.   MAP_TILE_E.default = 0

  66. #--------------------------------------------------------------------------
  67. # ● 获取地形标志
  68. #--------------------------------------------------------------------------
  69.   def terrain_tag   
  70.     # 计算图块ID数值
  71.     a = $game_map.data[@x, @y, 0]-2000
  72.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  73.     map_tile_id_1 = ($game_map.data[@x, @y, 1]-2000) / 48
  74.     map_tile_id_2 = ($game_map.data[@x, @y, 2]+1)
  75.          
  76.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  77.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  78.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  79.    
  80.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0 # 图块A的ID矫正
  81.    
  82.     case map_tile_id_2
  83.     when 1
  84.       # 获取图块A部分的地形标志
  85.       return MAP_TILE_A[map_tile_id_0] if ( (1..256) === map_tile_id_0)
  86.     when 2..256
  87.       # 获取图块B部分的地形标志
  88.       return MAP_TILE_B[map_tile_id_2]
  89.     when 257..512
  90.       # 获取图块C部分的地形标志
  91.       return MAP_TILE_C[map_tile_id_2-256]
  92.     when 513..768
  93.       # 获取图块D部分的地形标志
  94.       return MAP_TILE_D[map_tile_id_2-512]
  95.     when 769..1024
  96.       # 获取图块E部分的地形标志
  97.       return MAP_TILE_E[map_tile_id_2-768]
  98.     else
  99.       # 黑屏区未定义(尚未规划任何)图块区域  回传0
  100.       return 0   
  101.     end
  102.   end  
  103. end
复制代码

作者: TERENCE    时间: 2009-1-11 22:46
以下引用snstar2006于2009-1-11 10:42:29的发言:
显示的部分都弄完了 @@
明天继续弄输出的部分
顺便贴一下优化的脚本

辛苦流星姐了........主楼跟范例需要更新一下吗!??


不过我以前发的某脚本也被禾西优化过,跟這次一樣.....
感觉真的乱怪不好意思一把!!
(我的东西好像变成脚本前辈们的优化课题作业...x_x)


原来我认识的RUBY脚本简化语句还不够深入呢!!

作者: 精灵使者    时间: 2009-1-12 01:07
以下引用TERENCE于2009-1-10 23:02:24的发言:


以下引用snstar2006于2009-1-10 20:39:47的发言:

有人反應裝了.net還是不能用

所以我早就想要在寫一個
龍黃你不會作白功的


謝謝~~流星姐  的  鼓励!!

例如我,就根本无法执行(该程序出错退出)
作者: 3nξhα0_lim    时间: 2009-1-12 01:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2009-1-12 03:54
以下引用3nξhα0_lim于2009-1-11 17:18:05的发言:
如果说编辑器,我可以给个简单的参考,就像Blizz那样,可视化的编辑器生成出来的只是脚本设定的部分,并不用直接修改rvdata,可避存档错误,造成文件损坏。

算我鸡蛋里挑骨头好了……
如果说我吃饱了没事撑着干,把事件当图块用……
可是这脚本却不能够读取事件图块上的地形标志,反而是读取给地图的地形标志……
这里可以改进并完美化。
缺点:冲突性至少增加5-6倍。

还好不会冲突
事件的图像是图块的时候
储存为 tile_id,
所以只要读出来就好了

    for event in $game_map.events.values
      if event.pos?(@x, @y) and event.tile_id > 0
        map_tile_id_2 = event.tile_id
      end
    end

不过这里的图块ID跟我之前算的差1,是从0开始算的
作者: TERENCE    时间: 2009-1-12 05:11
明天一周起,我会不在家。。。
无法随时更新主楼~~也联络不到我,
所以如果有必要的話,可能劳请流星姐帮忙更新一下了!

作者: 雪流星    时间: 2009-1-16 14:57
编辑器脚本
http://rpg.blue/viewthread.php?tid=115381
作者: 精灵使者    时间: 2009-1-16 15:57
华丽的将链接更新到主楼。
作者: TERENCE    时间: 2009-1-21 02:00
以下引用精灵使者于2009-1-16 7:57:58的发言:

华丽的将链接更新到主楼。

辛苦精灵了~~

作者: 沉影不器    时间: 2009-1-21 05:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2009-1-21 20:42
以下引用沉影不器于2009-1-20 21:50:42的发言:
跟.net没关系吧...虽然日文看不懂...

看到TERENCE开始做vx的事,开心得很...咦,为啥...

我们大家一起加加油把龙黄拉来VX这个大家庭 =v=
作者: 沉影不器    时间: 2009-1-23 01:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: lzy136188230    时间: 2010-9-9 18:50
本帖最后由 lzy136188230 于 2010-9-10 12:48 编辑

回复 TERENCE 的帖子

让他读取主角前面一格的地图图块的地形标号怎么办啊?
   




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