Project1

标题: 如何实现【真·横版】的行走效果? [打印本页]

作者: 月下耶鲁夫    时间: 2012-12-13 16:48
标题: 如何实现【真·横版】的行走效果?
本帖最后由 月下耶鲁夫 于 2012-12-27 16:23 编辑

用RMXP默认的行走图规格,向下移动的时候他的脸的朝向一定是按照布局图片时的规格来的,
而实际上应该是按照 向下移动前是朝什么方向 向下移动就是什么方向 避免出现 脸朝右,而移动的时候脸确实超左的情况。
但是我不知道RMXP该如何实现,求大神指导下。
作者: 羞射了    时间: 2012-12-13 17:16
Game_Character 3
搜索    # 面向下 和#面向上

比如  #  if turn_enabled
  #    turn_down
  #  end
类似的地方全都注释掉或者删掉就可以了,只保留左右人物转向,上下就不转向了,简单吧?

作者: 月下耶鲁夫    时间: 2012-12-13 18:08
羞射了 发表于 2012-12-13 17:16
Game_Character 3
搜索    # 面向下 和#面向上




是像这样吗?我改了之后去游戏里测试还是没用。



这是素材规格,然后不知道是不是和工程里面的伪8方向行走有联系?
作者: 羞射了    时间: 2012-12-13 19:07
月下耶鲁夫 发表于 2012-12-13 18:08
是像这样吗?我改了之后去游戏里测试还是没用。

应该有关系吧,那个脚本也涉及到相关的修改,你可以全局搜索一下。
作者: 羞射了    时间: 2012-12-13 20:41
    # 没有固定面向的场合
  #  unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  #    @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  #  end

这样的也要找出来注释掉,这是斜走的判定。总之原理就是让改变行走图方向的脚本失效。你说没用肯定是哪里还在生效。
作者: 月下耶鲁夫    时间: 2012-12-13 23:16
羞射了 发表于 2012-12-13 20:41
# 没有固定面向的场合
  #  unless @direction_fix
      # 朝向是右的情况下适合的面是左面、朝向是上 ...

依然不行呀……
作者: j433463    时间: 2012-12-14 06:22
有一个方法,不要去动脚本,而是把行走图做成两张不同方向的,一张全部朝左,一张全部朝右。



然后用并行公用事件去判断面向左或右:




这样只要按了左向键后,就是使用全部朝左的行走图,按右向键后就是朝右的行走图,
不管按向上或向下键都只会保持朝左或朝右,不会受到影响。

还可以把事件中判断左键右键改成其它键,也就是用某个键切换行走图,
这样就有点类似大型电玩三国的方式,按个键向左,按个键向右,
后退也不会因为按了左右键而改变面向。
作者: j433463    时间: 2012-12-14 06:59
不好意思,忽略了是在 XP 提问区,上面的例子是 vx ace 的版本,
不过事件工程方式其实都是一样的,下面连结是用 XP 做的范例,
未包含默认RTP:

橫版測試.rar (199.93 KB, 下载次数: 23)
作者: 月下耶鲁夫    时间: 2012-12-14 14:09
j433463 发表于 2012-12-14 06:59
不好意思,忽略了是在 XP 提问区,上面的例子是 vx ace 的版本,
不过事件工程方式其实都是一样的,下面连 ...

很感谢您发的这个工程,虽然能够实现横版行走,但是我好像没能看清是怎么实现的?然后进游戏的时候 还是默认的 4方向行走 要去和那个象棋对话才会变成横版行走。
作者: j433463    时间: 2012-12-14 14:35
本帖最后由 j433463 于 2012-12-14 14:43 编辑

这没关系的,因为可以在开新游戏时就把游戏开始开关为ON,
以后存档读档就不用再设置一次,不一定要用事件弄棋子在那,
譬如先进一段片头,然后游戏开始为ON,进入横版场景,
那棋子只是范例为了偷懒方便,省略步骤弄的,
不想再去建个地图,设事件播放片头,再场景转移........
这一个棋子多省事。

作者: 月下耶鲁夫    时间: 2012-12-14 15:34
j433463 发表于 2012-12-14 14:35
这没关系的,因为可以在开新游戏时就把游戏开始开关为ON,
以后存档读档就不用再设置一次,不一定要用事件 ...

