Project1

标题: 《全方向移动》 [打印本页]

作者: 美兽    时间: 2008-10-12 05:17
标题: 《全方向移动》
功能:
八方向以及遇障碍物自动偏向。


脚本:
  1. #==============================================================================
  2. # ■ 全方向移动
  3. #==============================================================================

  4. class Game_Player < Game_Character
  5.   #--------------------------------------------------------------------------
  6.   # ● 刷新画面
  7.   #--------------------------------------------------------------------------
  8.   def update
  9.       last_real_x = @real_x
  10.       last_real_y = @real_y
  11.       last_moving = moving?
  12.       #全方向移动
  13.       all_move_by_input
  14.       super
  15.       update_scroll(last_real_x, last_real_y)
  16.       update_vehicle
  17.       update_nonmoving(last_moving)
  18.   end  
  19.   #--------------------------------------------------------------------------
  20.   # ● 判断是否接触事件(不可通行情况下)
  21.   #     x : X 坐标
  22.   #     y : Y 坐标
  23.   #--------------------------------------------------------------------------
  24.   def all_check_event_trigger_touch(x, y)
  25.       return false if $game_map.interpreter.running?
  26.       result = false
  27.       allEvents = $game_map.events_xy(x, y)
  28.       result = true unless allEvents.empty?
  29.       for event in allEvents
  30.         if [1,2].include?(event.trigger) and event.priority_type == 1
  31.           event.start
  32.         end
  33.       end
  34.       return result
  35.   end  
  36.   #--------------------------------------------------------------------------
  37.   # ● 处理输入方向键后的移动
  38.   #--------------------------------------------------------------------------
  39.   def all_move_by_input
  40.       return unless movable?
  41.       return if $game_map.interpreter.running?
  42.       move_dir(Input.dir8)
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 转向判断     
  46.   #--------------------------------------------------------------------------
  47.   def dir_fact(x1, y1, x2, y2, d1, d2)
  48.       dir = 0
  49.       dir +=1 if passable?(x1, y1)            #右下
  50.       dir +=2 if passable?(x2, y2)            #左下
  51.       if dir > 0  
  52.          return (rand(10) > 4 ? move_dir(d1) : move_dir(d2)) if dir == 3
  53.          return move_dir(d2) if dir == 2
  54.          return move_dir(d1) if dir == 1
  55.       end   
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● 移动方向   
  59.   #--------------------------------------------------------------------------  
  60.   def move_dir(d)
  61.       return all_move_lower_left  if d == 1
  62.       return all_move_down        if d == 2
  63.       return all_move_lower_right if d == 3      
  64.       return all_move_left        if d == 4  
  65.       return all_move_right       if d == 6
  66.       return all_move_upper_left  if d == 7     
  67.       return all_move_up          if d == 8
  68.       return all_move_upper_right if d == 9   
  69.   end  
  70.   #--------------------------------------------------------------------------
  71.   # ● 向下移动
  72.   #     turn_ok : 此地可以更改朝向
  73.   #--------------------------------------------------------------------------
  74.   def all_move_down(turn_ok = true)
  75.     if passable?(@x, @y+1)                  # 可以通过
  76.       turn_down
  77.       @y = $game_map.round_y(@y+1)
  78.       @real_y = (@y-1)*256
  79.       increase_steps
  80.       @move_failed = false      
  81.     else                                    # 下方向不可通过
  82.       if all_check_event_trigger_touch(@x, @y+1) # 判断接触的事件启动
  83.          turn_down if turn_ok
  84.          @move_failed = true
  85.          return
  86.       end  
  87.       dir_fact(@x+1, @y+1, @x-1, @y+1, 3, 1)     
  88.     end
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 向左移动
  92.   #     turn_ok : 此地可以更改朝向
  93.   #--------------------------------------------------------------------------
  94.   def all_move_left(turn_ok = true)
  95.     if passable?(@x-1, @y)                  # 可以通过
  96.       turn_left
  97.       @x = $game_map.round_x(@x-1)
  98.       @real_x = (@x+1)*256
  99.       increase_steps
  100.       @move_failed = false
  101.     else                                    # 不可以通过
  102.       if all_check_event_trigger_touch(@x-1, @y)   # 判断接触的事件启动
  103.          turn_left if turn_ok
  104.          @move_failed = true
  105.          return
  106.       end
  107.       dir_fact(@x-1, @y+1, @x-1, @y-1, 1, 7)  
  108.     end
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 向右移动
  112.   #     turn_ok : 此地可以更改朝向
  113.   #--------------------------------------------------------------------------
  114.   def all_move_right(turn_ok = true)
  115.     if passable?(@x+1, @y)                  # 可以通过
  116.       turn_right
  117.       @x = $game_map.round_x(@x+1)
  118.       @real_x = (@x-1)*256
  119.       increase_steps
  120.       @move_failed = false
  121.     else                                    # 不可以通过
  122.       if all_check_event_trigger_touch(@x+1, @y)   # 判断接触的事件启动
  123.          turn_right if turn_ok
  124.          @move_failed = true
  125.          return
  126.       end  
  127.       dir_fact(@x+1, @y-1, @x+1, @y+1, 9, 3)      
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 向上移动
  132.   #     turn_ok : 此地可以更改朝向
  133.   #--------------------------------------------------------------------------
  134.   def all_move_up(turn_ok = true)
  135.     if passable?(@x, @y-1)                  # 可以通过
  136.       turn_up
  137.       @y = $game_map.round_y(@y-1)
  138.       @real_y = (@y+1)*256
  139.       increase_steps
  140.       @move_failed = false
  141.     else                                    # 不可以通过
  142.       if all_check_event_trigger_touch(@x, @y-1)   # 判断接触的事件启动
  143.          turn_up if turn_ok
  144.          @move_failed = true
  145.          return
  146.       end
  147.       dir_fact(@x-1, @y-1, @x+1, @y-1, 7, 9)   
  148.     end
  149.   end  
  150.   #--------------------------------------------------------------------------
  151.   # ● 左下移动
  152.   #--------------------------------------------------------------------------
  153.   def all_move_lower_left
  154.     unless @direction_fix
  155.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  156.     end
  157.     if (passable?(@x, @y+1) and passable?(@x-1, @y+1)) or
  158.        (passable?(@x-1, @y) and passable?(@x-1, @y+1))
  159.       @x -= 1
  160.       @y += 1
  161.       increase_steps
  162.       @move_failed = false
  163.     else
  164.       @move_failed = true
  165.     end
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 向右下移动
  169.   #--------------------------------------------------------------------------
  170.   def all_move_lower_right
  171.     unless @direction_fix
  172.       @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  173.     end
  174.     if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
  175.        (passable?(@x+1, @y) and passable?(@x+1, @y+1))
  176.       @x += 1
  177.       @y += 1
  178.       increase_steps
  179.       @move_failed = false
  180.     else
  181.       @move_failed = true
  182.     end
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 向左上移动
  186.   #--------------------------------------------------------------------------
  187.   def all_move_upper_left
  188.     unless @direction_fix
  189.       @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  190.     end
  191.     if (passable?(@x, @y-1) and passable?(@x-1, @y-1)) or
  192.        (passable?(@x-1, @y) and passable?(@x-1, @y-1))
  193.       @x -= 1
  194.       @y -= 1
  195.       increase_steps
  196.       @move_failed = false
  197.     else
  198.       @move_failed = true
  199.     end
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 向右上移动
  203.   #--------------------------------------------------------------------------
  204.   def all_move_upper_right
  205.     unless @direction_fix
  206.       @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  207.     end
  208.     if (passable?(@x, @y-1) and passable?(@x+1, @y-1)) or
  209.        (passable?(@x+1, @y) and passable?(@x+1, @y-1))
  210.       @x += 1
  211.       @y -= 1
  212.       increase_steps
  213.       @move_failed = false
  214.     else
  215.       @move_failed = true
  216.     end
  217.   end

  218. end  
