Project1

标题: 【活动问题】如何制作上下分层的桥? [打印本页]

作者: 迷糊的安安    时间: 2012-10-8 13:35
标题: 【活动问题】如何制作上下分层的桥?
本帖最后由 迷糊的安安 于 2012-10-9 23:11 编辑

本问题为【Ace推荐问答计划】活动问题。
详情请点击:http://rpg.blue/forum.php?mod=viewthread&tid=251118

实现要求:使用RM图块和事件制作一个桥,从桥下通过时人物会被桥挡住且不会走到桥上面去,在桥上面走的时候也不会掉到桥下面来。最好能分别实现一下1格宽的桥和3格宽的桥。dsu_plus_rewardpost_czw
作者: Yalisa    时间: 2012-10-8 14:33
本帖最后由 Yalisa 于 2012-10-8 16:05 编辑

首先,先画一个桥出来,然后把中间可以走过的地方打掉。
注意不要让桥的元件直接接到下面,要空一格(如红框)
不然人物就可以直接上桥了(瞬间移动!?如箭头)



再来开一组像这样的事件,这是让玩家过桥时不会走到桥下用的。

A、B都设为「触发条件:玩家接触」
A:
打开一个开关:过桥
>>思考模式:如果角色踩到这个事件,我就要让桥变成在下面,会被我盖过去的。
B:
直行内容关闭开关:过桥
>>思考模式:我的角色走完桥了,我要让角色被桥盖过,所以我要关掉这个开关。

这是可以走过的桥的事件,右边都是空的所以我就剪掉了。
注意红框的部份,不要设错了

第一页不动开关,优先级设为「在人物上方」
>>思考模式:如果没开开关就会被盖过。
第二页打开开关条件,优先级设为「在人物下方」
>>思考模式:如果开了开关就可以走过去。

然后很欢乐的复製贴上

1234都是一样的
下桥的时候一定要经过A
上桥的时候一定要经过B


有一点要注意的是,下面让玩家过桥时不会走到桥下用的事件要设在桥的(队友数)格以外,不然身后的队友在主角踩到事件的时候会被压到桥下面去。
PS: 这个开关每个桥都可以用同一个
-----------------------------
如果你往左右走會掉下去的話要去改地圖圖塊的設定,如圖內紅框:關閉上下或左右的行走

-----------------------------

游戏档,内含:
以上教学的一格桥
以上教学的一格桥X3变成懒人3格桥
真的可以左右行走又不会掉下去的3格宽桥
http://pan.baidu.com/share/link?shareid=72190&uk=3056057090������������
作者: yangff    时间: 2012-10-8 20:23
本帖最后由 yangff 于 2012-10-8 20:45 编辑

……好吧没有直接把图块z-index直接标记到顶的办法么……滚回去填坑/A\
作者: fxwd    时间: 2012-10-8 21:12
这个地球村有脚本的,手机没法弄,安安可以去找一找
作者: yangff    时间: 2012-10-8 21:43
本帖最后由 yangff 于 2012-10-8 23:26 编辑

Data.rar (210.39 KB, 下载次数: 91)
工程RMVA……
普通的桥是没有问题了……3格的一样搞,不过默认3格的桥在A组没办法设置通行度,弄到B组就好。
十字交叉的还有点蛋疼,不过无所谓了,毕竟不是帖子里要的。因为随手写的,很多东西都没判,可能跟随有点问题.A\也就几行代码的事吧,还有如果编号冲突就自己改吧/A\……嗯。。对了飞行器在桥上降落实惠降落到桥底下的,但是如果经过上桥那个点。。总之就是没有判定啦!!不过……你家大地图有桥??
  简易立交桥
  请不要再上桥的第一格进行交错……主要是作者懒/A\
  [BUG] 十字交叉时的手感比较奇怪。。
  使用方法……
  桥的入口放区域4
  底层桥涂上区域1
  盖在底层桥的涂上区域2
  交叉处涂上区域3
  给桥通行度☆
  然后小心各种bug,比如跟随……
  其他的看样例吧,地球村有个更好的/A\
