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

Project1

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

怎么改默认行走为斜着??

 关闭 [复制链接]

Lv4.逐梦者

世界坑化协会

梦石
0
星屑
9381
在线时间
1587 小时
注册时间
2007-3-13
帖子
5559

极短26参与极短25参与极短23参与极短21参与开拓者贵宾第一届化妆舞会最佳服饰奖

跳转到指定楼层
1
发表于 2007-12-29 16:56:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我改成1 3 7 9 ,但是人物不会动{/ll}
忍卷NINMAKI游戏DEMO上线了~♪  点我下载  ☚

Lv4.逐梦者

世界坑化协会

梦石
0
星屑
9381
在线时间
1587 小时
注册时间
2007-3-13
帖子
5559

极短26参与极短25参与极短23参与极短21参与开拓者贵宾第一届化妆舞会最佳服饰奖

2
 楼主| 发表于 2007-12-29 16:56:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我改成1 3 7 9 ,但是人物不会动{/ll}
忍卷NINMAKI游戏DEMO上线了~♪  点我下载  ☚

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2007-12-22
帖子
73
3
发表于 2007-12-29 17:05:07 | 只看该作者
LZ是要实现八方向行走么?

引用[SailCat]的方法

事件法:

  1. 打开一个开关,并行处理公共事件
  2. 如果方向键上按下
  3. 如果方向键左按下
  4.    左上移动
  5.    等待移动结束
  6. 除此以外的情况
  7.    如果方向键右按下
  8.      右上移动
  9.      等待移动结束
  10.    除此以外的情况
  11.      向上移动
  12.      等待移动结束
  13.    分歧结束
  14. 分歧结束
  15. 除此以外的情况
  16. 如果方向键下按下
  17.    如果方向键左按下
  18.      左下移动
  19.      等待移动结束
  20.    除此以外的情况
  21.      如果方向键右按下
  22.        右下移动
  23.        等待移动结束
  24.      除此以外的情况
  25.        向下移动
  26.        等待移动结束
  27.      分歧结束
  28.    分歧结束
  29. 除此以外的情况
  30.    如果方向键左按下
  31.      向左移动
  32.      等待移动结束
  33.    除此以外的情况
  34.      如果方向键右按下
  35.        向右移动
  36.        等待移动结束
  37.      分歧结束
  38.    分歧结束
  39. 分歧结束
  40. 分歧结束
复制代码