复制代码


范例:
http://rpg.blue/upload_program/d ... 81011_104188782.rar

截图:(注意红圈内的移动方式)

作者: 偶尔杀人越货    时间: 2008-10-12 05:42
  def all_move_lower_right
    unless @direction_fix
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
       (passable?(@x+1, @y) and passable?(@x+1, @y+1))
      @x += 1
      @y += 1
      increase_steps
      @move_failed = false
    else
      @move_failed = true
    end
  end
感覺側向的一定不應該是x+1y+1,累加起來是移動了1.414。看起來會失去立體感
0.7,0.7還差不多
故國這樣接觸判斷什么的就麻煩了……
1:1
缺點就是在人物移動的快或者人物比較小的時候會比較明顯
優點
不會遇到事件決出和同行度判定問題


作者: 美兽    时间: 2008-10-12 05:45
以下引用偶尔杀人越货于2008-10-11 21:42:23的发言:


def all_move_lower_right
   unless @direction_fix
     @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
   end
   if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
      (passable?(@x+1, @y) and passable?(@x+1, @y+1))
     @x += 1
     @y += 1
     increase_steps
     @move_failed = false
   else
     @move_failed = true
   end
end
感覺側向的一定不應該是x+1y+1,累加起來是移動了1.414。看起來會失去立體感
0.7,0.7還差不多