http://pan.baidu.com/share/link?shareid=73927&uk=201415192
度娘网盘
作者: 没是的人    时间: 2012-10-8 21:46
这个4方向通行桥在我的xp游戏里出现过,所以解决起来就轻车熟路了
我的方法是纯事件的,不仅实现了多格宽度的桥,还解决了绳子栏杆的遮盖问题。
纯事件四方向通行桥范例
用了一张自己的素材。
作者: 迷糊的安安    时间: 2012-10-8 22:15
本帖最后由 迷糊的安安 于 2012-10-8 23:57 编辑
没是的人 发表于 2012-10-8 21:46
这个4方向通行桥在我的xp游戏里出现过,所以解决起来就轻车熟路了
我的方法是纯事件的,不仅实现了多格宽度 ...


看上去非常完美的桥……可是当某个倒霉的NPC路过的时候……
http://player.youku.com/player.php/sid/XNDU5MzIzOTU2/v.swf
点击看视频……这位哥哥一会儿被莫名其妙拦住了,一会儿被坑到桥下面去了……

如果要使用并行事件判断的话,我相信这个是可以解决的?


���
作者: yangff    时间: 2012-10-8 22:52
本帖最后由 yangff 于 2012-10-8 22:54 编辑
迷糊的安安 发表于 2012-10-8 22:15
看上去非常完美的桥……可是当某个倒霉的NPC路过的时候……

点击看视频……这位哥哥一会儿被莫名其妙拦 ...


/A\
http://rpg.blue/forum.php?mod=viewthread&tid=232034
找到地球村的帖子了,求终结此贴。【虽然实现的很坑爹……】
作者: 没是的人    时间: 2012-10-8 23:40
迷糊的安安 发表于 2012-10-8 22:15
看上去非常完美的桥……可是当某个倒霉的NPC路过的时候……

点击看视频……这位哥哥一会儿被莫名其妙拦 ...

5555犯规啊!主楼提的问题明明已经实现了的说。

安安考虑的好详细啊,话说这已经是3层了,不能设置多种优先级的va已经不能用纯事件完成这个新问题了。

要解决这个问题应该也是从npc下手吧,因为四方向通行桥只是一种画面上的假象,要加这样的npc就要重新设计这座桥了。
作者: 迷糊的安安    时间: 2012-10-8 23:57
yangff 发表于 2012-10-8 21:43
工程RMVA……
普通的桥是没有问题了……3格的一样搞,不过默认3格的桥在A组没办法设置通行度,弄到B组就好 ...

http://player.youku.com/player.php/sid/XNDU5MzYxOTYw/v.swf
不计NPC问题的话,有一个可以从桥底走到桥面上的BUG。
作者: 没是的人    时间: 2012-10-9 11:36
yangff 发表于 2012-10-8 21:43
工程RMVA……
普通的桥是没有问题了……3格的一样搞,不过默认3格的桥在A组没办法设置通行度,弄到B组就好 ...

还是这个bug比较严重,可以从坡上直接下来
作者: yangff    时间: 2012-10-9 12:40
没是的人 发表于 2012-10-9 11:36
还是这个bug比较严重,可以从坡上直接下来

……你说呢,这个地方本来是不能通行的,硬被我弄成可以的,你可以用下面的那种图块做坡……
作者: yangff    时间: 2012-10-9 13:39
http://pan.baidu.com/share/link?shareid=74512&uk=201415192
稍微修改了十字交叉的实现……还有别吐槽那个可以走上高地的bug了,我用了自动元件/A\这个不会了。。跟随没问题……NPC的话我直接禁止走过十字交叉处了(其实NPC走过没问题,就怕和角色同时走过,还是一上一下的那种……)
作者: 咕噜    时间: 2012-10-9 23:04
本帖最后由 delv25 于 2012-10-9 23:07 编辑

魂淡你害我折腾了45分钟QAQ..
每个事件图块【桥】这个玩意,准备两个事件页
第一页优先级选择【在人物下方】
第二页选择在【在人物上方】
之后能照着视频里的思路,在走下方的时候,记得启用事件触发,令事件页处于【在人物上方】这个优先级
然后呢,也就像视频里的一样,在【人物上方】这个事件触发的必经之处,放上令事件页处于【在人物下方】这个优先级
这样之后呢,就会导致行走【在桥上】的时候,人物能随意的上下移动,并且逾越【桥】,
那么,就在之前【在人物上方】这个事件触发,也准备两个事件页,第一个事件页就是用不允许穿透,也就是优先级是【与人物同层】
第二个再启用令事件页处于【人物上方】,这样应该不会出问题了


度娘:http://pan.baidu.com/share/link?shareid=79484&uk=120447983