脚本法

  1. 定位RGSS Game_Player,第208行:
  2.      # 如果方向键被按下、主角就朝那个方向移动
  3.      case Input.dir4
  4.      when 2
  5.        move_down
  6.      when 4
  7.        move_left
  8.      when 6
  9.        move_right
  10.      when 8
  11.        move_up
  12.      end
  13. 修改为:
  14.      # 如果方向键被按下、主角就朝那个方向移动
  15.      case Input.dir8
  16.      when 1
  17.        move_lower_left
  18.      when 2
  19.        move_down
  20.      when 3
  21.        move_lower_right
  22.      when 4
  23.        move_left
  24.      when 6
  25.        move_right
  26.      when 7
  27.        move_upper_left
  28.      when 8
  29.        move_up
  30.      when 9
  31.        move_upper_right
  32.      end
  33. 存盘后就可以实现八方向走了.
  34. 如果你只是想实现八方向走的功能(像黑暗圣剑那样),就到此为止,如果还有兴趣则继续往下看:

  35. 虽然从功能上说是如此简单,但是这样子尝试以后就会发现,八方向行走的手感并不是很好,主要体现在两个方面:
  36. 1. 八方向走在遇到障碍物时,会自动停止,如果走到靠墙导致一个分方向不能通行时沿另一个分方向继续走下去,手感就会好很多
  37. 2. 八方向在地图上是一个斜着的移动过程,在八方向走原格和目标格构成的矩形中,如果除原格和目标格之外的两格中,有一格不能通行,八方向走仍然可以通行,但是斜着的移动看上去会比较丑,如果能够在这个情况下自动转为向能通行的一格前进一步再进入目标格,视觉上效果会好很多.
  38. 要实现这个也不是非常复杂,修改一下系统的斜方向行走方法.
  39. 以下以"左下移动"为例,说明一下系统的斜方向行走判定,修改强化手感和视觉效果的办法.

  40. Game_Character 3 第101行
  41. #--------------------------------------------------------------------------
  42. # ● 向左下移动
  43. #--------------------------------------------------------------------------
  44. def move_lower_left
  45.    # 没有固定面向的场合
  46.    unless @direction_fix
  47.      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  48.      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  49.    end
  50.    # 下→左、左→下 的通道可以通行的情况下
  51.    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
  52.       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  53.      # 更新坐标
  54.      @x -= 1
  55.      @y += 1
  56.      # 增加步数
  57.      increase_steps
  58.    end
  59. end
  60. 首先解决问题2:
  61. 八方向的通行判定是双路径并行,之间是或的关系,如果改成与的关系,就能实现只要两条路径中有一条走不通,斜方向就走不起来.
  62.    # 下→左、左→下 的通道可以通行的情况下
  63.    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
  64.       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  65. 这样虽说是可以了,但是,也不能说一条走不通就不让动啊,所以还需要分别判定两个方向的路径:
  66.    # 下→左、左→下 的通道可以通行的情况下
  67.    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
  68.       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  69.      # 更新坐标
  70.      @x -= 1
  71.      @y += 1
  72.      # 增加步数
  73.      increase_steps
  74.    # 下→左能够通行的情况下
  75.    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
  76.      # 向下移动后向左移动
  77.      move_down
  78.      move_left
  79.    # 左→下能够通行的情况下
  80.    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  81.      # 向左移动后向下移动
  82.      move_left
  83.      move_down
  84.    end

  85. 然后来解决比较复杂的问题1:
  86. 首先,对于这个智能判定前进方向的功能,原来的方法里是没有的,为了不影响事件里设置好的移动路线在执行时出现问题,必须加上判定,令其只对角色的按键移动有效.
  87. 一种方法是条件分歧 if self.is_a?(Game_Player)来判断类型,这样条件里的功能就只对角色有效,对NPC无效了,不过,还是不能判断角色的移动是事件设定移动还是按键移动,所以再加一个条件and not @move_route_forcing,这样事件设定里的角色移动便不会执行这个分歧的功能.
  88. 分歧里面的操作是: 首先判定角色朝向,如果向左,则以向左方前进为优先,不能移动时启动左方接触事件,没有事件时向下方移动;否则以向下方前进为优先,不能移动时启动下方接触事件,没有事件时向左方移动.
  89.    # 如果移动的对象是角色且非强制移动
  90.    if self.is_a?(Game_Player) and not @move_route_forcing
  91.      # 面向左时
  92.      if @direction = 4
  93.        # 左方可以通行时
  94.        if passable?(@x, @y, 4)
  95.          # 向左移动
  96.          move_left
  97.        # 不能通行时
  98.        else
  99.          # 左面接触事件启动
  100.          result = check_event_trigger_touch(@x-1, @y)
  101.          # 没有事件的情况下
  102.          unless result
  103.            # 向下移动
  104.            move_down
  105.          end
  106.        end
  107.      # 不面向左时
  108.      else
  109.        # 下方可以通行时
  110.        if passable?(@x, @y, 2)
  111.          # 向下移动
  112.          move_down
  113.        # 不能通行时
  114.        else
  115.          # 下面接触事件启动
  116.          result = check_event_trigger_touch(@x, @y+1)
  117.          # 没有事件的情况下
  118.          unless result
  119.            # 向左移动
  120.            move_left
  121.          end
  122.        end
  123.      end
  124.    end
  125. 然后把这个分歧结构作为一个elsif条件整合到前面的部分中,完整的"向左下移动"方法(紫色字是新加的脚本):
  126. #--------------------------------------------------------------------------
  127. # ● 向左下移动
  128. #--------------------------------------------------------------------------
  129. def move_lower_left
  130.    # 没有固定面向的场合
  131.    unless @direction_fix
  132.      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  133.      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  134.    end
  135.    # 下→左、左→下 的通道可以通行的情况下
  136.    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
  137.       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  138.      # 更新坐标
  139.      @x -= 1
  140.      @y += 1
  141.      # 增加步数
  142.      increase_steps
  143.    # 下→左能够通行的情况下
  144.    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
  145.      # 向下移动后向左移动
  146.      move_down
  147.      move_left
  148.    # 左→下能够通行的情况下
  149.    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  150.      # 向左移动后向下移动
  151.      move_left
  152.      move_down
  153.    # 如果移动的对象是角色且非强制移动
  154.    elsif self.is_a?(Game_Player) and not @move_route_forcing
  155.      # 面向左时
  156.      if @direction = 4
  157.        # 左方可以通行时
  158.        if passable(@x, @y, 4)
  159.          # 向左移动
  160.          move_left
  161.        # 不能通行时
  162.        else
  163.          # 左面接触事件启动
  164.          result = check_event_trigger_touch(@x-1, @y)
  165.          # 没有事件的情况下
  166.          unless result
  167.            # 向下移动
  168.            move_down
  169.          end
  170.        end
  171.      # 不面向左时
  172.      else
  173.        # 下方可以通行时
  174.        if passable(@x, @y, 2)
  175.          # 向下移动
  176.          move_down
  177.        # 不能通行时
  178.        else
  179.          # 下面接触事件启动
  180.          result = check_event_trigger_touch(@x, @y+1)
  181.          # 没有事件的情况下
  182.          unless result
  183.            # 向左移动
  184.            move_left
  185.          end
  186.        end
  187.      end
  188.    end
  189. end
  190. 这样就完成了一个有手感加强的"向左下移动"的方法,对于"向右下移动","向左上移动","向右上移动",只要调整几个方向的参数,照着上例修改一下就行了.
