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

Project1

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

《全方向移动》

 关闭 [复制链接]

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

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

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

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

x
功能:
八方向以及遇障碍物自动偏向。


脚本:
  1. #==============================================================================
  2. # ■ 全方向移动
  3. #==============================================================================

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

  218. end  
复制代码


范例:
http://rpg.blue/upload_program/d ... 81011_104188782.rar

截图:(注意红圈内的移动方式)
纵然千里外,我等雁归来。

Lv1.梦旅人

敌敌畏

梦石
0
星屑
80
在线时间
52 小时
注册时间
2008-5-12
帖子
1748
2
发表于 2008-10-12 05:42:23 | 只看该作者
  def all_move_lower_right
    unless @direction_fix
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
       (passable?(@x+1, @y) and passable?(@x+1, @y+1))
      @x += 1
      @y += 1
      increase_steps
      @move_failed = false
    else
      @move_failed = true
    end
  end
感覺側向的一定不應該是x+1y+1,累加起來是移動了1.414。看起來會失去立體感
0.7,0.7還差不多
故國這樣接觸判斷什么的就麻煩了……
1:1
缺點就是在人物移動的快或者人物比較小的時候會比較明顯
優點
不會遇到事件決出和同行度判定問題

回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

3
 楼主| 发表于 2008-10-12 05:45:08 | 只看该作者
以下引用偶尔杀人越货于2008-10-11 21:42:23的发言:


def all_move_lower_right
   unless @direction_fix
     @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
   end
   if (passable?(@x, @y+1) and passable?(@x+1, @y+1)) or
      (passable?(@x+1, @y) and passable?(@x+1, @y+1))
     @x += 1
     @y += 1
     increase_steps
     @move_failed = false
   else
     @move_failed = true
   end
end
感覺側向的一定不應該是x+1y+1,累加起來是移動了1.414。看起來會失去立體感
0.7,0.7還差不多


恩,我试了一下GBA的《鬼眼狂刀》,《守护英雄》以及SFC的《天地创造》,斜方向都是1,1,只是降低了移动速度,不过这点暂时不是大的问题,后期可能会对地图进行改造,暂时先这样。
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

敌敌畏

梦石
0
星屑
80
在线时间
52 小时
注册时间
2008-5-12
帖子
1748
4
发表于 2008-10-12 06:00:55 | 只看该作者
順帶提一句
使用x+1,y+0.6,斜向時累計+0.7的視覺效果比較好
不過在平面游戲這些都可以忽略
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

5
 楼主| 发表于 2008-10-12 06:04:08 | 只看该作者
1:1
缺點就是在人物移動的快或者人物比較小的時候會比較明顯
優點
不會遇到事件決出和同行度判定問題


呵呵,手感方面参考的是这个游戏,仔细测试,会发现他的地图设置存在很多取巧之处,RM模仿时,限制较多。

纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-8
帖子
466
6
发表于 2008-10-12 06:08:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

7
 楼主| 发表于 2008-10-12 06:12:32 | 只看该作者
以下引用kissye于2008-10-11 22:08:52的发言:

那个,报告一下fps
最低24,最高45左右
不过我的电脑是很差,泪>_<


……不至于吧,
为降低消耗,甚至整合一部分方法,运算效率几乎与默认相同,

我一直是60— —
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-8
帖子
466
8
发表于 2008-10-12 06:37:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

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

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

9
发表于 2008-10-12 07:21:48 | 只看该作者
又是个高级功能……
拜膜一下。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
879 小时
注册时间
2006-2-10
帖子
507
10
发表于 2008-10-12 09:19:11 | 只看该作者
好东西要顶,希望能支持像xp那样的八方向行走图。
东南西北皆无路,只缘身在此坑中
填坑更比挖坑难,一坑还比一坑深
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 13:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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