设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2226|回复: 4
打印 上一主题 下一主题

[已经解决] 关于地图绘制吊桥效果

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2013-9-16
帖子
11
跳转到指定楼层
1
发表于 2015-4-26 11:06:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 笑和尚 于 2015-4-27 00:56 编辑


总而言之就像这个图片所显示
想做成吊桥一样的效果,即人物可以从桥下穿过,同时也能从桥上走过的状态,不知道怎么实现?


=====↓解决方法↓======

比较简单的方法是类似这样,将吊桥图案变为两层事件,然后在必经之路上以开关控制。
复杂的方法是3L君的脚本,不过脚本冲突的话……………………
{:2_269:}

Lv4.逐梦者 (版主)

无限の剣制

梦石
0
星屑
10074
在线时间
5020 小时
注册时间
2013-2-28
帖子
5030

开拓者贵宾

2
发表于 2015-4-26 11:15:13 | 只看该作者
本帖最后由 VIPArcher 于 2015-4-26 11:50 编辑

看推荐问答……
https://rpg.blue/thread-241125-1-1.html

评分

参与人数 1星屑 +150 收起 理由
taroxd + 150 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
帖子
813

开拓者

3
发表于 2015-4-26 15:02:42 | 只看该作者
  1. #==============================================================================
  2. # ■ Game_Map
  3. #------------------------------------------------------------------------------
  4. #  管理地图的类。拥有卷动地图以及判断通行度的功能。
  5. #   本类的实例请参考 $game_map 。
  6. #==============================================================================

  7. =begin

  8. 由於直接重定義 check_passage
  9. 如果其他腳本有定義可能會發生衝突

  10. =end

  11. class Game_Map
  12.   #--------------------------------------------------------------------------
  13.   # ● セットアップ
  14.   #--------------------------------------------------------------------------
  15.   alias :d8_bridgepass_ori_setup :setup unless defined? d8_bridgepass_ori_setup
  16.   def setup(map_id)
  17.     d8_bridgepass_ori_setup(map_id)
  18.     fix_a3_roof_passage
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 修正房屋屋頂部分通行判定
  22.   #--------------------------------------------------------------------------
  23.   def fix_a3_roof_passage
  24.     for i in (48..55).to_a + (64..71).to_a
  25.       id_base = 2048 + i * 48
  26.       for t in 0..15
  27.         id = id_base + t
  28.         pass_flag = 0b0000
  29.         pass_flag |= 0x02 if [1, 3, 5, 7, 9, 11, 13, 15].include?(t)
  30.         pass_flag |= 0x04 if [4, 5, 6, 7, 12, 13, 14, 15].include?(t)
  31.         pass_flag |= 0x08 if [2, 3, 6, 7, 10, 11, 14, 15].include?(t)
  32.         flag = tileset.flags[id]
  33.         flag = (flag >> 4 << 4) | pass_flag
  34.         tileset.flags[id] = flag
  35.       end
  36.     end
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 通行检查
  40.   #     bit : 判断通行禁止与否的字节(请参照二进制运算)
  41.   #--------------------------------------------------------------------------
  42.   def check_passage(x, y, bit)
  43.     # 非飛行船 => 前方有橋 => 方向不同則提高前方優先級+可通行
  44.     if bit != 0x800
  45.       case bit
  46.       when 0x01 # 2 D
  47.         if $game_player.pos?(x, y) && check_upper_bridge(x, y + 1, bit)
  48.           set_bridge(x, y + 1, 0x10)
  49.           return true
  50.         elsif check_front_bridge(x, y, bit) && check_roof(tile_id(x, y + 1, 0)) && !check_roof(tile_id(x, y, 0))
  51.           return false
  52.         elsif check_front_bridge(x, y, bit) && check_front_bridge(x, y + 1, bit) && check_upper_bridge(x + 1, y, bit)
  53.           return false
  54.         elsif check_upper_bridge(x, y, 0x08)
  55.           return true if $game_player.pos?(x, y + 1)
  56.         end
  57.       when 0x02 # 4 L
  58.         if $game_player.pos?(x, y) && check_upper_bridge(x - 1, y, bit)
  59.           set_bridge(x - 1, y, 0x10)
  60.           return true
  61.         elsif check_front_bridge(x, y, bit) && check_roof(tile_id(x - 1, y, 0)) && !check_roof(tile_id(x, y, 0))
  62.           return false
  63.         elsif check_front_bridge(x, y, bit) && check_front_bridge(x - 1, y, bit) && check_upper_bridge(x, y - 1, bit)
  64.           return false
  65.         elsif check_upper_bridge(x, y, 0x04)
  66.           return true if $game_player.pos?(x - 1, y)
  67.         end
  68.       when 0x04 # 6 R
  69.         if $game_player.pos?(x, y) && check_upper_bridge(x + 1, y, bit)
  70.           set_bridge(x + 1, y, 0x10)
  71.           return true
  72.         elsif check_front_bridge(x, y, bit) && check_roof(tile_id(x + 1, y, 0)) && !check_roof(tile_id(x, y, 0))
  73.           return false
  74.         elsif check_front_bridge(x, y, bit) && check_front_bridge(x + 1, y, bit) && check_upper_bridge(x, y + 1, bit)
  75.           return false
  76.         elsif check_upper_bridge(x, y, 0x02)
  77.           return true if $game_player.pos?(x + 1, y)
  78.         end
  79.       when 0x08 # 8 U
  80.         if $game_player.pos?(x, y) && check_upper_bridge(x, y - 1, bit)
  81.           set_bridge(x, y - 1, 0x10)
  82.           return true
  83.         elsif check_front_bridge(x, y, bit) && check_roof(tile_id(x, y - 1, 0)) && !check_roof(tile_id(x, y, 0))
  84.           return false
  85.         elsif check_front_bridge(x, y, bit) && check_front_bridge(x, y - 1, bit) && check_upper_bridge(x - 1, y, bit)
  86.           return false
  87.         elsif check_upper_bridge(x, y, 0x01)
  88.           return true if $game_player.pos?(x, y - 1)
  89.         end
  90.       when 0x200, 0x400 # Ship
  91.       end
  92.     end
  93.     # 方向判別狀態
  94.     if bit <= 0xf
  95.       # 在屋頂邊緣 & 自身不在橋上 => 是否有橋
  96.       if check_roof(tile_id(x, y, 0)) && !check_front_bridge(x, y, bit)
  97.         case bit
  98.         when 0x01 # 2 D
  99.           set_bridge(x, y + 1, 0) if $game_player.pos?(x, y) && check_front_bridge(x, y + 1, bit)
  100.         when 0x02 # 4 L
  101.           set_bridge(x - 1, y, 0) if $game_player.pos?(x, y) && check_front_bridge(x - 1, y, bit)
  102.           return true if check_bridge_passage(x - 1, y, bit)
  103.         when 0x04 # 6 R
  104.           set_bridge(x + 1, y, 0) if $game_player.pos?(x, y) && check_front_bridge(x + 1, y, bit)
  105.           return true if check_bridge_passage(x + 1, y, bit)
  106.         when 0x08 # 8 U
  107.           set_bridge(x, y - 1, 0) if $game_player.pos?(x, y) && check_front_bridge(x, y - 1, bit)
  108.           return true if check_bridge_passage(x, y - 1, bit)
  109.         end
  110.       # 在橋可通行方向上 => 前方是否有屋頂
  111.       elsif check_bridge_passage(x, y, bit)
  112.         case bit
  113.         when 0x01 # 2 D
  114.           return true if check_roof(tile_id(x, y + 1, 0)) && check_roof_edge(tile_id(x, y + 1, 0))
  115.         when 0x02 # 4 L
  116.           return true if check_roof(tile_id(x - 1, y, 0)) && check_roof_edge(tile_id(x - 1, y, 0))
  117.         when 0x04 # 6 R
  118.           return true if check_roof(tile_id(x + 1, y, 0)) && check_roof_edge(tile_id(x + 1, y, 0))
  119.         end
  120.       end
  121.     end
  122.     # 原始判定
  123.     all_tiles(x, y).each do |tile_id|
  124.       flag = tileset.flags[tile_id]
  125.       next if flag & 0x10 != 0            # [☆] : 不影响通行
  126.       return true  if flag & bit == 0     # [○] : 可以通行
  127.       return false if flag & bit == bit   # [×] : 不能通行
  128.     end
  129.     return false                          # 不能通行
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 屋頂?
  133.   #--------------------------------------------------------------------------
  134.   def check_roof(tile_id)
  135.     return false if tile_id < 2048
  136.     case (tile_id - 2048) / 48
  137.     when 48..55, 64..71 # A3 House Roof #1, #2
  138.       return true
  139.     when 80..87, 96..103, 112..119 # A4 House Roof #1, #2
  140.       return true
  141.     else
  142.       return false
  143.     end
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # ● 屋頂邊緣?
  147.   #--------------------------------------------------------------------------
  148.   def check_roof_edge(tile_id)
  149.     return false if tile_id < 2048
  150.     case (tile_id - 2048) / 48
  151.     when 48..55, 64..71 # A3 House Roof #1, #2
  152.       return (tile_id - 2048) % 48 != 0
  153.     when 80..87, 96..103, 112..119 # A4 House Roof #1, #2
  154.       return ![1, 34, 36, 38, 40, 46].include?((tile_id - 2048) % 48)
  155.     else
  156.       return false
  157.     end
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 確認是否為上方橋面(通行方向相反之橋面)
  161.   #--------------------------------------------------------------------------
  162.   def check_upper_bridge(x, y, bit)
  163.     all_tiles(x, y).each do |tile_id|
  164.       flag = tileset.flags[tile_id]
  165.       next if flag & 0x10 != 0
  166.       bridge = check_bridge(tile_id)
  167.       next unless bridge
  168.       if flag & 0x0800 == 0x00
  169.         tileset.flags[tile_id] = flag | 0x0800
  170.       end
  171.       return true if (bit == 0x01 || bit == 0x08) && bridge == 1
  172.       return true if (bit == 0x02 || bit == 0x04) && bridge == 2
  173.     end
  174.     return false
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 確認使是否為調過優先顯示之前方橋面
  178.   #--------------------------------------------------------------------------
  179.   def check_front_bridge(x, y, bit)
  180.     all_tiles(x, y).each do |tile_id|
  181.       flag = tileset.flags[tile_id]
  182.       next if flag & 0x10 == 0
  183.       bridge = check_bridge(tile_id)
  184.       next unless bridge
  185.       return true if (bit == 0x01 || bit == 0x08) && bridge == 2
  186.       return true if (bit == 0x02 || bit == 0x04) && bridge == 1
  187.     end
  188.     return false
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 確認前方是否為可通行方向之橋面
  192.   #--------------------------------------------------------------------------
  193.   def check_bridge_passage(x, y, bit)
  194.     all_tiles(x, y).each do |tile_id|
  195.       flag = tileset.flags[tile_id]
  196.       next if flag & 0x10 != 0
  197.       bridge = check_bridge(tile_id)
  198.       next unless bridge
  199.       if flag & 0x0800 == 0x00
  200.         tileset.flags[tile_id] = flag | 0x0800
  201.       end
  202.       return true if (bit == 0x01 || bit == 0x08) && bridge == 2
  203.       return true if (bit == 0x02 || bit == 0x04) && bridge == 1
  204.     end
  205.     return false
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 橋面?
  209.   #--------------------------------------------------------------------------
  210.   def check_bridge(tile_id)
  211.     # 痾... 橋面判定... 目前就先以只能直線通行且非梯子為判定吧XD
  212.     return false if tile_id > 2048
  213.     flag = tileset.flags[tile_id]
  214.     return false if flag & 0x20 == 0x20
  215.     return 1 if flag & 0x09 == 0x09 && flag & 0x06 == 0x00
  216.     return 2 if flag & 0x09 == 0x00 && flag & 0x06 == 0x06
  217.     return false
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 設定橋面顯示優先度
  221.   #--------------------------------------------------------------------------
  222.   def set_bridge(x, y, bit)
  223.     all_tiles(x, y).each do |tile_id|
  224.       flag = tileset.flags[tile_id]
  225.       next unless check_bridge(tile_id)
  226.       pass = flag & 0x0f
  227.       flag = (flag >> 5 << 5) | bit | pass
  228.       tileset.flags[tile_id] = flag
  229.     end
  230.   end
  231. end
复制代码
这个?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2013-9-16
帖子
11
4
 楼主| 发表于 2015-4-27 00:45:36 | 只看该作者
jianyulei 发表于 2015-4-26 15:02
这个?

应该是……不过暂时用事件解决了,毕竟脚本排错太闹心……
总而言之多谢~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2013-9-16
帖子
11
5
 楼主| 发表于 2015-4-27 00:46:16 | 只看该作者
VIPArcher 发表于 2015-4-26 11:15
看推荐问答……
https://rpg.blue/thread-241125-1-1.html

好吧,最近是有点伸手党上身的感觉(远目
多谢(
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 02:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表