恩,我试了一下GBA的《鬼眼狂刀》,《守护英雄》以及SFC的《天地创造》,斜方向都是1,1,只是降低了移动速度,不过这点暂时不是大的问题,后期可能会对地图进行改造,暂时先这样。
作者: 偶尔杀人越货    时间: 2008-10-12 06:00
順帶提一句
使用x+1,y+0.6,斜向時累計+0.7的視覺效果比較好
不過在平面游戲這些都可以忽略
作者: 美兽    时间: 2008-10-12 06:04
1:1
缺點就是在人物移動的快或者人物比較小的時候會比較明顯
優點
不會遇到事件決出和同行度判定問題


呵呵,手感方面参考的是这个游戏,仔细测试,会发现他的地图设置存在很多取巧之处,RM模仿时,限制较多。


作者: kissye    时间: 2008-10-12 06:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2008-10-12 06:12
以下引用kissye于2008-10-11 22:08:52的发言:

那个,报告一下fps
最低24,最高45左右
不过我的电脑是很差,泪>_<


……不至于吧,
为降低消耗,甚至整合一部分方法,运算效率几乎与默认相同,

我一直是60— —

作者: kissye    时间: 2008-10-12 06:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2008-10-12 07:21
又是个高级功能……
拜膜一下。
作者: holiday    时间: 2008-10-12 09:19
好东西要顶,希望能支持像xp那样的八方向行走图。
作者: drgdrg    时间: 2008-10-12 09:45
那个……

斜方向行走到一个格子

那里有接触触发的事件,事件分歧要判定人物朝向,会是什么情况?
作者: 沉影不器    时间: 2008-10-12 19:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: 如释重负、    时间: 2008-10-12 20:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 松谷修三    时间: 2008-10-12 20:06
以下引用沉影不器于2008-10-12 11:36:51的发言:

全方向比八方向多了什么?
注意那几个红圈啥意思?

地图还缺少一些,Game_Map里有些17和13的数值还得改改,否则卷动起来边缘有问题.

就是所有地方都可以走,包括45°那些路
作者: 一路一风尘    时间: 2008-10-13 00:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2008-10-13 04:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2008-10-14 06:29
以下引用沉影不器于2008-10-12 20:42:31的发言:


以下引用一路一风尘于2008-10-12 16:36:38的发言:
走到地图右边缘和下边缘时就能发现:
显示对边地图,并且角色走不到边缘,因为边界判断

Game_Map里的卷动部分如下,


呵呵,谢谢,果然忘记考虑了,红圈不过是列举几种不同障碍下的转向方式。
作者: 虎假狐威    时间: 2008-10-19 22:02
提示: 作者被禁止或删除 内容自动屏蔽




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