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

Project1

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

[已经过期] 脚本冲突怎么办?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
97
在线时间
753 小时
注册时间
2011-7-17
帖子
781
跳转到指定楼层
1
发表于 2011-9-2 22:47:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 火星·奈 于 2011-9-2 22:48 编辑

问题:脚本冲突怎么办?有什么解决方法,怎么发现冲突在哪里?
冲突脚本就是下面两个。

冲突脚本1:
  1. #==============================================================================
  2. # ■ Find_Path
  3. #------------------------------------------------------------------------------
  4. #  寻路算法
  5. #==============================================================================
  6. class Find_Path
  7. #--------------------------------------------------------------------------
  8. def initialize  #初始化
  9. @open_list = []
  10. @close_lise = []
  11. end  #结束初始化
  12. #--------------------------------------------------------------------------
  13. def fp_passable?(x, y, d)  #开始判定通行
  14. if $game_player.passable?(x, y, d)
  15.    return true
  16. else
  17.    return false
  18. end
  19. end  #结束判定通行
  20. #--------------------------------------------------------------------------
  21. def get_g(now_point)  #开始计算G值
  22. d = now_point[2]
  23. return 0 if d == 5
  24. father_point = get_father_point(now_point)
  25. g = father_point[3] + 10
  26. return g
  27. end  #结束计算G值
  28. #--------------------------------------------------------------------------
  29. def get_h(now_point)  #开始计算H值(曼哈顿方法)
  30. now_x = now_point[0]
  31. now_y = now_point[1]
  32. h = (@trg_x - now_x).abs + (@trg_y - now_y).abs
  33. return h * 10 #强化启发
  34. end  #结束计算H值
  35. #--------------------------------------------------------------------------
  36. def get_f(now_point)  #开始计算F值
  37. f = now_point[3] + now_point[4]
  38. return f
  39. end  #结束计算F值
  40. #--------------------------------------------------------------------------
  41. def get_point(x, y) #取已知坐标点
  42. if @open_list.size != 0
  43.    @open_list.each do |point|
  44.      if point[0] == x and point[1] == y
  45.        return point
  46.        break
  47.      end
  48.    end
  49. end
  50. if @close_list.size != 0
  51.    @close_list.each do |point|
  52.      if point[0] == x and point[1] == y
  53.        return point
  54.        break
  55.      end
  56.    end
  57. end
  58. end  #结束取已知坐标点
  59. #--------------------------------------------------------------------------
  60. def get_father_point(now_point)  #取已知点的父节点
  61. d = now_point[2]
  62. return now_point if d == 5
  63. x = now_point[0] + (d == 6 ? 1 : d == 4 ? -1 : 0)
  64. y = now_point[1] + (d == 2 ? 1 : d == 8 ? -1 : 0)
  65. return get_point(x, y)
  66. end  #结束取已知点的父节点
  67. #--------------------------------------------------------------------------
  68. def new_point(x, y, d)  #开始建立新节点
  69. #print x,y,d
  70. point = [x, y, d]
  71. point.push get_g(point)
  72. point.push get_h(point)
  73. point.push get_f(point)
  74. return point
  75. end  #结束建立新节点
  76. #--------------------------------------------------------------------------
  77. def find_short_path(self_x, self_y, trg_x, trg_y)  #开始搜索路径
  78. return [] if not (fp_passable?(trg_x, trg_y, 8) or
  79.                    fp_passable?(trg_x, trg_y, 4) or
  80.                    fp_passable?(trg_x, trg_y, 6) or
  81.                    fp_passable?(trg_x, trg_y, 2))
  82. @self_x = self_x
  83. @self_y = self_y
  84. @now_x = self_x
  85. @now_y = self_y
  86. @trg_x = trg_x
  87. @trg_y = trg_y
  88. @open_list = []
  89. @close_list = []
  90. #准备搜索
  91. #print @self_x,@self_y
  92. @now_point = new_point(@self_x, @self_y, 5) #令起始点为当前点
  93. @open_list.push @now_point #将当前点加入关闭列表
  94. #开始搜索
  95. loop do
  96.    check_trg = check_around_point(@now_point)
  97.    if check_trg == true
  98.      @path = get_path
  99.      break
  100.    end
  101.    @now_point = get_lowest_f_point
  102.    if @now_point == [] or @now_point == nil
  103.      @path = []
  104.      break
  105.    end
  106. end
  107. return @path
  108. end  #结束搜索路径
  109. #--------------------------------------------------------------------------
  110. def find_player_short_path(trg_x, trg_y)  #寻找角色的最短路径
  111. self_x = $game_player.x
  112. self_y = $game_player.y
  113. return find_short_path(self_x, self_y, trg_x, trg_y)
  114. end  #结束角色的寻找路径
  115. #--------------------------------------------------------------------------
  116. def get_path  #取得最终的路径
  117. path = []
  118. now_point = @open_list[@open_list.size - 1]
  119. path.push(10 - now_point[2])
  120. last_point = now_point
  121. loop do
  122.    now_point = get_father_point(now_point)
  123.    break if now_point[2] == 5
  124.    path.push(10 - now_point[2])
  125. end
  126. return path.reverse
  127. end  #结束取得最终的路径
  128. #--------------------------------------------------------------------------
  129. def get_lowest_f_point  #开始取得最低F值的点
  130. if @open_list == []
  131.    return []
  132. end
  133. last_lowest_f_point = @open_list[0]
  134. @open_list.each do |point|
  135.    last_lowest_f_point = point if point[5] < last_lowest_f_point[5]
  136. end
  137. return last_lowest_f_point
  138. end  #结束取得最低F值点
  139. #--------------------------------------------------------------------------
  140. def check_around_point(point)  #开始检查已知点的四方节点
  141. for d in [2, 4, 6, 8]
  142.    x = point[0] + (d == 6 ? 1 : d == 4 ? -1 : 0)
  143.    y = point[1] + (d == 2 ? 1 : d == 8 ? -1 : 0)
  144.    if in_close_list?(x, y) #在关闭列表中
  145.      next
  146.    elsif in_open_list?(x, y) #在开启列表中
  147.      get_new_g_point = new_point(x, y, 10 - d)
  148.      get_last_g_point = get_point(x, y)
  149.      if get_new_g_point[3] >= get_last_g_point[3]
  150.        next
  151.      else
  152.        #如果改变父节点是新G值更小则确定改变
  153.        @open_list[@open_list.index(get_last_g_point)] = get_new_g_point
  154.      end
  155.    else
  156.      if fp_passable?(point[0], point[1], d)
  157.        # 如果不在开启列表中、且不在关闭列表中、且通行则添加它到新八周节点
  158.        @open_list.push new_point(x, y, 10 - d)
  159.        #如果将目标点添加到了开启列表中就返回true
  160.        return true if x == @trg_x and y == @trg_y
  161.      end
  162.    end
  163. end
  164. #此刻没有找到目标点并将当前点加入关闭列表并在开启列表中删除
  165. @close_list.push point
  166. @open_list.delete(point)
  167. #此刻没找到目标点并返回false
  168. return false
  169. end  #结束计算已知点的四方节点
  170. #--------------------------------------------------------------------------
  171. def in_open_list?(x, y)  #开始检查谋点是否在开启列表中
  172. @open_list.each do |point|
  173.    return true if point[0] == x and point[1] == y
  174. end
  175. return false
  176. end  #结束检查谋点是否在开启列表中
  177. #--------------------------------------------------------------------------
  178. def in_close_list?(x, y)  #开始检查谋点是否在关闭列表中
  179. @close_list.each do |point|
  180.    return true if point[0] == x and point[1] == y
  181. end
  182. return false
  183. end  #结束检查谋点是否在关闭列表中
  184. #--------------------------------------------------------------------------
  185. end
