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

Project1

 找回密码
 注册会员
搜索
楼主: 精灵使者
打印 上一主题 下一主题

如何判断两个以上事件的同时移动(续)

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-6
帖子
148
11
发表于 2008-6-20 02:01:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1707
在线时间
3039 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

12
 楼主| 发表于 2008-6-20 04:45:09 | 只看该作者
允许穿透?恩恩……稍后我下载看看。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
8 小时
注册时间
2008-1-12
帖子
203
13
发表于 2008-6-20 05:36:06 | 只看该作者
研究出来一个,请精灵达人过目

http://rpg.blue/upload_program/files/Project18_94342020.rar

版主对此帖的认可:『解决问题发奖』,积分『+500』。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
14
发表于 2008-6-20 06:25:52 | 只看该作者
屏蔽

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
15
发表于 2008-6-20 06:51:03 | 只看该作者
多定义新的passable?叫new_passable?
貼在main前即可

  1. class Game_Character
  2.   #--------------------------------------------------------------------------
  3.   # ● 新通行判定方法
  4.   #     x : X 坐标
  5.   #     y : Y 坐标
  6.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  7.   #--------------------------------------------------------------------------
  8.   def new_passable?(x, y, d)
  9.     # 求得新的坐标
  10.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  11.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  12.     # 坐标在地图以外的情况
  13.     unless $game_map.valid?(new_x, new_y)
  14.       # 不能通行
  15.       return false
  16.     end
  17.     # 穿透是 ON 的情况下
  18.     if @through
  19.       # 可以通行
  20.       return true
  21.     end
  22.     # 移动者的元件无法来到指定方向的情况下
  23.     unless $game_map.passable?(x, y, d, self)
  24.       # 通行不可
  25.       return false
  26.     end
  27.     # 从指定方向不能进入到移动处的元件的情况下
  28.     unless $game_map.passable?(new_x, new_y, 10 - d)
  29.       # 不能通行
  30.       return false
  31.     end
  32.     # 循环全部事件
  33.     for event in $game_map.events.values
  34.       # 事件坐标于移动目标坐标一致的情况下
  35.       if event.x == new_x and event.y == new_y
  36.         # 穿透为 ON
  37.         unless event.through
  38.           # 自己就是事件的情况下
  39.           if self != $game_player
  40.             # 不能通行
  41.             return false
  42.           end
  43.           # 自己是主角、对方的图形是角色的情况下
  44.           if event.character_name != ""
  45.             # 不能通行
  46.             return true
  47.           end
  48.         end
  49.       end
  50.     end
  51.     # 主角的坐标与移动目标坐标一致的情况下
  52.     if $game_player.x == new_x and $game_player.y == new_y
  53.       # 穿透为 ON
  54.       unless $game_player.through
  55.         # 自己的图形是角色的情况下
  56.         if @character_name != ""
  57.           # 不能通行
  58.           return false
  59.         end
  60.       end
  61.     end
  62.     # 可以通行
  63.     return true
  64.   end
  65. end
复制代码

