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

Project1

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

[原创发布] 也说八方向走(功能实现+手感加强)

 关闭 [复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22431
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

跳转到指定楼层
1
发表于 2005-10-22 04:35:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
八方向走,如果只是要实现功能的话,实在是非常简单:
事件方法:打开一个开关,并行处理公共事件
如果方向键上按下
  如果方向键左按下
    左上移动
    等待移动结束
  除此以外的情况
    如果方向键右按下
      右上移动
      等待移动结束
    除此以外的情况
      向上移动
      等待移动结束
    分歧结束
  分歧结束
除此以外的情况
  如果方向键下按下
    如果方向键左按下
      左下移动
      等待移动结束
    除此以外的情况
      如果方向键右按下
        右下移动
        等待移动结束
      除此以外的情况
        向下移动
        等待移动结束
      分歧结束
    分歧结束
  除此以外的情况
    如果方向键左按下
      向左移动
      等待移动结束
    除此以外的情况
      如果方向键右按下
        向右移动
        等待移动结束
      分歧结束
    分歧结束
  分歧结束
分歧结束

用脚本的话,更加简单:
定位RGSS Game_Player,第208行:
      # 如果方向键被按下、主角就朝那个方向移动
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
修改为:
      # 如果方向键被按下、主角就朝那个方向移动
      case Input.dir8
      when 1
        move_lower_left
      when 2
        move_down
      when 3
        move_lower_right
      when 4
        move_left
      when 6
        move_right
      when 7
        move_upper_left
      when 8
        move_up
      when 9
        move_upper_right
      end
存盘后就可以实现八方向走了.
如果你只是想实现八方向走的功能(像黑暗圣剑那样),就到此为止,如果还有兴趣则继续往下看:

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

Game_Character 3 第101行
  #--------------------------------------------------------------------------
  # ● 向左下移动
  #--------------------------------------------------------------------------
  def move_lower_left
    # 没有固定面向的场合
    unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    end
  end
首先解决问题2:
八方向的通行判定是双路径并行,之间是或的关系,如果改成与的关系,就能实现只要两条路径中有一条走不通,斜方向就走不起来.
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
这样虽说是可以了,但是,也不能说一条走不通就不让动啊,所以还需要分别判定两个方向的路径:
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    # 下→左能够通行的情况下
    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
      # 向下移动后向左移动
      move_down
      move_left
    # 左→下能够通行的情况下
    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 向左移动后向下移动
      move_left
      move_down

    end

然后来解决比较复杂的问题1:
首先,对于这个智能判定前进方向的功能,原来的方法里是没有的,为了不影响事件里设置好的移动路线在执行时出现问题,必须加上判定,令其只对角色的按键移动有效.
一种方法是条件分歧 if self.is_a?(Game_Player)来判断类型,这样条件里的功能就只对角色有效,对NPC无效了,不过,还是不能判断角色的移动是事件设定移动还是按键移动,所以再加一个条件and not @move_route_forcing,这样事件设定里的角色移动便不会执行这个分歧的功能.
分歧里面的操作是: 首先判定角色朝向,如果向左,则以向左方前进为优先,不能移动时启动左方接触事件,没有事件时向下方移动;否则以向下方前进为优先,不能移动时启动下方接触事件,没有事件时向左方移动.
    # 如果移动的对象是角色且非强制移动
    if self.is_a?(Game_Player) and not @move_route_forcing
      # 面向左时
      if @direction = 4
        # 左方可以通行时
        if passable?(@x, @y, 4)
          # 向左移动
          move_left
        # 不能通行时
        else
          # 左面接触事件启动
          result = check_event_trigger_touch(@x-1, @y)
          # 没有事件的情况下
          unless result
            # 向下移动
            move_down
          end
        end
      # 不面向左时
      else
        # 下方可以通行时
        if passable?(@x, @y, 2)
          # 向下移动
          move_down
        # 不能通行时
        else
          # 下面接触事件启动
          result = check_event_trigger_touch(@x, @y+1)
          # 没有事件的情况下
          unless result
            # 向左移动
            move_left
          end
        end
      end
    end
然后把这个分歧结构作为一个elsif条件整合到前面的部分中,完整的"向左下移动"方法(紫色字是新加的脚本):
  #--------------------------------------------------------------------------
  # ● 向左下移动
  #--------------------------------------------------------------------------
  def move_lower_left
    # 没有固定面向的场合
    unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    # 下→左能够通行的情况下
    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
      # 向下移动后向左移动
      move_down
      move_left
    # 左→下能够通行的情况下
    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 向左移动后向下移动
      move_left
      move_down

    # 如果移动的对象是角色且非强制移动
    elsif self.is_a?(Game_Player) and not @move_route_forcing
      # 面向左时
      if @direction = 4
        # 左方可以通行时
        if passable(@x, @y, 4)
          # 向左移动
          move_left
        # 不能通行时
        else
          # 左面接触事件启动
          result = check_event_trigger_touch(@x-1, @y)
          # 没有事件的情况下
          unless result
            # 向下移动
            move_down
          end
        end
      # 不面向左时
      else
        # 下方可以通行时
        if passable(@x, @y, 2)
          # 向下移动
          move_down
        # 不能通行时
        else
          # 下面接触事件启动
          result = check_event_trigger_touch(@x, @y+1)
          # 没有事件的情况下
          unless result
            # 向左移动
            move_left
          end
        end
      end

    end
  end
这样就完成了一个有手感加强的"向左下移动"的方法,对于"向右下移动","向左上移动","向右上移动",只要调整几个方向的参数,照着上例修改一下就行了.
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22431
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

2
 楼主| 发表于 2005-10-22 04:35:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
八方向走,如果只是要实现功能的话,实在是非常简单:
事件方法:打开一个开关,并行处理公共事件
如果方向键上按下
  如果方向键左按下
    左上移动
    等待移动结束
  除此以外的情况
    如果方向键右按下
      右上移动
      等待移动结束
    除此以外的情况
      向上移动
      等待移动结束
    分歧结束
  分歧结束
除此以外的情况
  如果方向键下按下
    如果方向键左按下
      左下移动
      等待移动结束
    除此以外的情况
      如果方向键右按下
        右下移动
        等待移动结束
      除此以外的情况
        向下移动
        等待移动结束
      分歧结束
    分歧结束
  除此以外的情况
    如果方向键左按下
      向左移动
      等待移动结束
    除此以外的情况
      如果方向键右按下
        向右移动
        等待移动结束
      分歧结束
    分歧结束
  分歧结束
分歧结束

用脚本的话,更加简单:
定位RGSS Game_Player,第208行:
      # 如果方向键被按下、主角就朝那个方向移动
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
修改为:
      # 如果方向键被按下、主角就朝那个方向移动
      case Input.dir8
      when 1
        move_lower_left
      when 2
        move_down
      when 3
        move_lower_right
      when 4
        move_left
      when 6
        move_right
      when 7
        move_upper_left
      when 8
        move_up
      when 9
        move_upper_right
      end
存盘后就可以实现八方向走了.
如果你只是想实现八方向走的功能(像黑暗圣剑那样),就到此为止,如果还有兴趣则继续往下看:

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

Game_Character 3 第101行
  #--------------------------------------------------------------------------
  # ● 向左下移动
  #--------------------------------------------------------------------------
  def move_lower_left
    # 没有固定面向的场合
    unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    end
  end
首先解决问题2:
八方向的通行判定是双路径并行,之间是或的关系,如果改成与的关系,就能实现只要两条路径中有一条走不通,斜方向就走不起来.
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
这样虽说是可以了,但是,也不能说一条走不通就不让动啊,所以还需要分别判定两个方向的路径:
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    # 下→左能够通行的情况下
    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
      # 向下移动后向左移动
      move_down
      move_left
    # 左→下能够通行的情况下
    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 向左移动后向下移动
      move_left
      move_down

    end

然后来解决比较复杂的问题1:
首先,对于这个智能判定前进方向的功能,原来的方法里是没有的,为了不影响事件里设置好的移动路线在执行时出现问题,必须加上判定,令其只对角色的按键移动有效.
一种方法是条件分歧 if self.is_a?(Game_Player)来判断类型,这样条件里的功能就只对角色有效,对NPC无效了,不过,还是不能判断角色的移动是事件设定移动还是按键移动,所以再加一个条件and not @move_route_forcing,这样事件设定里的角色移动便不会执行这个分歧的功能.
分歧里面的操作是: 首先判定角色朝向,如果向左,则以向左方前进为优先,不能移动时启动左方接触事件,没有事件时向下方移动;否则以向下方前进为优先,不能移动时启动下方接触事件,没有事件时向左方移动.
    # 如果移动的对象是角色且非强制移动
    if self.is_a?(Game_Player) and not @move_route_forcing
      # 面向左时
      if @direction = 4
        # 左方可以通行时
        if passable?(@x, @y, 4)
          # 向左移动
          move_left
        # 不能通行时
        else
          # 左面接触事件启动
          result = check_event_trigger_touch(@x-1, @y)
          # 没有事件的情况下
          unless result
            # 向下移动
            move_down
          end
        end
      # 不面向左时
      else
        # 下方可以通行时
        if passable?(@x, @y, 2)
          # 向下移动
          move_down
        # 不能通行时
        else
          # 下面接触事件启动
          result = check_event_trigger_touch(@x, @y+1)
          # 没有事件的情况下
          unless result
            # 向左移动
            move_left
          end
        end
      end
    end
然后把这个分歧结构作为一个elsif条件整合到前面的部分中,完整的"向左下移动"方法(紫色字是新加的脚本):
  #--------------------------------------------------------------------------
  # ● 向左下移动
  #--------------------------------------------------------------------------
  def move_lower_left
    # 没有固定面向的场合
    unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 下→左、左→下 的通道可以通行的情况下
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 更新坐标
      @x -= 1
      @y += 1
      # 增加步数
      increase_steps
    # 下→左能够通行的情况下
    elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
      # 向下移动后向左移动
      move_down
      move_left
    # 左→下能够通行的情况下
    elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 向左移动后向下移动
      move_left
      move_down

    # 如果移动的对象是角色且非强制移动
    elsif self.is_a?(Game_Player) and not @move_route_forcing
      # 面向左时
      if @direction = 4
        # 左方可以通行时
        if passable(@x, @y, 4)
          # 向左移动
          move_left
        # 不能通行时
        else
          # 左面接触事件启动
          result = check_event_trigger_touch(@x-1, @y)
          # 没有事件的情况下
          unless result
            # 向下移动
            move_down
          end
        end
      # 不面向左时
      else
        # 下方可以通行时
        if passable(@x, @y, 2)
          # 向下移动
          move_down
        # 不能通行时
        else
          # 下面接触事件启动
          result = check_event_trigger_touch(@x, @y+1)
          # 没有事件的情况下
          unless result
            # 向左移动
            move_left
          end
        end
      end

    end
  end
这样就完成了一个有手感加强的"向左下移动"的方法,对于"向右下移动","向左上移动","向右上移动",只要调整几个方向的参数,照着上例修改一下就行了.
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv2.观梦者

梦石
0
星屑
910
在线时间
94 小时
注册时间
2005-10-22
帖子
397
3
发表于 2005-10-22 06:02:09 | 只看该作者
{/ll}太感动了。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
5 小时
注册时间
2005-10-22
帖子
907
4
发表于 2005-10-22 07:36:05 | 只看该作者
用事件的话只要定义四个斜方向就行了,上下左右不用定义
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
5 小时
注册时间
2005-10-22
帖子
907
5
发表于 2005-10-22 08:18:51 | 只看该作者
刚才试了一下,用事件实现了楼主说的手感,只要一个方向能通行就不会停止不动,不过方法挺烦琐的,但对于我这种不太会RGSS的人来说,也只能想出这种办法了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

6
发表于 2005-10-22 12:30:14 | 只看该作者
我也给发布出来吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 14:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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