复制代码
冲突脚本2:
  1. #==============================================================================
  2. # ■ Game_Player
  3. #------------------------------------------------------------------------------
  4. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  5. # 本类的实例请参考 $game_player。
  6. #==============================================================================

  7. class Game_Player < Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 画面更新
  10.   #--------------------------------------------------------------------------
  11.   def update
  12.     # 本地变量记录移动信息
  13.     last_moving = moving?
  14.     # 移动中、事件执行中、强制移动路线中、
  15.     # 信息窗口一个也不显示的时候
  16.     unless moving? or $game_system.map_interpreter.running? or
  17.            @move_route_forcing or $game_temp.message_window_showing
  18.       # 如果方向键被按下、主角就朝那个方向移动
  19.       case Input.dir4
  20.       when 2
  21.         move_down
  22.       when 4
  23.         move_left
  24.       when 6
  25.         move_right
  26.       when 8
  27.         move_up
  28.       end
  29.     end
  30.     # 本地变量记忆坐标
  31.     last_real_x = @real_x
  32.     last_real_y = @real_y
  33.     super
  34.     update_scroll(last_real_x, last_real_y)
  35.     # 不在移动中的情况下
  36.     unless moving?
  37.       # 上次主角移动中的情况
  38.       if last_moving
  39.         # 与同位置的事件接触就判定为事件启动
  40.         result = check_event_trigger_here([1,2])
  41.         # 没有可以启动的事件的情况下
  42.         if result == false
  43.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  44.           unless $DEBUG and Input.press?(Input::CTRL)
  45.             # 遇敌计数下降
  46.             if @encounter_count > 0
  47.               @encounter_count -= 1
  48.             end
  49.           end
  50.         end
  51.       end
  52.       # 按下 C 键的情况下
  53.       if Input.trigger?(Input::C)
  54.         # 判定为同位置以及正面的事件启动
  55.         check_event_trigger_here([0])
  56.         check_event_trigger_there([0,1,2])
  57.       end
  58.     end
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 更新滚动
  62.   #--------------------------------------------------------------------------
  63.   def update_scroll(last_real_x, last_real_y)
  64.     ax1 = $game_map.adjust_x(last_real_x)
  65.     ay1 = $game_map.adjust_y(last_real_y)
  66.     ax2 = $game_map.adjust_x(@real_x)
  67.     ay2 = $game_map.adjust_y(@real_y)
  68.     slowmove = (2 ** (@move_speed - 1)).to_i
  69.     fastmove = (2 ** @move_speed).to_i
  70.     length = (2 ** (@move_speed + 4)).to_i
  71.     if ax2 < CENTER_X - 8
  72.       if (ax2 - CENTER_X) <= -length
  73.         $game_map.scroll_left(fastmove)
  74.       else
  75.         $game_map.scroll_left(slowmove)
  76.       end
  77.     elsif ax2 > CENTER_X + 8
  78.       if (ax2 - CENTER_X) >= length
  79.         $game_map.scroll_right(fastmove)
  80.       else
  81.         $game_map.scroll_right(slowmove)
  82.       end
  83.     end
  84.     if ay2 < CENTER_Y - 8
  85.       if (ay2 - CENTER_Y) <= -length
  86.         $game_map.scroll_up(fastmove)
  87.       else
  88.         $game_map.scroll_up(slowmove)
  89.       end
  90.     elsif ay2 > CENTER_Y + 8
  91.       if (ay2 - CENTER_Y) >= length
  92.         $game_map.scroll_down(fastmove)
  93.       else
  94.         $game_map.scroll_down(slowmove)
  95.       end
  96.     end   
  97.   end  
  98. end

  99. #==============================================================================
  100. # ■ Game_Map
  101. #------------------------------------------------------------------------------
  102. #  处理地图的类。包含卷动以及可以通行的判断功能。本类的实例请参考 $game_map 。
  103. #==============================================================================

  104. class Game_Map
  105.   #--------------------------------------------------------------------------
  106.   # ● 计算 X 座标减去显示座标
  107.   #     x : X 座标
  108.   #--------------------------------------------------------------------------
  109.   def adjust_x(x)
  110.     return x - @display_x
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 计算 Y 座标减去显示座标
  114.   #     y : Y 座标
  115.   #--------------------------------------------------------------------------
  116.   def adjust_y(y)
  117.     return y - @display_y
  118.   end
  119. end
复制代码

点评

试试看将两个脚本插入的位置对调吧,比如说原本是:[脚本一][脚本二]就跟它对调成:[脚本二][脚本一],或许行得通  发表于 2011-9-2 23:25

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
2
发表于 2011-9-2 23:13:31 | 只看该作者
找不到会冲突的地方

点评

55555555555~~~~~~~~~~~~~~~~~~  发表于 2011-9-3 00:07

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1030
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

3
发表于 2011-9-3 01:15:47 | 只看该作者
無衝突。

点评

555555555555~..  发表于 2011-9-3 08:49
回复

使用道具 举报

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
4
发表于 2011-9-3 09:01:53 | 只看该作者
第一个脚本定义的是Find_Path类,第二个定义的是Game_Player和Game_Map类,两者无关,或者是由于LZ使用的其他脚本导致冲突了

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
97
在线时间
753 小时
注册时间
2011-7-17
帖子
781
5
 楼主| 发表于 2011-9-3 09:06:24 | 只看该作者
Wind2010 发表于 2011-9-3 09:01
第一个脚本定义的是Find_Path类,第二个定义的是Game_Player和Game_Map类,两者无关,或者是由于LZ使用的其 ...

地图滚动脚本用了后,寻路脚本就无效了。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 04:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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