Project1

标题: 【另类原理】VX复杂区域设置 [打印本页]

作者: 怪蜀黍    时间: 2012-10-26 14:55
标题: 【另类原理】VX复杂区域设置
本帖最后由 protosssonny 于 2013-10-23 09:53 编辑

序言:
VA是可以轻易设置任意形状区域,而VX只能设置矩形区域,若要设置任意形状的区域则需要多个矩形区域的拼凑,十分麻烦。所以今天P叔发布一个VX复杂区域设置的脚本,献给我们VX党的同学们。
为什么叫【另类原理】呢?因为本脚本的实现原理是用新建地图来设置区域的,与之前猫君的方法不同。
脚本介绍:
本脚本打破了VX默认区域只能设计成矩形的局限。
主要原理:
利用指定图块在已被设定成区域的地图上直接绘制复杂区域。
主要用途:
1、可以利用本脚本实现复杂区域的遇敌设置
2、可以利用本脚本判定角色是否在指定名称的复杂区域中
判定方法:使用语句if $game_player.new_area_data[3] == "区域名称" 来判定
例如:if $game_player.new_area_data[3] == "<区域>=1"
兼容性:
1、与默认的区域兼容,如果角色同时处于默认区域和复杂区域,则会同时遇到指定默认区域的敌人和复杂区域的敌人。
2、复杂区域间兼容,如果角色同时处于多个复杂区域,则会同时遇到这些复杂区域的敌人。
3、地图遇敌与默认区域、复杂区域兼容,如果地图还设计了可遇敌人,那么在区域中也可以遇到地图本身设定的敌人。

【图文教程使用方法】
总目标:实现泥地为MAP001的一个遇敌区域(可遇到史莱姆),雪地为MAP001的另一个遇敌区域(可遇到蝙蝠)。
1、新建工程,再新建3张地图,其中第一张地图为主地图,后面两张地图用于设计为主地图的两个区域。主地图命名为MAP001(可任意命名),但是区域地图必须带有“<区域>”二字(含尖括号)

2、绘制MAP001,并画出泥地和雪地,把他们的形状画成不规则图形。

3、复制MAP001的图形到两张区域地图,主要是用于区域的对齐。

4、用小石块的图块填充区域地图的泥地和雪地。因为默认脚本中是作为ID为528图块(也就是小石块)作为区域图块的。这个可以在脚本中自己设置。

5、为区域地图分别设置可遇到的敌人队伍。

好了,这样就全部完成了。假入主角在泥地行走,就可能遇到2号地图的敌人史莱姆,假入主角在雪地行走,就可能遇到3号地图的敌人蝙蝠。
你们还可以用语句:
  1. if $game_player.new_area_data[3] == "<区域>=1"
复制代码
来判定角色是否在名称为“<区域>=1”的地图哦!

这样一来,我们VX也可以像VA那样轻易设计复杂的区域了。
2013年10月23日更新:
附上范例工程: 复杂区域设置.rar (244.05 KB, 下载次数: 77)
应某些用户的需求,发布兼容战斗背景的版本: 【战斗背景兼容版】复杂区域设置.rar (1.53 MB, 下载次数: 84)

