Project1

标题: 《八方向步行图》 [打印本页]

作者: 美兽    时间: 2008-10-14 06:48
标题: 《八方向步行图》
注:八方步行图拼自《3d rpgmaker》,仅作测试,请勿挪作他用。

功能:
支持八方向步行图,同时不影响伪八方向行走。


行走格式如图:


独立脚本:
  1. module Standrad
  2.   
  3.   #八方向行走图纵向坐标基准常数
  4.   #(0点,左下,下,右下,左,回中,右,左上,上,右上)
  5.   DIR8_Y = [0, 4, 0, 5, 1, 0, 2, 6, 3, 7]
  6.   
  7. end  

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

  226. end  

  227. class Game_Character
  228.   
  229.   #--------------------------------------------------------------------------
  230.   # ● 判断可以通行
  231.   #     x : X 坐标
  232.   #     y : Y 坐标
  233.   #--------------------------------------------------------------------------
  234.   def passable?(x, y)
  235.     x = $game_map.round_x(x)                        # 横方向循环修正
  236.     y = $game_map.round_y(y)                        # 纵方向循环修正
  237.     return false unless $game_map.valid?(x, y)      # 地图外?
  238.     return true if @through                         # 穿越 ON?
  239.     return false unless map_passable?(x, y)         # 地图不能通行?
  240.     return false if collide_with_characters?(x, y)  # 与角色冲突?
  241.     return true                                     # 可以通行
  242.   end

  243.   #--------------------------------------------------------------------------
  244.   # ● 向左下
  245.   #--------------------------------------------------------------------------
  246.   def turn_lower_left
  247.     set_direction(1)
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● 向右下
  251.   #--------------------------------------------------------------------------
  252.   def turn_lower_right
  253.     set_direction(3)
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 向左上
  257.   #--------------------------------------------------------------------------
  258.   def turn_upper_left
  259.     set_direction(7)
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● 向右上
  263.   #--------------------------------------------------------------------------
  264.   def turn_upper_right
  265.     set_direction(9)
  266.   end
  267.   
  268. end  

  269. class Sprite_Character < Sprite_Base
  270.   
  271.   DIR8_SY = Standrad::DIR8_Y
  272.   
  273.   def update_src_rect
  274.     if @tile_id == 0
  275.       index = @character.character_index
  276.       pattern = @character.pattern < 3 ? @character.pattern : 1
  277.       sx = (index % 4 * 3 + pattern) * @cw
  278.       sy =  DIR8_SY[@character.direction] * @ch
  279.       self.src_rect.set(sx, sy, @cw, @ch)
  280.     end
  281.   end
  282.   
  283. end  
复制代码


截图:


范例:
http://rpg.blue/upload_program/d ... ��图_104367331.rar
作者: zhong    时间: 2008-10-14 21:14
呵呵~~我的八方行走也是这样做的...而且做了多帧的.....看看脚本有什么不同...学习~~.
作者: zeeg    时间: 2008-10-15 01:02
这个是不是支持用鼠标走动呀!!!脚本。。。我是脚本盲看不懂的{/ll}{/ll}{/dk}{/dk}




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