Project1

标题: 各位来看看这个追逐要求,是不是无解了? [打印本页]

作者: 飞火流萤    时间: 2014-11-20 19:03
标题: 各位来看看这个追逐要求,是不是无解了?
本帖最后由 hys111111 于 2014-12-6 22:19 编辑

我已经是绞尽脑汁了:

重点如下:
1.猫在往下面和右边逃的时候,遇到无法通行的边缘时,能流畅选择通行的方向转向避开玩家追赶
2.猫在往左边和上面逃的时候,能跳跃上酒桶和草坪的边框内
我现在只能做到这个程度,只能做到神似,但是完全不能做到那些要求:
  1. class Game_Character
  2. def toward_player_add2(x = 1,y = 1)
  3. # 求得与主角坐标的差
  4. sx = (@x - $game_player.x).abs
  5. sy = (@y - $game_player.y).abs
  6. if sx <= x and sy <= y
  7. if passable?(@x, @y, 2)
  8. if sx <= 1 and sy <= 1
  9. move_random
  10. else
  11.   move_away_from_player
  12.   end
  13. @move_speed = @last_speed  + 2
  14. move_away_from_player
  15.     # 不能通行的情况下
  16. else
  17.       # 接触事件的启动判定
  18.       jump(0, -2)
  19.     end
  20. else
  21. move_random
  22. @move_speed = @last_speed
  23. end
  24. end
  25. end
复制代码
我感觉无解了....
无法解决卡住的问题,无法解决在面对无法通行时多种要求的移动方式。
作者: 飞火流萤    时间: 2014-11-20 19:13
感觉只有通过识别事件坐标来完成,比如具体到四个段的时候,事件如何移动,感觉只用远离主角来做,很难达到理想效果,各位怎么看?
作者: 飞火流萤    时间: 2014-11-20 19:14
@yang1zhi  
作者: yang1zhi    时间: 2014-11-20 22:05
你觉得这个走路方式怎么样。跳上箱子我还不知道怎么写。


RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Character (接近专定义)
  3. #------------------------------------------------------------------------------
  4. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  5. # 类的超级类使用。
  6. #==============================================================================
  7. # 使用方法:
  8. # 在设置事件移动那里改为自定义,路线为:toward_player_add(x范围,y范围)
  9. #==============================================================================
  10. class Game_Character
  11. def toward_player_add(x = 1,y = 1)
  12. # 求得与主角坐标的差
  13. sx = (@x - $game_player.x).abs
  14. sy = (@y - $game_player.y).abs
  15. if sx <= x and sy <= y
  16.   unless passable?(@x, @y, 2)
  17.     if passable?(@x, @y, 4)
  18.       move_left
  19.     end
  20.     if passable?(@x, @y, 6)
  21.       move_right
  22.     end
  23.     if passable?(@x, @y, 8)
  24.       move_up
  25.     end
  26.   end
  27.   unless passable?(@x, @y, 4)
  28.       if passable?(@x, @y, 2)
  29.       move_down
  30.     end
  31.     if passable?(@x, @y, 6)
  32.       move_right
  33.     end
  34.     if passable?(@x, @y, 8)
  35.       move_up
  36.     end
  37.   end
  38.       unless passable?(@x, @y, 6)
  39.     if passable?(@x, @y, 2)
  40.       move_down
  41.     end
  42.  
  43.     if passable?(@x, @y, 4)
  44.       move_left
  45.     end
  46.     if passable?(@x, @y, 8)
  47.       move_up
  48.     end
  49.   end
  50.       unless passable?(@x, @y, 8)
  51.     if passable?(@x, @y, 2)
  52.       move_down
  53.     end
  54.  
  55.     if passable?(@x, @y, 4)
  56.       move_left
  57.     end
  58.     if passable?(@x, @y, 6)
  59.       move_right
  60.     end
  61.     end
  62. move_away_from_player
  63.  
  64. else
  65. move_random
  66. end
  67. end
  68. end

作者: 恐惧剑刃    时间: 2014-11-20 23:20
本帖最后由 恐惧剑刃 于 2014-11-20 23:28 编辑

不知道有没有什么BUG
喵喵.zip (229.65 KB, 下载次数: 27)