调用方式:
$game_player.new_passable?($game_map.events[a].x,$game_map.events[a].y,方向)
范例:
http://rpg.blue/upload_program/files/Project2_94344311.rar

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
帖子
2072
16
发表于 2008-6-20 07:48:18 | 只看该作者
  1. class Game_Character
  2.   attr_accessor :move                     # 已经行动
  3. end

  4. NAME = "019-Thief04"  #设置哪些角色你能控制,现在设置的是图为019-Thief04的

  5. #==============================================================================
  6. # ■ Scene_Map
  7. #------------------------------------------------------------------------------
  8. #  处理地图画面的类。
  9. #==============================================================================

  10. class Scene_Map
  11.   #--------------------------------------------------------------------------
  12.   # ● 主处理
  13.   #--------------------------------------------------------------------------
  14.   def main
  15.     # 生成活动块
  16.     @spriteset = Spriteset_Map.new
  17.     # 生成信息窗口
  18.     @message_window = Window_Message.new
  19.     # 执行过渡
  20.     Graphics.transition
  21.     # 主循环
  22.     loop do
  23.       # 刷新游戏画面
  24.       Graphics.update
  25.       # 刷新输入信息
  26.       Input.update
  27.       # 刷新画面
  28.       update
  29.       # 如果画面切换的话就中断循环
  30.       if $scene != self
  31.         break
  32.       end
  33.     end
  34.     # 准备过渡
  35.     Graphics.freeze
  36.     # 释放活动块
  37.     @spriteset.dispose
  38.     # 释放信息窗口
  39.     @message_window.dispose
  40.     # 标题画面切换中的情况下
  41.     if $scene.is_a?(Scene_Title)
  42.       # 淡入淡出画面
  43.       Graphics.transition
  44.       Graphics.freeze
  45.     end
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 刷新画面
  49.   #--------------------------------------------------------------------------
  50.   def update
  51.     # 循环
  52.     loop do
  53.       # 按照地图、实例、主角的顺序刷新
  54.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
  55.       #  的机会的重要因素)
  56.       $game_map.update
  57.       $game_system.map_interpreter.update
  58.       $game_player.update
  59.       # 系统 (计时器)、画面刷新
  60.       $game_system.update
  61.       $game_screen.update
  62.       # 如果主角在场所移动中就中断循环
  63.       unless $game_temp.player_transferring
  64.         break
  65.       end
  66.       # 执行场所移动
  67.       transfer_player
  68.       # 处理过渡中的情况下、中断循环
  69.       if $game_temp.transition_processing
  70.         break
  71.       end
  72.     end
  73.     # 刷新活动块
  74.     @spriteset.update
  75.     # 刷新信息窗口
  76.     @message_window.update
  77.     # 游戏结束的情况下
  78.     if $game_temp.gameover
  79.       # 切换的游戏结束画面
  80.       $scene = Scene_Gameover.new
  81.       return
  82.     end
  83.     # 返回标题画面的情况下
  84.     if $game_temp.to_title
  85.       # 切换到标题画面
  86.       $scene = Scene_Title.new
  87.       return
  88.     end
  89.     # 处理过渡中的情况下
  90.     if $game_temp.transition_processing
  91.       # 清除过渡处理中标志
  92.       $game_temp.transition_processing = false
  93.       # 执行过渡
  94.       if $game_temp.transition_name == ""
  95.         Graphics.transition(20)
  96.       else
  97.         Graphics.transition(40, "Graphics/Transitions/" +
  98.           $game_temp.transition_name)
  99.       end
  100.     end
  101.     # 显示信息窗口中的情况下
  102.     if $game_temp.message_window_showing
  103.       return
  104.     end
  105.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  106.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  107.       # 不是在事件执行中或者禁止遇敌中
  108.       unless $game_system.map_interpreter.running? or
  109.              $game_system.encounter_disabled
  110.         # 确定队伍
  111.         n = rand($game_map.encounter_list.size)
  112.         troop_id = $game_map.encounter_list[n]
  113.         # 队伍有效的话
  114.         if $data_troops[troop_id] != nil
  115.           # 设置调用战斗标志
  116.           $game_temp.battle_calling = true
  117.           $game_temp.battle_troop_id = troop_id
  118.           $game_temp.battle_can_escape = true
  119.           $game_temp.battle_can_lose = false
  120.           $game_temp.battle_proc = nil
  121.         end
  122.       end
  123.     end
  124.     ########################################################################
  125.     if Input.press?(Input::LEFT)
  126.       turn(4)
  127.     end
  128.     if Input.press?(Input::RIGHT)
  129.       turn(6)
  130.     end
  131.     if Input.press?(Input::UP)
  132.       turn(8)
  133.     end
  134.     if Input.press?(Input::DOWN)
  135.       turn(2)
  136.     end
  137.     ########################################################################
  138.     # 按下 B 键的情况下
  139.     if Input.trigger?(Input::B)
  140.       # 不是在事件执行中或菜单禁止中
  141.       unless $game_system.map_interpreter.running? or
  142.              $game_system.menu_disabled
  143.         # 设置菜单调用标志以及 SE 演奏
  144.         $game_temp.menu_calling = true
  145.         $game_temp.menu_beep = true
  146.       end
  147.     end
  148.     # 调试模式为 ON 并且按下 F9 键的情况下
  149.     if $DEBUG and Input.press?(Input::F9)
  150.       # 设置调用调试标志
  151.       $game_temp.debug_calling = true
  152.     end
  153.     # 不在主角移动中的情况下
  154.     unless $game_player.moving?
  155.       # 执行各种画面的调用
  156.       if $game_temp.battle_calling
  157.         call_battle
  158.       elsif $game_temp.shop_calling
  159.         call_shop
  160.       elsif $game_temp.name_calling
  161.         call_name
  162.       elsif $game_temp.menu_calling
  163.         call_menu
  164.       elsif $game_temp.save_calling
  165.         call_save
  166.       elsif $game_temp.debug_calling
  167.         call_debug
  168.       end
  169.     end
  170.   end
  171.   ########################################################################
  172.   def turn(type)
  173.     unless $game_system.map_interpreter.running? or moving? or
  174.            @move_route_forcing or $game_temp.message_window_showing
  175.       case type
  176.       when 2  #下
  177.         x0 = 0 ; y0 = 1
  178.       when 4
  179.         x0 = -1 ; y0 = 0
  180.       when 6
  181.         x0 = 1 ; y0 = 0
  182.       when 8
  183.         x0 = 0 ; y0 = -1
  184.       end
  185.       e = {} ; b = []
  186.       for event in $game_map.events.values
  187.         event.move = false
  188.         if event.character_name == "019-Thief04"
  189.           e[event.id] = ([event.x,event.y])
  190.         else
  191.           event.move = true
  192.           b.push([event.x,event.y])
  193.         end
  194.       end
  195.       for id in e.keys
  196.         event = $game_map.events[id]
  197.         if !passable?(event.x+x0,event.y+y0,type)
  198.           event.move = true
  199.           event.turn_random
  200.           e.delete(id)
  201.         end
  202.       end
  203.       while e.size > 0
  204.         for id in e.keys
  205.           event = $game_map.events[id]
  206.           next if event == nil
  207.           if b.include?([event.x+x0,event.y+y0])
  208.             event.move = true
  209.             e.delete(id)
  210.           else
  211.             for ev in $game_map.events.values
  212.               if ev.x == event.x+x0 and ev.y == event.y+y0
  213.                 have = true
  214.                 if ev.move == true
  215.                   event.move = true
  216.                   event.turn_random
  217.                   event = nil
  218.                   e.delete(id)
  219.                   break
  220.                 else
  221.                   event = nil
  222.                   break
  223.                 end
  224.               end
  225.             end
  226.             if event
  227.               #event.x += x0 ; event.y += y0
  228.               case type
  229.               when 2
  230.                 event.move_down
  231.               when 4
  232.                 event.move_left
  233.               when 6
  234.                 event.move_right
  235.               when 8
  236.                 event.move_up
  237.               end
  238.               event.move = true
  239.               e.delete(id)
  240.             end
  241.           end
  242.         end
  243.       end
  244.     end
  245.       
  246.       
  247.   end
  248.         
  249.   def passable?(x,y,d)
  250.     unless $game_map.valid?(x, y)
  251.       return false
  252.     end
  253.     if @through
  254.       return true
  255.     end
  256.     unless $game_map.passable?(x, y, d)
  257.       return false
  258.     end
  259.     return true
  260.   end
  261.   
  262.   def moving?
  263.     for event in $game_map.events.values
  264.       if event.moving?
  265.         return true
  266.       end
  267.     end
  268.     return false
  269.   end
  270.   ########################################################################
  271.   #--------------------------------------------------------------------------
  272.   # ● 调用战斗
  273.   #--------------------------------------------------------------------------
  274.   def call_battle
  275.     # 清除战斗调用标志
  276.     $game_temp.battle_calling = false
  277.     # 清除菜单调用标志
  278.     $game_temp.menu_calling = false
  279.     $game_temp.menu_beep = false
  280.     # 生成遇敌计数
  281.     $game_player.make_encounter_count
  282.     # 记忆地图 BGM 、停止 BGM
  283.     $game_temp.map_bgm = $game_system.playing_bgm
  284.     $game_system.bgm_stop
  285.     # 演奏战斗开始 SE
  286.     $game_system.se_play($data_system.battle_start_se)
  287.     # 演奏战斗 BGM
  288.     $game_system.bgm_play($game_system.battle_bgm)
  289.     # 矫正主角姿势
  290.     $game_player.straighten
  291.     # 切换到战斗画面
  292.     $scene = Scene_Battle.new
  293.   end
  294.   #--------------------------------------------------------------------------
  295.   # ● 调用商店
  296.   #--------------------------------------------------------------------------
  297.   def call_shop
  298.     # 清除商店调用标志
  299.     $game_temp.shop_calling = false
  300.     # 矫正主角姿势
  301.     $game_player.straighten
  302.     # 切换到商店画面
  303.     $scene = Scene_Shop.new
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● 调用名称输入
  307.   #--------------------------------------------------------------------------
  308.   def call_name
  309.     # 清除商店调用名称输入标志
  310.     $game_temp.name_calling = false
  311.     # 矫正主角姿势
  312.     $game_player.straighten
  313.     # 切换到名称输入画面
  314.     $scene = Scene_Name.new
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # ● 调用菜单
  318.   #--------------------------------------------------------------------------
  319.   def call_menu
  320.     # 清除商店调用菜单标志
  321.     $game_temp.menu_calling = false
  322.     # 已经设置了菜单 SE 演奏标志的情况下
  323.     if $game_temp.menu_beep
  324.       # 演奏确定 SE
  325.       $game_system.se_play($data_system.decision_se)
  326.       # 清除菜单演奏 SE 标志
  327.       $game_temp.menu_beep = false
  328.     end
  329.     # 矫正主角姿势
  330.     $game_player.straighten
  331.     # 切换到菜单画面
  332.     $scene = Scene_Menu.new
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # ● 调用存档
  336.   #--------------------------------------------------------------------------
  337.   def call_save
  338.     # 矫正主角姿势
  339.     $game_player.straighten
  340.     # 切换到存档画面
  341.     $scene = Scene_Save.new
  342.   end
  343.   #--------------------------------------------------------------------------
  344.   # ● 调用调试
  345.   #--------------------------------------------------------------------------
  346.   def call_debug
  347.     # 清除商店调用调试标志
  348.     $game_temp.debug_calling = false
  349.     # 演奏确定 SE
  350.     $game_system.se_play($data_system.decision_se)
  351.     # 矫正主角姿势
  352.     $game_player.straighten
  353.     # 切换到调试画面
  354.     $scene = Scene_Debug.new
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● 主角的场所移动
  358.   #--------------------------------------------------------------------------
  359.   def transfer_player
  360.     # 清除主角场所移动调试标志
  361.     $game_temp.player_transferring = false
  362.     # 移动目标与现在的地图有差异的情况下
  363.     if $game_map.map_id != $game_temp.player_new_map_id
  364.       # 设置新地图
  365.       $game_map.setup($game_temp.player_new_map_id)
  366.     end
  367.     # 设置主角位置
  368.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  369.     # 设置主角朝向
  370.     case $game_temp.player_new_direction
  371.     when 2  # 下
  372.       $game_player.turn_down
  373.     when 4  # 左
  374.       $game_player.turn_left
  375.     when 6  # 右
  376.       $game_player.turn_right
  377.     when 8  # 上
  378.       $game_player.turn_up
  379.     end
  380.     # 矫正主角姿势
  381.     $game_player.straighten
  382.     # 刷新地图 (执行并行事件)
  383.     $game_map.update
  384.     # 在生成活动块
  385.     @spriteset.dispose
  386.     @spriteset = Spriteset_Map.new
  387.     # 处理过渡中的情况下
  388.     if $game_temp.transition_processing
  389.       # 清除过渡处理中标志
  390.       $game_temp.transition_processing = false
  391.       # 执行过渡
  392.       Graphics.transition(20)
  393.     end
  394.     # 执行地图设置的 BGM、BGS 的自动切换
  395.     $game_map.autoplay
  396.     # 设置画面
  397.     Graphics.frame_reset
  398.     # 刷新输入信息
  399.     Input.update
  400.   end
  401. end