大雾………………我还特意看了教程……���
作者: yangff    时间: 2012-10-10 08:22
没有十字的桥NPC随便走。。
http://pan.baidu.com/share/link?shareid=76223&uk=201415192
大概没问题。。
作者: yangff    时间: 2012-10-11 09:15
本帖最后由 yangff 于 2012-10-11 10:03 编辑

不是……在桥上的时候我是以桥为最高优先级的,我是把人物移动到层次2去了。。
--------------------------------------------------------------------------------------------------------------
NPC 在桥上穿透的问题……要解决的话挺麻烦的。。RM的碰撞和z-index没有任何关系,都是单方面的碰撞,要实现的话直接用地球村的那个脚本吧/A\,懒得弄了。
作者: 没是的人    时间: 2012-10-18 11:59
附上范例:
(百度网盘)
http://pan.baidu.com/share/link?shareid=89474&uk=3993422208
这个是为npc影响的问题做的另外一个
折腾了许多天终于做出来了
这个桥的素材非常考究,做这个桥,素材问题大于事件问题

@迷糊的安安
作者: 迷糊的安安    时间: 2012-10-18 12:49
没是的人 发表于 2012-10-18 11:59
附上范例:
(百度网盘)
http://pan.baidu.com/share/link?shareid=89474&uk=3993422208

好厉害!稍微试了下没发现BUG,和NPC的对话也正常
能说一下解决思路吗?提供一个制作教程,让别人也能做出来?
作者: eve592370698    时间: 2012-11-17 16:19
标题: 还有VA的场所移动是可以不淡入淡出的,利用视觉欺骗
本帖最后由 eve592370698 于 2012-11-17 23:28 编辑
没是的人 发表于 2012-10-8 23:40
5555犯规啊!主楼提的问题明明已经实现了的说。

安安考虑的好详细啊,话说这已经是3层了,不能 ...


死脑筋!不会用行走图代替元件图块吗?1个事件其实可以搞定的东西您可倒好,用了6个事件,要是桥再大一些使劲加事件不嫌麻烦吗?


另外地图的元件属性VA是可以通过事件变化的。

!$桥面技巧.png (17.69 KB, 下载次数: 19)

!$桥面技巧.png

作者: tseyik    时间: 2013-9-11 23:38
本帖最后由 tseyik 于 2013-9-12 00:13 编辑