附上脚本:
  1. #==============================================================================
  2. # ■ 复杂区域设置
  3. #------------------------------------------------------------------------------
  4. #
  5. #   本脚本来自www.66RPG.com,使用和转载请保留此信息
  6. #
  7. #   作者:protosssonny   
  8. #
  9. #==============================================================================
  10. # 脚本介绍:
  11. #     本脚本打破了VX默认区域只能设计成矩形的局限。
  12. # 主要原理:
  13. #     利用指定图块在已被设定成区域的地图上直接绘制复杂区域。
  14. # 主要用途:
  15. #     1、可以利用本脚本实现复杂区域的遇敌设置
  16. #     2、可以利用本脚本判定角色是否在指定名称的复杂区域中
  17. #     判定方法:使用语句if $game_player.new_area_data[3] == "区域名称" 来判定
  18. #     例如:if $game_player.new_area_data[3] == "<区域>=1"
  19. # 兼容性:
  20. #     1、与默认的区域兼容,如果角色同时处于默认区域和复杂区域,则会同时遇到指
  21. #     定默认区域的敌人和复杂区域的敌人。
  22. #     2、复杂区域间兼容,如果角色同时处于多个复杂区域,则会同时遇到这些复杂区
  23. #     域的敌人。
  24. #     3、地图遇敌与默认区域、复杂区域兼容,如果地图还设计了可遇敌人,那么在区
  25. #     域中也可以遇到地图本身设定的敌人。
  26. #==============================================================================

  27. #==============================================================================
  28. # ■ 参数设定
  29. #------------------------------------------------------------------------------
  30. # 在这里设定一些脚本需要的参数
  31. #==============================================================================
  32. module Area_Map
  33.   
  34. # 请设置区域图块的ID。如果需要设置区域,就要统一使用以下ID的图块来绘制区域。
  35. # 如果不清楚想设计成为区域图块的图块ID,请在任意地图上绘制一个该图块,在它上面
  36. # 设置一个事件,事件内写脚本:$game_player.show_tile_id 即可查看到该图块的ID。
  37.   TILE_ID = 528
  38.   
  39. # 请设置地图及其对应的区域,想把ID为2和3的地图设置成ID为1的地图的区域,就写
  40. # 1 => [2,3] 即可达到目的。注意,除了最后一行以外,每行的最后都要加逗号。
  41.   AREA_MAP =
  42.   {
  43.     1 => [2,3],   # 2、3号ID的地图作为1号ID地图的区域
  44.     4 => [5]      # 5号ID的地图作为4号ID地图的区域
  45.    
  46.    
  47.   } # 这半个括号不可以删掉
  48. end  

  49. #==============================================================================
  50. # ■ Game_Player
  51. #------------------------------------------------------------------------------
  52. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  53. # 本类的实例请参考 $game_player。
  54. #==============================================================================

  55. class Game_Player < Game_Character
  56.   #--------------------------------------------------------------------------
  57.   # ● 【新定义】新地图作为区域的判定计算
  58.   #--------------------------------------------------------------------------
  59.   def new_area(map_id)
  60.     area_maps = []
  61.     if Area_Map::AREA_MAP.keys.include?(map_id)
  62.       area_maps = Area_Map::AREA_MAP[map_id]
  63.     end
  64.     return area_maps
  65.   end  
  66.   #--------------------------------------------------------------------------
  67.   # ● 【新定义】新地图作为区域的数据生成以及返回
  68.   #--------------------------------------------------------------------------
  69.   def new_area_data
  70.     data = [false, 0, [], ""]
  71.     for map in new_area($game_map.map_id)
  72.       if load_data("Data/MapInfos.rvdata")[map].name.include?("<区域>")
  73.         case map
  74.         when 1..9
  75.           name_id = "00#{map}"
  76.         when 10..99  
  77.           name_id = "0#{map}"
  78.         when 100..999  
  79.           name_id = "#{map}"
  80.         end
  81.         load = load_data("Data/Map"+ name_id + ".rvdata")
  82.         data[0] = load.data[x, y, 2] == Area_Map::TILE_ID
  83.         if data[0]
  84.           data[1] = load.encounter_step
  85.           data[2] += load.encounter_list
  86.           data[3] = load_data("Data/MapInfos.rvdata")[map].name
  87.         else
  88.           data[2].delete(load.encounter_list)
  89.         end  
  90.         break if data[0]
  91.       end
  92.     end
  93.     return data
  94.   end  
  95.   #--------------------------------------------------------------------------
  96.   # ● 【新定义】用于查看图块ID的方法
  97.   #--------------------------------------------------------------------------
  98.   def show_tile_id
  99.     p $game_map.map.data[x, y, 2]
  100.   end  
  101.   #--------------------------------------------------------------------------
  102.   # ● 【再定义】初始化遇敌计数
  103.   #--------------------------------------------------------------------------
  104.   def make_encounter_count
  105.     if $game_map.map_id != 0
  106.       n = $game_map.encounter_step
  107.       @encounter_count = rand(n) + rand(n) + 1  # 好比掷两个骰子
  108.     end
  109.     @encounter_count = new_area_data[1] if new_area_data[1] != 0 # 更改处
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 【再定义】生成遇敌队伍
  113.   #--------------------------------------------------------------------------
  114.   def make_encounter_troop_id
  115.     encounter_list = $game_map.encounter_list.clone
  116.     encounter_list += new_area_data[2] # 更改处
  117.     for area in $data_areas.values
  118.       encounter_list += area.encounter_list if in_area?(area)
  119.     end
  120.     if encounter_list.empty?
  121.       make_encounter_count
  122.       return 0
  123.     end
  124.     return encounter_list[rand(encounter_list.size)]
  125.   end
  126. end  
  127. #------------------------------------------------------------------------------
  128. #
  129. #   本脚本来自www.66RPG.com,使用和转载请保留此信息
  130. #
  131. #                                                          作者:protosssonny   
  132. #                                                             2012年10月26日
  133. #==============================================================================
复制代码

作者: Password    时间: 2012-10-26 15:30
大地图用起来效果会很好

嘛……最近不需要这个功能,P叔辛苦了
以前用过纯事件来做不规则区域遇敌
有点麻烦,不过做好一个复制黏贴就可以了,只要区域不是很大

P叔想听的话短消息或者QQ都可以
作者: 精灵使者    时间: 2012-10-26 15:59
本帖最后由 精灵使者 于 2012-10-26 16:06 编辑

可以考虑用图块-地形标志,这样可能会简易很多
作者: houyuxiaoyang    时间: 2012-10-26 16:07
异常的…………完美…………啊……………………(人吧,太厉害了——不好
作者: 彭格列第XI代    时间: 2012-10-26 17:22
区域遇怪吗- -
这货不怎么用的类型~
喜欢用撞到怪就开始战斗滴~[怪在地图上晃悠的]
发现P叔还没回答昨天滴问题QAQ
作者: 咕噜    时间: 2012-10-26 17:25
会不会发布到主站!
作者: hys111111    时间: 2012-10-26 17:52
所以说在XP里面为了实现一些功能,我会在原有的图块上面用脚本动手脚……
作者: 爱尔伯塔    时间: 2012-10-26 18:31
复杂区域脚本么..
如果要在同样区域有不同怪物战斗的话..
..这个脚本适合你..
应该多谢P叔..这个脚本会对人有帮助的..

作者: chd114    时间: 2012-10-26 18:41
直接全部画在一张图然后脚本做条件分歧不就行了吗···
作者: Mic_洛洛    时间: 2012-10-26 18:50
P叔也快发给VA党们发布技术吧,喵!
VA区的发展壮大很需要一些和P叔一样,既有技术,又会卖萌的触手的说~

作者: 嗨。猪头    时间: 2013-10-19 23:59
能设置成不同区域不同战斗背景吗

作者: 嗨。猪头    时间: 2013-10-22 23:02
【战斗背景兼容版】复杂区域设置.rar

一直使用列表里的最后一个作为有效背景……
其他的都是主地图的背景……





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