复制代码


忘记转脸了~~~补上  顺便说句:  给character加了个新属性,scene_map中间加#的一大段就是
系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~
你它囧一字母君谁记得……
当时那把剑离我的喉咙只有0.01工分。可是一柱香之后,这个女主人会深深的爱上我,虽然本人平生说了无数的谎话,可是这句最有效:“你应该这么做,我也应该死。
曾经有一取ID的机会放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。你的剑在我的咽喉上割下去吧!不用再犹豫了!如果上天能够给我一个再来一次的机会,我绝对会取个汉字君。如果非要给这ID加点修饰的话,我希望是……红色加粗……

回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-6
帖子
148
17
发表于 2008-6-20 18:13:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1707
在线时间
3039 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

18
 楼主| 发表于 2008-6-20 18:34:06 | 只看该作者
以下引用此ID只用一次于2008-6-20 10:13:37的发言:

其实何必这么麻烦,要达到精灵的效果根本不必大动干戈.
你原来的东西不必改,只需要将 设置移动路线的向上移动用脚本来调用Game_Character里的向上移动,因为它可以自行判断出前方是否可以移动,而且不卡.
如:
条件分歧 $game_player.passable?($game_map.events[x].x, $game_map.events[x].y, 8)
事件第3页-脚本:$game_map.events[x].move_up
除此之外的场合
$game_map.events[x].turn_random
分歧结束.