用區域可簡單設定
輸入脚本
設定方法如圖
交差点的圖塊設定為☆
十字橋要用事件和開関才能解决

  1. #==============================================================================
  2. # ■區域通行設定 for RGSS3 Ver1.00-β6
  3. # □作成者 kure
  4. #===============================================================================

  5. module KURE
  6.   module RegionPass
  7.     #初期設定
  8.     Z_Region = []
  9.    
  10.     #交差点區域
  11.     CROSS_Region = [63,59]
  12.    
  13.     #透明化區域
  14.     #指定しない場合は0を設定
  15.     TRANSPARENT_Region = 0
  16.   
  17.    
  18.     #プライオリティ設定タイプ
  19.     #(0 → キャラクターより下=90 キャラクターと同じ = 100 キャラクターより上 = 110)
  20.     #(1 → キャラクターより下=0 キャラクターと同じ = 100 キャラクターより上 = 200)
  21.     PRIORITY_TYPE = 1

  22.     #Z座標設定
  23.     Z_Region[60] = 400
  24.     Z_Region[62] = 300
  25.   end
  26. end   
  27.   
  28. #==============================================================================
  29. # ■ Game_Map
  30. #==============================================================================
  31. class Game_Map
  32.   #--------------------------------------------------------------------------
  33.   # ● 指定座標に存在するイベント(すり抜け以外)の配列取得
  34.   #--------------------------------------------------------------------------
  35.   def events_xy_ex(x, y, obj, z)
  36.     @events.values.select {|event| event.pos_nt?(x, y) && event.normal_priority? && event.same_height2?(obj,z)}
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 指定座標に同じ高さのプレイヤーの存在するか取得
  40.   #--------------------------------------------------------------------------
  41.   def player_xy_ex(x, y, z)
  42.     if $game_player.x == x && $game_player.y == y && $game_player.screen_z == z
  43.       return true
  44.     end
  45.     return false
  46.   end
  47. end

  48. #==============================================================================
  49. # ■ Game_Event
  50. #==============================================================================
  51. class Game_Event < Game_Character
  52.   #--------------------------------------------------------------------------
  53.   # ● オブジェクト初期化(エイリアス再定義)
  54.   #     event : RPG::Event
  55.   #--------------------------------------------------------------------------
  56.   alias k_before_initialize initialize
  57.   def initialize(map_id, event)
  58.     k_before_initialize(map_id, event)
  59.     real_first_z
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● リフレッシュ(エイリアス再定義)
  63.   #--------------------------------------------------------------------------
  64.   alias k_before_refresh refresh
  65.   def refresh
  66.     k_before_refresh
  67.     real_first_z
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 初期 Z 座標の取得(追加定義)
  71.   #--------------------------------------------------------------------------
  72.   def real_first_z
  73.     unless @event.name
  74.       @first_z_pos = 90 + @priority_type * 10 if KURE::RegionPass::PRIORITY_TYPE == 0
  75.       @first_z_pos = @priority_type * 100 if KURE::RegionPass::PRIORITY_TYPE == 1
  76.     end
  77.     @event.name.match(/<Z座標\s?(\d+)\s?>/)
  78.       @first_z_pos = 90 + @priority_type * 10 if KURE::RegionPass::PRIORITY_TYPE == 0
  79.       @first_z_pos = @priority_type * 100 if KURE::RegionPass::PRIORITY_TYPE == 1
  80.     return unless $1
  81.     @first_z_pos = $1.to_i
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 接触イベントの起動判定(再定義)
  85.   #--------------------------------------------------------------------------
  86.   def check_event_trigger_touch(x, y)
  87.     return if $game_map.interpreter.running?
  88.     if @trigger == 2 && $game_player.pos?(x, y)
  89.       start if !jumping? && normal_priority? && same_height?
  90.     end
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● プレイヤーとの衝突判定(フォロワーを含む)(再定義)
  94.   #--------------------------------------------------------------------------
  95.   def collide_with_player_characters?(x, y)
  96.     same_height? && normal_priority? && $game_player.collide?(x, y)
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 同じ高さかどうか(プレイヤー用)
  100.   #--------------------------------------------------------------------------
  101.   def same_height?
  102.     return true if self.region_id == 0
  103.     return true if $game_player.region_id == 0
  104.     #Z座標±10の範囲内は同じ高さと判定する
  105.     case KURE::RegionPass::PRIORITY_TYPE
  106.     when 0
  107.       return true if self.screen_z - 11 < $game_player.screen_z && self.screen_z + 11 > $game_player.screen_z
  108.     when 1
  109.       return true if self.screen_z - 101 < $game_player.screen_z && self.screen_z + 101 > $game_player.screen_z
  110.     end
  111.     return false
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 同じ高さかどうか(イベント用)
  115.   #--------------------------------------------------------------------------
  116.   def same_height2?(obj, z)
  117.     return true if self.region_id == 0
  118.     return true if obj.region_id == 0
  119.     #Z座標±10の範囲内は同じ高さと判定する
  120.     return true if self.screen_z - 11 < z && self.screen_z + 11 > z
  121.     return false
  122.   end
  123. end

  124. #==============================================================================
  125. # ■ Game_Player
  126. #==============================================================================
  127. class Game_Player < Game_Character
  128.   #--------------------------------------------------------------------------
  129.   # ● マップイベントの起動(再定義)
  130.   #     triggers : トリガーの配列
  131.   #     normal   : プライオリティ[通常キャラと同じ]かそれ以外か
  132.   #--------------------------------------------------------------------------
  133.   def start_map_event(x, y, triggers, normal)
  134.     $game_map.events_xy(x, y).each do |event|
  135.       if event.trigger_in?(triggers) && event.normal_priority? == normal && event.same_height?
  136.         event.start
  137.       end
  138.     end
  139.   end
  140. end

  141. #==============================================================================
  142. # ■ Game_CharacterBase
  143. #==============================================================================
  144. class Game_CharacterBase
  145.   attr_accessor :keep_region            # 區域ID保存
  146.   attr_accessor :region_z_pos           # Z座標保存
  147.   attr_accessor :first_z_pos            # 初期Z座標保存
  148.   attr_accessor :keep_trans             # 透明化設定保存
  149.   #--------------------------------------------------------------------------
  150.   # ● 通行可能判定(再定義)
  151.   #     d : 方向(2,4,6,8)
  152.   #--------------------------------------------------------------------------
  153.   def passable?(x, y, d)
  154.     x2 = $game_map.round_x_with_direction(x, d)
  155.     y2 = $game_map.round_y_with_direction(y, d)
  156.     return false unless $game_map.valid?(x2, y2)
  157.     return true if @through || debug_through?

  158.     #區域追加設定
  159.     pass = region_passable?(x, y, x2, y2)
  160.     return true if pass == 1
  161.     return false if pass == 2
  162.    
  163.     return false unless map_passable?(x, y, d)
  164.     return false unless map_passable?(x2, y2, reverse_dir(d))   
  165.     return false if collide_with_characters?(x2, y2)
  166.    
  167.     return true
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● 画面 Z 座標の取得(再定義)
  171.   #--------------------------------------------------------------------------
  172.   def screen_z
  173.     return @region_z_pos if @region_z_pos
  174.     return @first_z_pos if @first_z_pos
  175.     return @priority_type * 100
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   # ● 初期 Z 座標の取得(追加定義)
  179.   #--------------------------------------------------------------------------
  180.   def real_first_z
  181.     @first_z_pos = nil
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● Z 座標の更新(追加定義)
  185.   #--------------------------------------------------------------------------
  186.   def refresh_z
  187.     id = $game_map.region_id(@x, @y)
  188.    
  189.     if @keep_trans
  190.       if id != KURE::RegionPass::TRANSPARENT_Region
  191.         @transparent = false
  192.         @keep_trans = false
  193.       end
  194.     else
  195.       if id == KURE::RegionPass::TRANSPARENT_Region && id != 0
  196.         @transparent = true
  197.         @keep_trans = true
  198.       end
  199.     end
  200.    
  201.     unless KURE::RegionPass::CROSS_Region.include?(id)
  202.       @region_z_pos = nil
  203.       if KURE::RegionPass::Z_Region[id]
  204.         @region_z_pos = KURE::RegionPass::Z_Region[id]
  205.         @first_z_pos = nil
  206.       end
  207.     end
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   # ● 歩数増加(エイリアス再定義)
  211.   #--------------------------------------------------------------------------
  212.   alias k_before_increase_steps increase_steps
  213.   def increase_steps
  214.     refresh_z
  215.     k_before_increase_steps
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● ジャンプ時の更新(エイリアス再定義)
  219.   #--------------------------------------------------------------------------
  220.   alias k_before_update_jump update_jump
  221.   def update_jump
  222.     k_before_update_jump
  223.     if @jump_count == 0
  224.       refresh_z
  225.     end
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ● 區域通行設定(再定義)
  229.   #--------------------------------------------------------------------------
  230.   def region_passable?(x, y, x2, y2)
  231.     #立体交差區域を取得
  232.     cross = KURE::RegionPass::CROSS_Region
  233.     #現在地と移動先の區域IDを取得
  234.     point1 = $game_map.region_id(x, y)
  235.     point2 = $game_map.region_id(x2, y2)
  236.    
  237.     #立体交差區域で無ければ區域IDを取得
  238.     unless cross.include?(point1)
  239.       @keep_region = point1
  240.     end
  241.    
  242.     #立体交差區域と関係移動ないは判定しない
  243.     unless cross.include?(point1)
  244.       unless cross.include?(point2)
  245.         return 0
  246.       end
  247.     end  
  248.    
  249.     #移動先に同じ高さのイベントがあれば通行できない
  250.     if $game_map.events_xy_ex(x2, y2, self, self.screen_z) != []
  251.       return 2
  252.     end
  253.    
  254.     #移動先が同じ高さのプレイヤーでも移動できない
  255.     return 0 if $game_map.player_xy_ex(x2, y2, self.screen_z)
  256.    
  257.     #移動先の侵入可能設定
  258.     if point2 != 0
  259.       return 0 if point1 == 0
  260.       return 1 if cross.include?(point2)
  261.       return 1 if point2 == @keep_region
  262.       return 2
  263.     end
  264.    
  265.     return 0
  266.   end
  267. end

  268. #==============================================================================
  269. # ■ Game_Interpreter
  270. #==============================================================================
  271. class Game_Interpreter
  272.   #--------------------------------------------------------------------------
  273.   # ● 區域ID取得
  274.   #--------------------------------------------------------------------------
  275.   def get_region_id
  276.     x = $game_player.x
  277.     y = $game_player.y
  278.     return $game_map.region_id(x, y)
  279.   end  
  280. end
复制代码
���




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