复制代码


引用[66大人]的方法

  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================
  4. ###########################################################################################################################
  5. ###########################################################################################################################
  6. # 脚本功能:八方向走与多帧移动之图片修正__ver1.1。

  7. # 更新日期:2005年8月6日

  8. # 更新内容:增加斜方向触发,增加斜方向面向角色(1步之内)

  9. # 使用方法:将本脚本插入到main之前。如果你使用了雅土版的八方向走脚本,请确保这个脚本的顺序位置,在雅土八方向走脚本的后面。

  10. # 预先处理:请输入每一步的帧数和总共可用的方向数

  11. $c3_每一步的帧数 = 5
  12. $c3_总共可用的方向数 = 8 #——建议不要修改这个。如果要伪8方向的,就用伪的好了。

  13. # 图片处理与功能说明:

  14. # 1、每一步的帧数:
  15. #    众所周知,RMXP的移动行走图是一个方向共有4帧,很多人都觉得这个帧数有点少。
  16. # 使用这个脚本之后,只要将 $c3_每一步的帧数 这个变量设置一个需要的帧数即可修改
  17. # 单方向移动帧数为相应输入值。修改后,需要用photoshop将所有用到的素材的横排
  18. # 调整为相应帧数,比如输入了8则要将每一行设置8个图像(即每一个行走图有8列)。

  19. # 2、可用方向调整(可用数量:4、8):
  20. #    当为4方向时没有任何变化,还是一个图4行,上左右下4个方向。
  21. #    如果想使用8方向走,将需要八方向行走的行走图在延伸扩大的画布中按照左下、右下、左上、右上继续排布图像。
  22. # 即,行走图图片从上到下的面向排列顺序为:下,左,右,上,左下,右下,左上,右上。
  23. #    至于不需要8方向走的普通的NPC(character),使用photoshop将画布向下扩大一倍即可使用。
  24. #    需要注意的是,如果需要斜方向飞鸟,请不要忘记自制素材。

  25. # 特别提示:   
  26. #     使用本脚本前请先考虑清楚是否要做这种效果。因为使用本脚本后需要用photoshop处理character行走图素材
  27. # 虽然这种处理用photoshop定义动作只需要5分钟即可全部完成,但在制作阶段会感觉不是很爽(具体的用了才知道)
  28. # 作者的建议是,如果你没有足够的制作经验,使用这个脚本得不偿失。请确保自己的能力属于“高手”级别!

  29. # 附赠功能:
  30. #     可以让NPC角色随机8方向走,方法是:NPC角色移动路线为“自定义”,然后自定义里面使用脚本,输入c8即可
  31. #     可以让NPC角色随机4斜角方向走,方法是:NPC角色移动路线为“自定义”,然后自定义里面使用脚本,输入c4即可
  32. #     可以使用真·斜4方向行走,参考脚本53行开始

  33. # 作者:carol3
  34. ###########################################################################################################################
  35. ###########################################################################################################################

  36. class Game_Player < Game_Character
  37.   if $c3_总共可用的方向数 == 8
  38.     def update
  39.       last_moving = moving?
  40.       unless moving? or $game_system.map_interpreter.running? or
  41.              @move_route_forcing or $game_temp.message_window_showing
  42.         # 用井号后面的东西替代前面的,就可以实现斜4方向走
  43.         case Input.dir8
  44.         when 2
  45.           move_down #move_lower_left
  46.         when 4
  47.           move_left #move_upper_left
  48.         when 6
  49.           move_right #move_lower_right
  50.         when 8
  51.           move_up #move_upper_right
  52.         when 1
  53.           move_lower_left
  54.         when 3
  55.           move_lower_right
  56.         when 7
  57.           move_upper_left
  58.         when 9
  59.           move_upper_right
  60.         end
  61.       end
  62.       # 本地变量记忆坐标
  63.       last_real_x = @real_x
  64.       last_real_y = @real_y
  65.       super
  66.       # 角色向下移动、画面上的位置在中央下方的情况下
  67.       if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  68.         # 画面向下卷动
  69.         $game_map.scroll_down(@real_y - last_real_y)
  70.       end
  71.       # 角色向左移动、画面上的位置在中央左方的情况下
  72.       if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  73.         # 画面向左卷动
  74.         $game_map.scroll_left(last_real_x - @real_x)
  75.       end
  76.       # 角色向右移动、画面上的位置在中央右方的情况下
  77.       if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  78.         # 画面向右卷动
  79.         $game_map.scroll_right(@real_x - last_real_x)
  80.       end
  81.       # 角色向上移动、画面上的位置在中央上方的情况下
  82.       if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  83.         # 画面向上卷动
  84.         $game_map.scroll_up(last_real_y - @real_y)
  85.       end
  86.       # 不在移动中的情况下
  87.       unless moving?
  88.         # 上次主角移动中的情况
  89.         if last_moving
  90.           # 与同位置的事件接触就判定为事件启动
  91.           result = check_event_trigger_here([1,2])
  92.           # 没有可以启动的事件的情况下
  93.           if result == false
  94.             # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  95.             unless $DEBUG and Input.press?(Input::CTRL)
  96.               # 遇敌计数下降
  97.               if @encounter_count > 0
  98.                 @encounter_count -= 1
  99.               end
  100.             end
  101.           end
  102.         end
  103.         # 按下 C 键的情况下
  104.         if Input.trigger?(Input::C)
  105.           # 判定为同位置以及正面的事件启动
  106.           check_event_trigger_here([0])
  107.           check_event_trigger_there([0,1,2])
  108.         end
  109.       end
  110.     end
  111.     #--------------------------------------------------------------------------
  112.     # ● 正面事件的启动判定
  113.     #--------------------------------------------------------------------------
  114.     def check_event_trigger_there(triggers)
  115.       result = false
  116.       # 事件执行中的情况下
  117.       if $game_system.map_interpreter.running?
  118.         return result
  119.       end
  120.       # 计算正面坐标
  121.       new_x = @x
  122.       new_y = @y
  123.       case @direction
  124.       when 1
  125.         new_x -= 1
  126.         new_y += 1
  127.       when 2
  128.         new_y += 1
  129.       when 3
  130.         new_x += 1
  131.         new_y += 1
  132.       when 4
  133.         new_x -= 1
  134.       when 6
  135.         new_x += 1
  136.       when 7
  137.         new_x -= 1
  138.         new_y -= 1
  139.       when 8
  140.         new_y -= 1
  141.       when 9
  142.         new_x += 1
  143.         new_y -= 1
  144.       end
  145.       # 全部事件的循环
  146.       for event in $game_map.events.values
  147.         # 事件坐标与目标一致的情况下
  148.         if event.x == new_x and event.y == new_y and
  149.            triggers.include?(event.trigger)
  150.           # 跳跃中以外的情况下、启动判定是正面的事件
  151.           if not event.jumping? and not event.over_trigger?
  152.             event.start
  153.             result = true
  154.           end
  155.         end
  156.       end
  157.       # 找不到符合条件的事件的情况下
  158.       if result == false
  159.         # 正面的元件是计数器的情况下
  160.         if $game_map.counter?(new_x, new_y)
  161.           # 计算 1 元件里侧的坐标
  162.           new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  163.           new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  164.           # 全事件的循环
  165.           for event in $game_map.events.values
  166.             # 事件坐标与目标一致的情况下
  167.             if event.x == new_x and event.y == new_y and
  168.                triggers.include?(event.trigger)
  169.               # 跳跃中以外的情况下、启动判定是正面的事件
  170.               if not event.jumping? and not event.over_trigger?
  171.                 event.start
  172.                 result = true
  173.               end
  174.             end
  175.           end
  176.         end
  177.       end
  178.       return result
  179.     end
  180.     #--------------------------------------------------------------------------
  181.     # ● 向左下移动
  182.     #--------------------------------------------------------------------------
  183.     def move_lower_left
  184.       # 没有固定面向的场合
  185.       unless @direction_fix
  186.         # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  187.         @direction = 1#(@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  188.       end
  189.       # 下→左、左→下 的通道可以通行的情况下
  190.       if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
  191.          (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  192.         # 更新坐标
  193.         @x -= 1
  194.         @y += 1
  195.         # 增加步数
  196.         increase_steps
  197.       else
  198.         check_event_trigger_touch(@x-1, @y+1)
  199.       end
  200.     end
  201.     #--------------------------------------------------------------------------
  202.     # ● 向右下移动
  203.     #--------------------------------------------------------------------------
  204.     def move_lower_right
  205.       # 没有固定面向的场合
  206.       unless @direction_fix
  207.         # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  208.         @direction = 3#(@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  209.       end
  210.       # 下→右、右→下 的通道可以通行的情况下
  211.       if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
  212.          (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
  213.         # 更新坐标
  214.         @x += 1
  215.         @y += 1
  216.         # 增加步数
  217.         increase_steps
  218.       else
  219.         check_event_trigger_touch(@x+1, @y+1)
  220.       end
  221.     end
  222.     #--------------------------------------------------------------------------
  223.     # ● 向左上移动
  224.     #--------------------------------------------------------------------------
  225.     def move_upper_left
  226.       # 没有固定面向的场合
  227.       unless @direction_fix
  228.         # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  229.         @direction = 7#(@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  230.       end
  231.       # 上→左、左→上 的通道可以通行的情况下
  232.       if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
  233.          (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
  234.         # 更新坐标
  235.         @x -= 1
  236.         @y -= 1
  237.         # 增加步数
  238.         increase_steps
  239.       else
  240.         check_event_trigger_touch(@x-1, @y-1)
  241.       end
  242.     end
  243.     #--------------------------------------------------------------------------
  244.     # ● 向右上移动
  245.     #--------------------------------------------------------------------------
  246.     def move_upper_right
  247.       # 没有固定面向的场合
  248.       unless @direction_fix
  249.         # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  250.         @direction = 9#(@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  251.       end
  252.       # 上→右、右→上 的通道可以通行的情况下
  253.       if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
  254.          (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
  255.         # 更新坐标
  256.         @x += 1
  257.         @y -= 1
  258.         # 增加步数
  259.         increase_steps
  260.       else
  261.         check_event_trigger_touch(@x+1, @y-1)
  262.       end
  263.     end
  264.     #--------------------------------------------------------------------------
  265.     # ● 雅土左下移動
  266.     #--------------------------------------------------------------------------
  267.     def move_lower_left_p
  268.       unless @direction_fix
  269.         @direction = 1
  270.       end
  271.       distance = (2 ** @move_speed) / Math.sqrt(2)
  272.       turn_left unless down1(@x, @y, distance)
  273.       turn_down if @event
  274.       turn_down unless left1(@x, @y, distance) unless @event
  275.       turn_left if @event
  276.     end
  277.     #--------------------------------------------------------------------------
  278.     # ● 雅土右下移動
  279.     #--------------------------------------------------------------------------
  280.     def move_lower_right_p
  281.       unless @direction_fix
  282.         @direction = 3
  283.       end
  284.       distance = (2 ** @move_speed) / Math.sqrt(2)
  285.       turn_right unless down1(@x, @y, distance)
  286.       turn_down if @event
  287.       turn_down unless right1(@x, @y, distance) unless @event
  288.       turn_right if @event
  289.     end
  290.     #--------------------------------------------------------------------------
  291.     # ● 雅土左上移動
  292.     #--------------------------------------------------------------------------
  293.     def move_upper_left_p
  294.       unless @direction_fix
  295.         @direction = 7
  296.       end
  297.       distance = (2 ** @move_speed) / Math.sqrt(2)
  298.       turn_left unless up1(@x, @y, distance)
  299.       turn_up if @event
  300.       turn_up unless left1(@x, @y, distance) unless @event
  301.       turn_left if @event
  302.     end
  303.     #--------------------------------------------------------------------------
  304.     # ● 雅土右上移動
  305.     #--------------------------------------------------------------------------
  306.     def move_upper_right_p
  307.       unless @direction_fix
  308.         @direction = 9
  309.       end
  310.       distance = (2 ** @move_speed) / Math.sqrt(2)
  311.       turn_right unless up1(@x, @y, distance)
  312.       turn_up if @event
  313.       turn_up unless right1(@x, @y, distance) unless @event
  314.       turn_right if @event
  315.     end
  316.   end
  317. end


  318. class Sprite_Character < RPG::Sprite
  319.   def update
  320.     super
  321.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  322.     if @tile_id != @character.tile_id or
  323.        @character_name != @character.character_name or
  324.        @character_hue != @character.character_hue
  325.       # 记忆元件 ID 与文件名、色相
  326.       @tile_id = @character.tile_id
  327.       @character_name = @character.character_name
  328.       @character_hue = @character.character_hue
  329.       # 元件 ID 为有效值的情况下
  330.       if @tile_id >= 384
  331.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  332.           @tile_id, @character.character_hue)
  333.         self.src_rect.set(0, 0, 32, 32)
  334.         self.ox = 16
  335.         self.oy = 32
  336.       # 元件 ID 为无效值的情况下
  337.       else
  338.         self.bitmap = RPG::Cache.character(@character.character_name,
  339.           @character.character_hue)
  340.         @cw = bitmap.width / $c3_每一步的帧数
  341.         if $c3_总共可用的方向数==4
  342.           @ch = bitmap.height / 4
  343.         else
  344.           @ch = bitmap.height / 8
  345.         end
  346.         self.ox = @cw / 2
  347.         self.oy = @ch
  348.       end
  349.     end
  350.     # 设置可视状态
  351.     self.visible = (not @character.transparent)
  352.     # 图形是角色的情况下
  353.     if @tile_id == 0
  354.       # 设置传送目标的矩形
  355.       sx = @character.pattern * @cw
  356.       if $c3_总共可用的方向数==8
  357.         case @character.direction
  358.         when 2
  359.           sy = 0 * @ch
  360.         when 4
  361.           sy = 1 * @ch
  362.         when 6
  363.           sy = 2 * @ch
  364.         when 8
  365.           sy = 3 * @ch
  366.         when 1
  367.           sy = 4 * @ch
  368.         when 3
  369.           sy = 5 * @ch
  370.         when 7
  371.           sy = 6 * @ch
  372.         when 9
  373.           sy = 7 * @ch
  374.         end
  375.       else
  376.         sy = (@character.direction - 2) / 2 * @ch
  377.       end
  378.       self.src_rect.set(sx, sy, @cw, @ch)
  379.     end
  380.     # 设置脚本的坐标
  381.     self.x = @character.screen_x
  382.     self.y = @character.screen_y
  383.     self.z = @character.screen_z(@ch)
  384.     # 设置不透明度、合成方式、茂密
  385.     self.opacity = @character.opacity
  386.     self.blend_type = @character.blend_type
  387.     self.bush_depth = @character.bush_depth
  388.     # 动画
  389.     if @character.animation_id != 0
  390.       animation = $data_animations[@character.animation_id]
  391.       animation(animation, true)
  392.       @character.animation_id = 0
  393.     end
  394.   end
  395. end

  396. class Game_Character
  397.   def c8
  398.     # 随机 0~5 的分支
  399.     case rand(10)
  400.     when 0..3  # 随机
  401.       move_random
  402.     when 4  # 前进一步
  403.       move_forward
  404.     when 5  # 暂时停止
  405.       @stop_count = 0
  406.     when 6..9  #另外4方向随机
  407.       c4
  408.     end
  409.   end
  410.   def c4
  411.     case rand(5)
  412.     when 0
  413.       move_upper_left
  414.     when 1
  415.       move_upper_right
  416.     when 2
  417.       move_lower_left
  418.     when 3
  419.       move_lower_right
  420.     when 4
  421.       @stop_count = 0
  422.     end
  423.   end
  424.      
  425.   def update
  426.     # 跳跃中、移动中、停止中的分支
  427.     if jumping?
  428.       update_jump
  429.     elsif moving?
  430.       update_move
  431.     else
  432.       update_stop
  433.     end
  434.     # 动画计数超过最大值的情况下
  435.     # ※最大值等于基本值减去移动速度 * 1 的值
  436.     if @anime_count > 16*4/$c3_每一步的帧数 - @move_speed * 2
  437.       # 停止动画为 OFF 并且在停止中的情况下
  438.       if not @step_anime and @stop_count > 0
  439.         # 还原为原来的图形
  440.         @pattern = @original_pattern
  441.       # 停止动画为 ON 并且在移动中的情况下
  442.       else
  443.         # 更新图形
  444.         @pattern = (@pattern + 1) % $c3_每一步的帧数
  445.       end
  446.       # 清除动画计数
  447.       @anime_count = 0
  448.     end
  449.     # 等待中的情况下
  450.     if @wait_count > 0
  451.       # 减少等待计数
  452.       @wait_count -= 1
  453.       return
  454.     end
  455.     # 强制移动路线的场合
  456.     if @move_route_forcing
  457.       # 自定义移动
  458.       move_type_custom
  459.       return
  460.     end
  461.     # 事件执行待机中并且为锁定状态的情况下
  462.     if @starting or lock?
  463.       # 不做规则移动
  464.       return
  465.     end
  466.     # 如果停止计数超过了一定的值(由移动频度算出)
  467.     if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  468.       # 移动类型分支
  469.       case @move_type
  470.       when 1  # 随机
  471.         move_type_random
  472.       when 2  # 接近
  473.         move_type_toward_player
  474.       when 3  # 自定义
  475.         move_type_custom
  476.       end
  477.     end
  478.   end
  479. end

  480. class Window_Base < Window
  481.   def draw_actor_graphic(actor, x, y)
  482.     bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
  483.     cw = bitmap.width / $c3_每一步的帧数
  484.     ch = bitmap.height / $c3_总共可用的方向数
  485.     src_rect = Rect.new(0, 0, cw, ch)
  486.     self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  487.   end
  488. end

  489. class Game_Character
  490.   #--------------------------------------------------------------------------
  491.   # ● 面向主角的方向
  492.   #--------------------------------------------------------------------------
  493.   def turn_toward_player
  494.     # 求得与主角的坐标差
  495.     sx = @x - $game_player.x
  496.     sy = @y - $game_player.y
  497.     # 坐标相等的场合下
  498.     if sx == 0 and sy == 0
  499.       return
  500.     end
  501.     # 横侧距离长的情况下
  502.     if sx.abs > sy.abs
  503.       # 将左右方向变更为朝向主角的方向
  504.       sx > 0 ? turn_left : turn_right
  505.     # 竖侧距离长的情况下
  506.     else
  507.       # 将上下方向变更为朝向主角的方向
  508.       sy > 0 ? turn_up : turn_down
  509.     end
  510.     if sx == -1 and sy == -1
  511.       @direction = 3
  512.       @stop_count = 0
  513.     elsif sx == -1 and sy == 1
  514.       @direction = 9
  515.       @stop_count = 0
  516.     elsif sx == 1 and sy == -1
  517.       @direction = 1
  518.       @stop_count = 0
  519.     elsif sx == 1 and sy == 1
  520.       @direction = 7
  521.       @stop_count = 0
  522.     end
  523.   end
  524. end

  525. #==============================================================================
  526. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  527. #==============================================================================
复制代码



系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-6-19 23:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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