Project1

标题: RMVX地形标志V2.0版(过期帖) [打印本页]

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

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


V2.0版
提升调用terrain_tag方法的效率

第二隐忧:
目前该V2.0版脚本存在隐忧就是...
脚本中的 # 过滤其它地图的区域资料 的地方
处理方式有点不妥....
当Areas.rvdata ($data_areas) 资料越来越庞大时
载入地图时所花费的时间相对加长

[LINE]1,#dddddd[/LINE]
使用方法:

在生成区域命名的地方  命名成"数字"即可
如果命名為文字(字串)型式  调用时回传0
在没有区域的情况下调用时(默认下)  也回传0
------------------------------------------------------
调用方法:
获取角色当前所在地形标誌
$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 ==


脚本:

  1. #==============================================================================
  2. # ■ 地形标志V2.0  By TERENCE(龙皇)
  3. #------------------------------------------------------------------------------
  4. #  使用方法:
  5. #
  6. #   在生成区域命名的地方  命名成"数字"即可
  7. #   如果命名為文字型(字串)型式  调用时回传0
  8. #   在没有区域的情况下调用时(默认下)  也回传0
  9. #------------------------------------------------------
  10. #   调用方法:
  11. #
  12. #   获取角色当前所在地形标誌
  13. #   $game_player.terrain_tag
  14. #   
  15. #   获取某事件当前所在地形标誌
  16. #   $game_map.events[事件编号].terrain_tag
  17. #------------------------------------------------------
  18. #   事件脚本中常用的使用方法:
  19. #
  20. #   角色当前所在地形标誌  帶入 某变量中
  21. #   $game_variables[变量编号] = $game_player.terrain_tag
  22. #
  23. #   某事件当前所在地形标誌  帶入 某变量中
  24. #   $game_variables[变量编号] = $game_map.events[事件编号].terrain_tag
  25. #------------------------------------------------------
  26. #   事件条件分歧脚本中常用的使用方法:
  27. #
  28. #   角色当前所在地形标誌  是否等于 值
  29. #   $game_player.terrain_tag == 值
  30. #
  31. #   某事件当前所在地形标誌  是否等于 值
  32. #   $game_map.events[事件编号].terrain_tag == 值
  33. #
  34. #==============================================================================
  35. class Game_Map
  36.   #--------------------------------------------------------------------------
  37.   # ● 设置
  38.   #--------------------------------------------------------------------------
  39.   alias area_setup setup
  40.   def setup(map_id)
  41.     area_setup(map_id)
  42.     # 生成 暂存过滤区域物件资料 数组
  43.     $temp_area = []
  44.     # 过滤其它地图的区域资料
  45.     for n in 0..$data_areas.values.size-1
  46.       if $data_areas.values[n].map_id == @map_id
  47.         $temp_area.push $data_areas.values[n]
  48.       end
  49.     end
  50.   end
  51. end

  52. class Game_Character
  53.   #--------------------------------------------------------------------------
  54.   # ● 判断是否在区域内
  55.   #--------------------------------------------------------------------------
  56.   def area?(area)
  57.     return false if @x < area.rect.x
  58.     return false if @y < area.rect.y
  59.     return false if @x >= area.rect.x + area.rect.width
  60.     return false if @y >= area.rect.y + area.rect.height
  61.     return true
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # ● 获取地形标志
  65.   #--------------------------------------------------------------------------
  66.   def terrain_tag
  67.     # 获取地图ID
  68.     map_id = $game_map.map_id
  69.     # 回传 所在地形标志 的值
  70.     for area in $temp_area
  71.       if area?(area)
  72.         return area.name.to_i
  73.       end
  74.     end
  75.     # 默认下 回传0
  76.     return 0
  77.   end
  78. end
复制代码

范例工程:
http://rpg.blue/upload_program/d ... n_tag_111881102.rar
作者: 疯鸡瘫圣老贱    时间: 2009-1-8 15:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: TERENCE    时间: 2009-1-8 15:57
以下引用疯鸡瘫圣老贱于2009-1-8 7:43:03的发言:

收下……
繁体……
区域过多也是不好的……

工程有乱码吗??
我记得是用简体啊....

作者: 精灵使者    时间: 2009-1-8 18:54
区域其实可以从区域名下手。
建议从图块或者自动元件下手比较好
作者: TERENCE    时间: 2009-1-8 19:16
以下引用精灵使者于2009-1-8 10:54:05的发言:
区域其实可以从区域名下手。
建议从图块或者自动元件下手比较好

本脚本 就是从 区域名下手
这里最棘手的就是....
VX把每张地图的区域资讯全都挤在
Areas.rvdata ( $data_areas )  里

所以才需要 过滤其他地图的区域部分( 的回圈 )
作者: 精灵使者    时间: 2009-1-8 19:17
这个这不就成显示地图名的方法了么?
每次进map的时候刷新此map的area,而不是直接读取所有的area然后刷新……这样应该会好些。
另外,考虑一下area重叠的问题。
作者: TERENCE    时间: 2009-1-8 19:35
以下引用精灵使者于2009-1-8 11:17:56的发言:
这个这不就成显示地图名的方法了么?
每次进map的时候刷新此map的area,而不是直接读取所有的area然后刷新……这样应该会好些。
另外,考虑一下area重叠的问题。

这就是我所伤脑筋的地方
這也是一定要过滤
map资讯跟area资讯是无关的