RUBY 代码复制
  1. =begin
  2.  
  3. 事件注释(必须在最上边):
  4. [Move_Away_From_Player]
  5. Away_Distance          :   [警戒距离]
  6. Speed_Plus             :   [逃跑速度的增加值]
  7. Jump_Distance          :   [检索的最大跳跃距离]
  8. Terrain_Tags           :   [可跳跃墙壁的地形标志]
  9. Jump_Se                :   [跳跃时播放的SE文件名称]
  10.  
  11. =end
  12.  
  13.  
  14. #==============================================================================
  15. # 开始刷新
  16. #==============================================================================
  17. class Game_Character
  18.   alias upd_move_away_from_player update
  19.   def update
  20.     upd_move_away_from_player
  21.     if @away_distance and
  22.       # 与频率联系
  23.       @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  24.       an_move_away_from_player
  25.     end
  26.   end
  27. end
  28. class Game_Event < Game_Character
  29.   #============================================================================
  30.   # 初始化
  31.   #============================================================================
  32.   def init_move_away_from_player(*args)
  33.     args[0].sub(/\[(.+)\]/, "ha ha !")
  34.     return !args[1] ? $1 : $1.to_i
  35.   end
  36.   alias ref_move_away_from_player refresh
  37.   def refresh
  38.     ref_move_away_from_player
  39.     away_page = @event.pages[@event.pages.index(@page)]
  40.     list = away_page.list
  41.     if list[0].parameters[0] == "[Move_Away_From_Player]"
  42.       # 初始化
  43.       @away_distance = init_move_away_from_player(list[1].parameters[0], true)#视野
  44.       @speed_plus = init_move_away_from_player(list[2].parameters[0], true)#速度附加值
  45.       @jump_distance = init_move_away_from_player(list[3].parameters[0], true)#跳跃检查距离
  46.       @terrain_tags = init_move_away_from_player(list[4].parameters[0], true)#可跳跃的地形标志
  47.       @jump_se = RPG::AudioFile.new
  48.       @jump_se.name = init_move_away_from_player(list[5].parameters[0])#跳跃SE
  49.       # 备份数据
  50.       @old_move_speed = away_page.move_speed
  51.       @old_move_frequency = away_page.move_frequency
  52.       @old_through = away_page.through
  53.       @old_always_on_top = away_page.always_on_top
  54.       return
  55.     end
  56.     # 清理数据
  57.     @away_distance = @speed_plus = @check_distance = @terrain_tags = @jump_se = nil
  58.   end
  59.   #============================================================================
  60.   # 执行刷新
  61.   #============================================================================
  62.   def an_move_away_from_player
  63.     sx = @x - $game_player.x
  64.     sy = @y - $game_player.y
  65.     if sx.abs > @away_distance or sy.abs > @away_distance
  66.       # 恢复速度,频率
  67.       @move_speed = @old_move_speed
  68.       @move_frequency = @old_move_frequency
  69.       move_rand
  70.     else
  71.       # 墙角(???)
  72.       #if (@x == $game_map.width - 1 and @y == $game_map.height - 1) or
  73.       #  (@x == 0 and @y == $game_map.height - 1) or
  74.       #  (@x == $game_map.width - 1 and @y == 0) or
  75.       #  (@x == 0 and @y == 0)
  76.       #  return
  77.       #end
  78.       # 快速逃离
  79.       @move_speed = [@old_move_speed + @speed_plus, 6].min
  80.       @move_frequency = 6
  81.       # 在墙上远离角色
  82.       if $game_map.terrain_tag(@x, @y) == @terrain_tags
  83.         move_away_from_player
  84.         return
  85.       end
  86.       # 跳上墙
  87.       ax = [*(@x - @jump_distance)..(@x + @jump_distance)]
  88.       ay = [*(@y - @jump_distance)..(@y + @jump_distance)]
  89.       for ix in 0...ax.size
  90.         for iy in 0...ay.size
  91.           x = ax[ix]
  92.           y = ay[iy]
  93.           if not $game_map.valid?(x, y)
  94.             next
  95.           end
  96.           if $game_map.terrain_tag(x, y) == @terrain_tags
  97.             # 穿透,置顶
  98.             @through = @always_on_top = true
  99.             $game_system.se_play(@jump_se)
  100.             jump(x - @x, y - @y)
  101.             return
  102.           end
  103.         end
  104.       end
  105.       # 远离角色
  106.       move_away_from_player
  107.     end
  108.   end
  109.   #============================================================================
  110.   # 随机移动
  111.   #============================================================================
  112.   def move_rand
  113.     n = rand(4)
  114.     # 跳下来
  115.     if $game_map.terrain_tag(x, y) == @terrain_tags
  116.       case n
  117.       when 0
  118.         arc = [@x, @y + 1]
  119.         arj = [0, 1]
  120.       when 1
  121.         arc = [@x - 1, @y]
  122.         arj = [-1, 0]
  123.       when 2
  124.         arc = [@x + 1, @y]
  125.         arj = [1, 0]
  126.       when 3
  127.         arc = [@x, @y - 1]
  128.         arj = [0, -1]
  129.       end
  130.       if $game_map.valid?(*arc) and
  131.         $game_map.terrain_tag(*arc) != @terrain_tags
  132.         $game_system.se_play(@jump_se)
  133.         jump(*arj)
  134.         # 恢复穿透,置顶设置
  135.         @through = @old_through
  136.         @always_on_top = @old_always_on_top
  137.         return
  138.       end
  139.     end
  140.     # 随机移动
  141.     case n
  142.     when 0
  143.       move_down(false)
  144.     when 1
  145.       move_left(false)
  146.     when 2
  147.       move_right(false)
  148.     when 3
  149.       move_up(false)
  150.     end
  151.   end
  152. end





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