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

Project1

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

完善斜行4方向 V1.0版

 关闭 [复制链接]

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
跳转到指定楼层
1
发表于 2008-4-19 19:16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
■ 完善斜行4方向 V1.0版
(原帖:伪●角色斜行4方向脚本http://rpg.blue/viewthread.php?tid=83703)
本脚本已针对以下做了修改:
斜行触发
斜行前进一步
斜行后退一步
斜行随机移动
斜方向面向主角
斜方向背向主角

本脚本尚未修改的地方:
斜行接近主角
斜行远离主角

斜行4方向的角色行走图素材规格方向定义:

(箭头方向为角色面向的方向)

把以下脚本貼在Main前面即可
  1.  
  2. #==============================================================================
  3. # ■ 完善斜行4方向腳本V1.0 (BY TERENCE龙皇)
  4. #------------------------------------------------------------------------------
  5. #  本腳本已針對以下做了修改:
  6. #--------------------------------------------
  7. #     斜行觸發
  8. #     斜行前進一步
  9. #     斜行後退一步
  10. #     斜行隨機移動
  11. #     斜方向面向主角
  12. #     斜方向背向主角
  13. #==============================================================================
  14. #  本腳本尚未修改的地方:
  15. #--------------------------------------------
  16. #     斜行接近主角
  17. #     斜行遠離主角 
  18. #==============================================================================
  19. class Game_Character
  20.   #--------------------------------------------------------------------------
  21.   # ● 向左下移動
  22.   #--------------------------------------------------------------------------
  23.   def move_lower_left(turn_enabled = true)
  24.     unless @direction_fix
  25.       turn_down
  26.     end
  27.     # 下→左、左→下 的通道可以通行的情況下
  28.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
  29.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
  30.       # 更新座標
  31.       @x -= 1
  32.       @y += 1
  33.       # 增加步數
  34.       increase_steps
  35.     else
  36.       check_event_trigger_touch(@x-1, @y+1)
  37.     end
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 向右下移動
  41.   #--------------------------------------------------------------------------
  42.   def move_lower_right(turn_enabled = true)
  43.     unless @direction_fix
  44.       turn_right
  45.     end
  46.     # 下→右、右→下 的通道可以通行的情況下
  47.     if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
  48.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
  49.       # 更新座標
  50.       @x += 1
  51.       @y += 1
  52.       # 增加步數
  53.       increase_steps
  54.     else
  55.       check_event_trigger_touch(@x+1, @y+1)
  56.     end
  57.   end
  58.   #--------------------------------------------------------------------------
  59.   # ● 向左上移動
  60.   #--------------------------------------------------------------------------
  61.   def move_upper_left(turn_enabled = true)
  62.     unless @direction_fix
  63.       turn_left
  64.     end
  65.     # 上→左、左→上 的通道可以通行的情況下
  66.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
  67.        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
  68.       # 更新座標
  69.       @x -= 1
  70.       @y -= 1
  71.       # 增加步數
  72.       increase_steps
  73.     else
  74.       check_event_trigger_touch(@x-1, @y-1)
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 向右上移動
  79.   #--------------------------------------------------------------------------
  80.   def move_upper_right(turn_enabled = true)
  81.     unless @direction_fix
  82.       turn_up
  83.     end
  84.     # 上→右、右→上 的通道可以通行的情況下
  85.     if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
  86.        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
  87.       # 更新座標
  88.       @x += 1
  89.       @y -= 1
  90.       # 增加步數
  91.       increase_steps
  92.     else
  93.       check_event_trigger_touch(@x+1, @y-1)
  94.     end
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 隨機移動
  98.   #--------------------------------------------------------------------------
  99.   def move_random
  100.     case rand(4)
  101.     when 0  # 向左下移動
  102.       move_lower_left(false)
  103.     when 1  # 向左上移動
  104.       move_upper_left(false)
  105.     when 2  # 向右下移動
  106.       move_lower_right(false)
  107.     when 3  # 向右上移動
  108.       move_upper_right(false)
  109.     end
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 前進一步
  113.   #--------------------------------------------------------------------------
  114.   def move_forward
  115.     case @direction
  116.     when 2
  117.       move_lower_left(false)
  118.     when 4
  119.       move_upper_left(false)
  120.     when 6
  121.       move_lower_right(false)
  122.     when 8
  123.       move_upper_right(false)
  124.     end
  125.   end
  126.   #--------------------------------------------------------------------------
  127.   # ● 後退一步
  128.   #--------------------------------------------------------------------------
  129.   def move_backward
  130.     # 記憶朝向固定訊息
  131.     last_direction_fix = @direction_fix
  132.     # 強制固定朝向
  133.     @direction_fix = true
  134.     # 朝向分歧
  135.     case @direction
  136.     when 2  # 下
  137.       move_upper_right(false)
  138.     when 4  # 左
  139.       move_lower_right(false)
  140.     when 6  # 右
  141.       move_upper_left(false)
  142.     when 8  # 上
  143.       move_lower_left(false)
  144.     end
  145.     # 還原朝向固定訊息
  146.     @direction_fix = last_direction_fix
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ● 面向主角的方向
  150.   #--------------------------------------------------------------------------
  151.   def turn_toward_player
  152.     # 求得與主角的座標差值
  153.     sx = @x - $game_player.x
  154.     sy = @y - $game_player.y
  155.     # 座標相等的場合下
  156.     if sx == 0 and sy == 0
  157.       return
  158.     end
  159.     if sx < 0 and sy > 0
  160.       turn_up
  161.     elsif sx > 0 and sy > 0
  162.       turn_left
  163.     elsif sx > 0 and sy < 0
  164.       turn_down
  165.     elsif sx < 0 and sy < 0
  166.       turn_right
  167.     end
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● 背向主角的方向
  171.   #--------------------------------------------------------------------------
  172.   def turn_away_from_player
  173.     # 求得與主角的座標差
  174.     sx = @x - $game_player.x
  175.     sy = @y - $game_player.y
  176.     # 座標相等的場合下
  177.     if sx == 0 and sy == 0
  178.       return
  179.     end
  180.     if sx < 0 and sy > 0
  181.       turn_down
  182.     elsif sx > 0 and sy > 0
  183.       turn_right
  184.     elsif sx > 0 and sy < 0
  185.       turn_up
  186.     elsif sx < 0 and sy < 0
  187.       turn_left
  188.     end
  189.   end
  190. end
  191. #==============================================================================
  192. # ■ 正面事件的啟動判定
  193. #------------------------------------------------------------------------------
  194. #  事件啟動的判定。
  195. #  本類別的實例請參考 $game_player。
  196. #==============================================================================
  197. class Game_Player < Game_Character
  198.   def check_event_trigger_there(triggers)
  199.     result = false
  200.     # 事件執行中的情況下
  201.     if $game_system.map_interpreter.running?
  202.       return result
  203.     end
  204.     # 計算正面座標
  205. ##########################################################
  206.     case @direction
  207.      when 2
  208.        new_x = @x-1
  209.        new_y = @y+1
  210.      when 4
  211.        new_x = @x-1
  212.        new_y = @y-1
  213.      when 6
  214.        new_x = @x+1
  215.        new_y = @y+1  
  216.      when 8
  217.        new_x = @x+1
  218.        new_y = @y-1
  219.      end
  220. ##########################################################
  221.     # 全部事件的循環
  222.     for event in $game_map.events.values
  223.       # 事件座標與目標一致的情況下
  224.       if event.x == new_x and event.y == new_y and
  225.          triggers.include?(event.trigger)
  226.         # 跳躍中以外的情況下、啟動判定是正面的事件
  227.         if not event.jumping? and not event.over_trigger?
  228.           event.start
  229.           result = true
  230.         end
  231.       end
  232.     end
  233.     # 找不到符合條件的事件的情況下
  234.     if result == false
  235.       # 正面的元件是計數器的情況下
  236.       if $game_map.counter?(new_x, new_y)
  237.         # 計算 1 元件裡側的座標
  238. ##########################################################
  239.         case @direction
  240.          when 2
  241.            new_x = @x-1
  242.            new_y = @y+1
  243.          when 4
  244.            new_x = @x-1
  245.            new_y = @y-1
  246.          when 6
  247.            new_x = @x+1
  248.            new_y = @y+1  
  249.          when 8
  250.            new_x = @x+1
  251.            new_y = @y-1
  252.          end
  253. ##########################################################
  254.         # 全事件的循環
  255.         for event in $game_map.events.values
  256.           # 事件座標與目標一致的情況下
  257.           if event.x == new_x and event.y == new_y and
  258.              triggers.include?(event.trigger)
  259.             # 跳躍中以外的情況下、啟動判定是正面的事件
  260.             if not event.jumping? and not event.over_trigger?
  261.               event.start
  262.               result = true
  263.             end
  264.           end
  265.         end
  266.       end
  267.     end
  268.     return result
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   # ● 畫面更新
  272.   #--------------------------------------------------------------------------
  273.   def update
  274.     # 本地變數記錄移動訊息
  275.     last_moving = moving?
  276.     # 移動中、事件執行中、強制移動路線中、
  277.     # 訊息視窗一個也不顯示的時候
  278.     unless moving? or $game_system.map_interpreter.running? or
  279.            @move_route_forcing or $game_temp.message_window_showing
  280.       # 如果方向鍵被按下、主角就朝那個方向移動
  281. ######################################################################
  282.      case Input.dir4
  283.       when 2
  284.         move_lower_right
  285.       when 4
  286.         move_lower_left
  287.       when 6
  288.         move_upper_right
  289.       when 8
  290.         move_upper_left
  291.       end
  292. ######################################################################
  293.     end
  294.     # 本地變數記憶座標
  295.     last_real_x = @real_x
  296.     last_real_y = @real_y
  297.     super
  298.     # 角色向下移動、畫面上的位置在中央下方的情況下
  299.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  300.       # 畫面向下捲動
  301.       $game_map.scroll_down(@real_y - last_real_y)
  302.     end
  303.     # 角色向左移動、畫面上的位置在中央左方的情況下
  304.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  305.       # 畫面向左捲動
  306.       $game_map.scroll_left(last_real_x - @real_x)
  307.     end
  308.     # 角色向右移動、畫面上的位置在中央右方的情況下
  309.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  310.       # 畫面向右捲動
  311.       $game_map.scroll_right(@real_x - last_real_x)
  312.     end
  313.     # 角色向上移動、畫面上的位置在中央上方的情況下
  314.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  315.       # 畫面向上捲動
  316.       $game_map.scroll_up(last_real_y - @real_y)
  317.     end
  318.     # 不在移動中的情況下
  319.     unless moving?
  320.       # 上次主角移動中的情況
  321.       if last_moving
  322.         # 與同位置的事件接觸就判定為事件啟動
  323.         result = check_event_trigger_here([1,2])
  324.         # 沒有可以啟動的事件的情況下
  325.         if result == false
  326.           # 偵錯模式為 ON 並且按下 CTRL 鍵的情況下除外
  327.           unless $DEBUG and Input.press?(Input::CTRL)
  328.             # 遇敵計數下降
  329.             if @encounter_count > 0
  330.               @encounter_count -= 1
  331.             end
  332.           end
  333.         end
  334.       end
  335.       # 按下 C 鍵的情況下
  336.       if Input.trigger?(Input::C)
  337.         # 判定為同位置以及正面的事件啟動
  338.         check_event_trigger_here([0])
  339.         check_event_trigger_there([0,1,2])
  340.       end
  341.     end
  342.   end
  343. end
复制代码

范例工程:
http://rpg.blue/upload_program/f ... ��V1.0_89032316.rar


本人第一次在这里发布原创脚本,如果脚本有什么错误,希望请各位多多指教,
THANKS!!

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
2
发表于 2008-4-19 21:03:28 | 只看该作者
想了一下,梦幻单机好像是这个样 - -
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3304
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2008-4-19 21:07:26 | 只看该作者
一般要用斜方向的话就直接用八方向了。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
4
 楼主| 发表于 2008-4-19 21:22:06 | 只看该作者
以下引用越前リョーマ于2008-4-19 13:07:26的发言:

一般要用斜方向的话就直接用八方向了。

因为前几天提问区还蛮多人在问(要求)斜行4方向
所以我就在发布了斜行4方向修改脚本。
江耀 提问:
http://rpg.blue/viewthread.php?t ... 4%2D19+13%3A23%3A12
arms 提问:
http://rpg.blue/viewthread.php?t ... 4%2D19+13%3A24%3A17
towmix 提问:
http://rpg.blue/viewthread.php?t ... 4%2D19+13%3A25%3A41
独孤飞龙 提问:
http://rpg.blue/viewthread.php?t ... 4%2D19+13%3A29%3A25

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-3-3
帖子
85
5
发表于 2008-4-22 01:05:05 | 只看该作者
用了,但npc不能斜四方向行走,可以修正吗?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
6
 楼主| 发表于 2008-4-22 04:16:16 | 只看该作者
以下引用bbhh于2008-4-21 17:05:05的发言:

用了,但npc不能斜四方向行走,可以修正吗?

再设定NPC移动路线时,要用
向左上移动
向右上移动
向左下移动
向右下移动

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2008-5-3
帖子
6
7
发表于 2008-7-19 16:58:59 | 只看该作者
谢谢 各位了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
8
 楼主| 发表于 2008-7-20 00:00:56 | 只看该作者
以下引用逍遥V白龙于2008-7-19 8:58:59的发言:

谢谢 各位了

这么老旧的帖被你顶出来了= =
竟然被顶就说明一下好了"纯斜行4方向的缺点"


以下图为例,
假设红点是角色目前的位置,
当你斜行的时候你将会发现有些格子是到不了的。
(绿色代表可以红点角色可行走到的地方)

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-26 16:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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