之所以可以判断角色是否在该地图的某区内
是由 MAP的ID 跟 $data_areas(类似数组)里所有map_id方法  作判定

$data_areas.values以数组方式存放"所有"地图的区域  每张区域都有存放map_id
p $data_areas.values 就一目了然
作者: TERENCE    时间: 2009-1-8 19:40
关於重叠 MS 以最先 生成区域的为主(无论该区命名是否为字串)
作者: 精灵使者    时间: 2009-1-8 22:55
建议在移动场所的函数里面调出值重新读入一次关于此map的area比较好些。这样可以减少并行事件
在场所移动而且移动的map ID不相同的时间进行AREA的处理
作者: TERENCE    时间: 2009-1-9 00:42
以下引用精灵使者于2009-1-8 14:55:58的发言:

建议在移动场所的函数里面调出值重新读入一次关于此map的area比较好些。这样可以减少并行事件
在场所移动而且移动的map ID不相同的时间进行AREA的处理

精灵的意思是....
在载入地图数据rvdata时,
先進行  过滤其他地图的区域部分( 的回圈 )  嗎?

这样的确能提升调用terrain_tag方法的效率
但是载入地图时所花费的时间相对加长些喔!!
作者: 精灵使者    时间: 2009-1-9 00:51
恩,而且地形标志的更新也不是并行的,而是你移动以后再进行地形标志的更新工作(移动可能会慢点,但是又减少一个并行的操作)
作者: TERENCE    时间: 2009-1-9 06:10
版本更新
V2.0版

作者: 雪流星    时间: 2009-1-9 06:23
建議龍黃可以用哈希表+圖塊ID來做成地形標記
作者: TERENCE    时间: 2009-1-9 06:36
以下引用snstar2006于2009-1-8 22:23:32的发言:

建議龍黃可以用哈希表+圖塊ID來做成地形標記

图块ID
在VX里是怎麼被RGSS2脚本记载的??
作者: 雪流星    时间: 2009-1-9 06:50
美獸有寫一個計算圖塊ID的腳本
要找一下

我有寫一個,不過不完美,A5的部分計算有點問題
等我修改一下

  1. class Scene_Map
  2. alias passage_update update
  3. def update
  4.    passage_update
  5.    if Input.trigger?(Input::L)
  6.      a = $game_map.map.data[$game_player.x, $game_player.y, 0]-2000
  7.      map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  8.      map_tile_id_1 = ($game_map.map.data[$game_player.x, $game_player.y, 1]-2000) / 48
  9.      map_tile_id_2 = ($game_map.map.data[$game_player.x, $game_player.y, 2]+1)
  10.          
  11.      map_tile_id_0 = 0 if map_tile_id_0 == -42
  12.      map_tile_id_1 = 0 if map_tile_id_1 == -42
  13.      map_tile_id_2 = 0 if map_tile_id_2 == -42

  14.      map_tile_ids = "A: #{map_tile_id_0.to_s}   " +
  15.                     "1: #{map_tile_id_1.to_s}   " +
  16.                     "B~E: #{map_tile_id_2.to_s}"
  17.      p map_tile_ids
  18.    end
  19. end
  20. end

  21. class Game_Map
  22.   def map
  23.     return @map
  24.   end
  25. end
复制代码

[LINE]1,#dddddd[/LINE]
修改完畢

原理是這樣的:
每個原件在tilemap裡面都有一個編號
計算之後可以得到該原件在圖塊裡面的相對對位置
A圖塊算一張(1~256)
B~E整個算一張(1~256、257~512、513~768、769~1024)

還有一個在A層和B~E層的是用來繪製像深海、欄杆、樹木
這些以另外一個A層原件為底的自動元件
作者: TERENCE    时间: 2009-1-9 07:33
以下引用snstar2006于2009-1-8 22:50:16的发言:

原理是這樣的:
每個原件在tilemap裡面都有一個編號
計算之後可以得到該原件在圖塊裡面的相對對位置
A圖塊算一張(1~256)
B~E整個算一張(1~256、257~512、513~768、769~1024)

map_tile_id_1
指的是啥??
作者: TERENCE    时间: 2009-1-9 09:19
没事我已经找到规律了!
map_tile_id_1map_tile_id_0 的 规律了!
作者: v2sam    时间: 2009-1-9 19:48
顶下龙仔{/cy}
作者: TERENCE    时间: 2009-1-9 19:54
基本上我已经用图块ID做出地形标志来了

但是VX地图素材规格我不清楚

A~E图块中能往下增加嗎???
作者: 雪流星    时间: 2009-1-9 20:14
以下引用TERENCE于2009-1-9 11:54:33的发言:
基本上我已经用图块ID做出地形标志来了
但是VX地图素材规格我不清楚
A~E图块中能往下增加嗎???

看一下我簽名裡的說明吧
作者: TERENCE    时间: 2009-1-9 22:51
以下引用snstar2006于2009-1-9 12:14:19的发言:
看一下我簽名裡的說明吧

VX 在图像的设置上简化了很多程序(例如不用打开数据库来修改通行度),但是就限制图块大小数量

这麼说...
A~E每一張地图
图块格数最多只能256囉!!
作者: TERENCE    时间: 2009-1-10 00:58
腦殘......屏蔽中

[LINE]1,#dddddd[/LINE]版主对此帖的评论:『注意不要連帖喔』,积分『-5』。这些被扣积分的一半会用于对本帖正确答案的悬赏。




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