你可以试试看.解决了你之前所不能移动的问题`

这样么。
刚才做了测试,会有连续运行的迹象。
没有上面几位做的那么好。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1707
在线时间
3039 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

19
 楼主| 发表于 2008-6-20 18:54:09 | 只看该作者
以下引用TERENCE于2008-6-19 22:51:03的发言:

多定义新的passable?叫new_passable?
貼在main前即可
  1. class Game_Character
  2.   #--------------------------------------------------------------------------
  3.   # ● 新通行判定方法
  4.   #     x : X 坐标
  5.   #     y : Y 坐标
  6.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  7.   #--------------------------------------------------------------------------
  8.   def new_passable?(x, y, d)
  9.     # 求得新的坐标
  10.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  11.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  12.     # 坐标在地图以外的情况
  13.     unless $game_map.valid?(new_x, new_y)
  14.       # 不能通行
  15.       return false
  16.     end
  17.     # 穿透是 ON 的情况下
  18.     if @through
  19.       # 可以通行
  20.       return true
  21.     end
  22.     # 移动者的元件无法来到指定方向的情况下
  23.     unless $game_map.passable?(x, y, d, self)
  24.       # 通行不可
  25.       return false
  26.     end
  27.     # 从指定方向不能进入到移动处的元件的情况下
  28.     unless $game_map.passable?(new_x, new_y, 10 - d)
  29.       # 不能通行
  30.       return false
  31.     end
  32.     # 循环全部事件
  33.     for event in $game_map.events.values
  34.       # 事件坐标于移动目标坐标一致的情况下
  35.       if event.x == new_x and event.y == new_y
  36.         # 穿透为 ON
  37.         unless event.through
  38.           # 自己就是事件的情况下
  39.           if self != $game_player
  40.             # 不能通行
  41.             return false
  42.           end
  43.           # 自己是主角、对方的图形是角色的情况下
  44.           if event.character_name != ""
  45.             # 不能通行
  46.             return true
  47.           end
  48.         end
  49.       end
  50.     end
  51.     # 主角的坐标与移动目标坐标一致的情况下
  52.     if $game_player.x == new_x and $game_player.y == new_y
  53.       # 穿透为 ON
  54.       unless $game_player.through
  55.         # 自己的图形是角色的情况下
  56.         if @character_name != ""
  57.           # 不能通行
  58.           return false
  59.         end
  60.       end
  61.     end
  62.     # 可以通行
  63.     return true
  64.   end
  65. end
复制代码


调用方式:
$game_player.new_passable?($game_map.events[a].x,$game_map.events[a].y,方向)
范例:
http://rpg.blue/upload_program/files/Project2_94344311.rar

龙皇的设计思路和我的很接近,经测试没有多余的现象。恩恩。
hiterson的设计思路已接近了游戏的基本要求,但是运行似乎没有龙皇的效果好。
如果能两者综合起来就太好了。
察察的那个判断有问题,有障碍的时候仅仅挡住了一个人,而不是所有人都不可行动。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
8 小时
注册时间
2008-1-12
帖子
203
20
发表于 2008-6-20 21:05:44 | 只看该作者
以下引用精灵使者于2008-6-20 10:54:09的发言:


察察的那个判断有问题,有障碍的时候仅仅挡住了一个人,而不是所有人都不可行动。


原来我理解错题了,默默地离开。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-8-6 17:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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