其实是我是没看见您是怎么实现横版行走的,没有看见相关的脚本和事件
作者: j433463    时间: 2012-12-14 15:47
本帖最后由 j433463 于 2012-12-14 15:51 编辑

我没有用到脚本,就是用纯事件来做,

范例中,我用了 LF.png 和 LR.png 两个行走图,放在 Characters 目录中。

LF.png 是全部朝左的,LR.png 是全部朝右的,

其它的和最早那个 vx ace 方式是一样的,用公共事件,

当按键 左 被按下时,判断面向,如果面向不等于0,就面向不是向左,就改用 LF.png 行走图,

当按键 右 被按下时,判断面向,如果面向不等于1,就面向不是向右,就改用 LR.png 行走图,

只是这样而已。

因为 LF.png 全部朝左,无论按上或按下,都是朝左的角色图,

而 LR.png 全部朝右,同样无论按上或下,都是朝右的角色图。

所以我只要在按左或按右时判断决定用哪个方向的行走图,

就可以达到保持面向了。
作者: 月下耶鲁夫    时间: 2012-12-14 16:14
j433463 发表于 2012-12-14 15:47
我没有用到脚本,就是用纯事件来做,

范例中,我用了 LF.png 和 LR.png 两个行走图,放在 Characters 目录 ...

但是这个方法貌似只能局部控制 玩家的行走,却无法控制其他类似于NPC事件的吧……
作者: 羞射了    时间: 2012-12-14 16:50
我测试过了,你开个新工程试试。
  1. #==============================================================================
  2. # ■ Game_Character (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  5. # 类的超级类使用。
  6. #==============================================================================

  7. class Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 向下移动
  10.   #     turn_enabled : 本场地位置更改许可标志
  11.   #--------------------------------------------------------------------------
  12.   def move_down(turn_enabled = true)
  13.     # 面向下
  14.    # if turn_enabled
  15.    #   turn_down
  16.   #  end
  17.     # 可以通行的场合
  18.     if passable?(@x, @y, 2)
  19.       # 面向下
  20.    #   turn_down
  21.       # 更新坐标
  22.       @y += 1
  23.       # 增加步数
  24.       increase_steps
  25.     # 不能通行的情况下
  26.     else
  27.       # 接触事件的启动判定
  28.       check_event_trigger_touch(@x, @y+1)
  29.     end
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   # ● 向左移动
  33.   #     turn_enabled : 本场地位置更改许可标志
  34.   #--------------------------------------------------------------------------
  35.   def move_left(turn_enabled = true)
  36.     # 面向左
  37.     if turn_enabled
  38.       turn_left
  39.     end
  40.     # 可以通行的情况下
  41.     if passable?(@x, @y, 4)
  42.       # 面向左
  43.       turn_left
  44.       # 更新坐标
  45.       @x -= 1
  46.       # 增加步数
  47.       increase_steps
  48.     # 不能通行的情况下
  49.     else
  50.       # 接触事件的启动判定
  51.       check_event_trigger_touch(@x-1, @y)
  52.     end
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 向右移动
  56.   #     turn_enabled : 本场地位置更改许可标志
  57.   #--------------------------------------------------------------------------
  58.   def move_right(turn_enabled = true)
  59.     # 面向右
  60.     if turn_enabled
  61.       turn_right
  62.     end
  63.     # 可以通行的场合
  64.     if passable?(@x, @y, 6)
  65.       # 面向右
  66.       turn_right
  67.       # 更新坐标
  68.       @x += 1
  69.       # 增加部数
  70.       increase_steps
  71.     # 不能通行的情况下
  72.     else
  73.       # 接触事件的启动判定
  74.       check_event_trigger_touch(@x+1, @y)
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 向上移动
  79.   #     turn_enabled : 本场地位置更改许可标志
  80.   #--------------------------------------------------------------------------
  81.   def move_up(turn_enabled = true)
  82.     # 面向上
  83.   #  if turn_enabled
  84.   #    turn_up
  85.   #  end
  86.     # 可以通行的情况下
  87.     if passable?(@x, @y, 8)
  88.       # 面向上
  89.     #  turn_up
  90.       # 更新坐标
  91.       @y -= 1
  92.       # 歩数増加
  93.       increase_steps
  94.     # 不能通行的情况下
  95.     else
  96.       # 接触事件的启动判定
  97.       check_event_trigger_touch(@x, @y-1)
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 向左下移动
  102.   #--------------------------------------------------------------------------
  103.   def move_lower_left
  104.     # 没有固定面向的场合
  105.   #  unless @direction_fix
  106.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  107.    #   @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  108.   #  end
  109.     # 下→左、左→下 的通道可以通行的情况下
  110.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
  111.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  112.       # 更新坐标
  113.       @x -= 1
  114.       @y += 1
  115.       # 增加步数
  116.       increase_steps
  117.     end
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 向右下移动
  121.   #--------------------------------------------------------------------------
  122.   def move_lower_right
  123.     # 没有固定面向的场合
  124.    # unless @direction_fix
  125.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  126.    #   @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  127.    # end
  128.     # 下→右、右→下 的通道可以通行的情况下
  129.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
  130.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
  131.       # 更新坐标
  132.       @x += 1
  133.       @y += 1
  134.       # 增加步数
  135.       increase_steps
  136.     end
  137.   end
  138.   #--------------------------------------------------------------------------
  139.   # ● 向左上移动
  140.   #--------------------------------------------------------------------------
  141.   def move_upper_left
  142.     # 没有固定面向的场合
  143.   #  unless @direction_fix
  144.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  145.   #    @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  146.   #  end
  147.     # 上→左、左→上 的通道可以通行的情况下
  148.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
  149.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
  150.       # 更新坐标
  151.       @x -= 1
  152.       @y -= 1
  153.       # 增加步数
  154.       increase_steps
  155.     end
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ● 向右上移动
  159.   #--------------------------------------------------------------------------
  160.   def move_upper_right
  161.     # 没有固定面向的场合
  162.    # unless @direction_fix
  163.       # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
  164.    #   @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  165.    # end
  166.     # 上→右、右→上 的通道可以通行的情况下
  167.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
  168.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
  169.       # 更新坐标
  170.       @x += 1
  171.       @y -= 1
  172.       # 增加步数
  173.       increase_steps
  174.     end
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 随机移动
  178.   #--------------------------------------------------------------------------
  179.   def move_random
  180.     case rand(4)
  181.     when 0  # 向下移动
  182.       move_down(false)
  183.     when 1  # 向左移动
  184.       move_left(false)
  185.     when 2  # 向右移动
  186.       move_right(false)
  187.     when 3  # 向上移动
  188.       move_up(false)
  189.     end
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● 接近主角
  193.   #--------------------------------------------------------------------------
  194.   def move_toward_player
  195.     # 求得与主角的坐标差
  196.     sx = @x - $game_player.x
  197.     sy = @y - $game_player.y
  198.     # 坐标相等情况下
  199.     if sx == 0 and sy == 0
  200.       return
  201.     end
  202.     # 求得差的绝对值
  203.     abs_sx = sx.abs
  204.     abs_sy = sy.abs
  205.     # 横距离与纵距离相等的情况下
  206.     if abs_sx == abs_sy
  207.       # 随机将边数增加 1
  208.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  209.     end
  210.     # 横侧距离长的情况下
  211.     if abs_sx > abs_sy
  212.       # 左右方向优先。向主角移动
  213.       sx > 0 ? move_left : move_right
  214.       if not moving? and sy != 0
  215.         sy > 0 ? move_up : move_down
  216.       end
  217.     # 竖侧距离长的情况下
  218.     else
  219.       # 上下方向优先。向主角移动
  220.       sy > 0 ? move_up : move_down
  221.       if not moving? and sx != 0
  222.         sx > 0 ? move_left : move_right
  223.       end
  224.     end
  225.   end
  226.   #--------------------------------------------------------------------------
  227.   # ● 远离主角
  228.   #--------------------------------------------------------------------------
  229.   def move_away_from_player
  230.     # 求得与主角的坐标差
  231.     sx = @x - $game_player.x
  232.     sy = @y - $game_player.y
  233.     # 坐标相等情况下
  234.     if sx == 0 and sy == 0
  235.       return
  236.     end
  237.     # 求得差的绝对值
  238.     abs_sx = sx.abs
  239.     abs_sy = sy.abs
  240.     # 横距离与纵距离相等的情况下
  241.     if abs_sx == abs_sy
  242.       # 随机将边数增加 1
  243.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  244.     end
  245.     # 横侧距离长的情况下
  246.     if abs_sx > abs_sy
  247.       # 左右方向优先。远离主角移动
  248.       sx > 0 ? move_right : move_left
  249.       if not moving? and sy != 0
  250.         sy > 0 ? move_down : move_up
  251.       end
  252.     # 竖侧距离长的情况下
  253.     else
  254.       # 上下方向优先。远离主角移动
  255.       sy > 0 ? move_down : move_up
  256.       if not moving? and sx != 0
  257.         sx > 0 ? move_right : move_left
  258.       end
  259.     end
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● 前进一步
  263.   #--------------------------------------------------------------------------
  264.   def move_forward
  265.     case @direction
  266.     when 2
  267.       move_down(false)
  268.     when 4
  269.       move_left(false)
  270.     when 6
  271.       move_right(false)
  272.     when 8
  273.       move_up(false)
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 后退一步
  278.   #--------------------------------------------------------------------------
  279.   def move_backward
  280.     # 记忆朝向固定信息
  281.     last_direction_fix = @direction_fix
  282.     # 强制固定朝向
  283.     @direction_fix = true
  284.     # 朝向分支
  285.     case @direction
  286.     when 2  # 下
  287.       move_up(false)
  288.     when 4  # 左
  289.       move_right(false)
  290.     when 6  # 右
  291.       move_left(false)
  292.     when 8  # 上
  293.       move_down(false)
  294.     end
  295.     # 还原朝向固定信息
  296.     @direction_fix = last_direction_fix
  297.   end
  298.   #--------------------------------------------------------------------------
  299.   # ● 跳跃
  300.   #     x_plus : X 坐标增加值
  301.   #     y_plus : Y 坐标增加值
  302.   #--------------------------------------------------------------------------
  303.   def jump(x_plus, y_plus)
  304.     # 增加值不是 (0,0) 的情况下
  305.     if x_plus != 0 or y_plus != 0
  306.       # 横侧距离长的情况下
  307.       if x_plus.abs > y_plus.abs
  308.         # 变更左右方向
  309.         x_plus < 0 ? turn_left : turn_right
  310.       # 竖侧距离长的情况下
  311.       else
  312.         # 变更上下方向
  313.         y_plus < 0 ? turn_up : turn_down
  314.       end
  315.     end
  316.     # 计算新的坐标
  317.     new_x = @x + x_plus
  318.     new_y = @y + y_plus
  319.     # 增加值为 (0,0) 的情况下、跳跃目标可以通行的场合
  320.     if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
  321.       # 矫正姿势
  322.       straighten
  323.       # 更新坐标
  324.       @x = new_x
  325.       @y = new_y
  326.       # 距计算距离
  327.       distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
  328.       # 设置跳跃记数
  329.       @jump_peak = 10 + distance - @move_speed
  330.       @jump_count = @jump_peak * 2
  331.       # 清除停止记数信息
  332.       @stop_count = 0
  333.     end
  334.   end
  335.   #--------------------------------------------------------------------------
  336.   # ● 面向向下
  337.   #--------------------------------------------------------------------------
  338.   def turn_down
  339.     unless @direction_fix
  340.       @direction = 2
  341.       @stop_count = 0
  342.     end
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 面向向左
  346.   #--------------------------------------------------------------------------
  347.   def turn_left
  348.     unless @direction_fix
  349.       @direction = 4
  350.       @stop_count = 0
  351.     end
  352.   end
  353.   #--------------------------------------------------------------------------
  354.   # ● 面向向右
  355.   #--------------------------------------------------------------------------
  356.   def turn_right
  357.     unless @direction_fix
  358.       @direction = 6
  359.       @stop_count = 0
  360.     end
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ● 面向向上
  364.   #--------------------------------------------------------------------------
  365.   def turn_up
  366.     unless @direction_fix
  367.       @direction = 8
  368.       @stop_count = 0
  369.     end
  370.   end
  371.   #--------------------------------------------------------------------------
  372.   # ● 向右旋转 90 度
  373.   #--------------------------------------------------------------------------
  374.   def turn_right_90
  375.     case @direction
  376.     when 2
  377.       turn_left
  378.     when 4
  379.       turn_up
  380.     when 6
  381.       turn_down
  382.     when 8
  383.       turn_right
  384.     end
  385.   end
  386.   #--------------------------------------------------------------------------
  387.   # ● 向左旋转 90 度
  388.   #--------------------------------------------------------------------------
  389.   def turn_left_90
  390.     case @direction
  391.     when 2
  392.       turn_right
  393.     when 4
  394.       turn_down
  395.     when 6
  396.       turn_up
  397.     when 8
  398.       turn_left
  399.     end
  400.   end
  401.   #--------------------------------------------------------------------------
  402.   # ● 旋转 180 度
  403.   #--------------------------------------------------------------------------
  404.   def turn_180
  405.     case @direction
  406.     when 2
  407.       turn_up
  408.     when 4
  409.       turn_right
  410.     when 6
  411.       turn_left
  412.     when 8
  413.       turn_down
  414.     end
  415.   end
  416.   #--------------------------------------------------------------------------
  417.   # ● 从右向左旋转 90 度
  418.   #--------------------------------------------------------------------------
  419.   def turn_right_or_left_90
  420.     if rand(2) == 0
  421.       turn_right_90
  422.     else
  423.       turn_left_90
  424.     end
  425.   end
  426.   #--------------------------------------------------------------------------
  427.   # ● 随机变换方向
  428.   #--------------------------------------------------------------------------
  429.   def turn_random
  430.     case rand(4)
  431.     when 0
  432.       turn_up
  433.     when 1
  434.       turn_right
  435.     when 2
  436.       turn_left
  437.     when 3
  438.       turn_down
  439.     end
  440.   end
  441.   #--------------------------------------------------------------------------
  442.   # ● 接近主角的方向
  443.   #--------------------------------------------------------------------------
  444.   def turn_toward_player
  445.     # 求得与主角的坐标差
  446.     sx = @x - $game_player.x
  447.     sy = @y - $game_player.y
  448.     # 坐标相等的场合下
  449.     if sx == 0 and sy == 0
  450.       return
  451.     end
  452.     # 横侧距离长的情况下
  453.     if sx.abs > sy.abs
  454.       # 将左右方向变更为朝向主角的方向
  455.       sx > 0 ? turn_left : turn_right
  456.     # 竖侧距离长的情况下
  457.     else
  458.       # 将上下方向变更为朝向主角的方向
  459.       sy > 0 ? turn_up : turn_down
  460.     end
  461.   end
  462.   #--------------------------------------------------------------------------
  463.   # ● 背向主角的方向
  464.   #--------------------------------------------------------------------------
  465.   def turn_away_from_player
  466.     # 求得与主角的坐标差
  467.     sx = @x - $game_player.x
  468.     sy = @y - $game_player.y
  469.     # 坐标相等的场合下
  470.     if sx == 0 and sy == 0
  471.       return
  472.     end
  473.     # 横侧距离长的情况下
  474.     if sx.abs > sy.abs
  475.       # 将左右方向变更为背离主角的方向
  476.       sx > 0 ? turn_right : turn_left
  477.     # 竖侧距离长的情况下
  478.     else
  479.       # 将上下方向变更为背离主角的方向
  480.       sy > 0 ? turn_down : turn_up
  481.     end
  482.   end
  483. end
复制代码

作者: 月下耶鲁夫    时间: 2012-12-14 16:56
羞射了 发表于 2012-12-14 16:50
我测试过了,你开个新工程试试。

不知道是不是之前我哪里搞错了,还是羞涩这次改了新的地方?这次总归是完全OK了呀~万分感谢羞涩帮忙 =w=

作者: 羞射了    时间: 2012-12-14 17:18
月下耶鲁夫 发表于 2012-12-14 16:56
不知道是不是之前我哪里搞错了,还是羞涩这次改了新的地方?这次总归是完全OK了呀~万分感谢羞涩帮忙 =w=
...

对话的地方,接触对话是没问题的,如果需要修改横版还能按回车上下对话,请自己搜索“正面事件的启动判定”研究一下吧。




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