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

Project1

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

当遇到不可通行地图元件时

 关闭 [复制链接]

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9448
在线时间
2751 小时
注册时间
2008-9-5
帖子
3544

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

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

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

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

x
    当遇到不可通行地图元件时,角色自行绕路走,用过一些脚本,但是效果不是太好,只是在一些树之类的会绕过,当“撞墙”时就粘在那里不动了。
    总归来说,有没有办法改进一下这个脚本,使角色撞到左右墙时自动随机上下走,
撞到上下墙时自动随机左右走,这样。
#==============================================================================
# 使用方法:
# 1.直接插在MAIN前即可使用
# 2.面对事件不进行自动转向
# 3.对于个别需要自动转向的事件,在该事件的第一页第一行写一句注释"not_npc"(不含引号)
#
#------------------------------------------------------------------------------
class Game_Character
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x : X 坐标
  #     y : Y 坐标
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  #--------------------------------------------------------------------------  
  def passable?(x, y, d)
    #---------------------------
    $isnpc = true
    #---------------------------
    # 求得新的坐标
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    # 坐标在地图以外的情况
    unless $game_map.valid?(new_x, new_y)
      # 不能通行
      return false
    end
    # 穿透是 ON 的情况下
    if @through
      # 可以通行
      return true
    end
    # 移动者的元件无法来到指定方向的情况下
    unless $game_map.passable?(x, y, d, self)
      # 通行不可
      return false
    end
    # 从指定方向不能进入到移动处的元件的情况下
    unless $game_map.passable?(new_x, new_y, 10 - d)
      # 不能通行
      return false
    end
    # 循环全部事件
    for event in $game_map.events.values
      # 事件坐标于移动目标坐标一致的情况下
      if event.x == new_x and event.y == new_y
        # 穿透为 ON
        unless event.through
          # 自己就是事件的情况下
          if self != $game_player
            # 不能通行
            #---------------------------
            $isnpc = false if event.list[0].parameters[0] != "not_npc"
            #---------------------------
            return false
          end
          # 自己是主角、对方的图形是角色的情况下
          if event.character_name != ""
            # 不能通行
            #---------------------------
            $isnpc = false if event.list[0].parameters[0] != "not_npc"
            #---------------------------
            return false
          end
        end
      end
    end
    # 主角的坐标与移动目标坐标一致的情况下
    if $game_player.x == new_x and $game_player.y == new_y
      # 穿透为 ON
      unless $game_player.through
        # 自己的图形是角色的情况下
        if @character_name != ""
          # 不能通行
          return false
        end
      end
    end
    # 可以通行
    return true
  end
  
  #--------------------------------------------------------------------------
  # ● 向下移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_down(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向下
    if turn_enabled
      turn_down
    end
    # 可以通行的场合
    if passable?(@x, @y, 2)
      # 面向下
      turn_down
      # 更新坐标
      @y += 1
      # 增加步数
      increase_steps
    # 不能通行的情况下
    else
      
     #---------------------------
    if $isnpc
      if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
        move_left if direct == 4
        move_right if direct == 6
        if direct == 2 or direct == 8
          randtra = rand(2)
          randtra == 0 ? move_left : move_right
        end
      else
        move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
        move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
      end
    end
    #---------------------------

      # 接触事件的启动判定
      check_event_trigger_touch(@x, @y+1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向左移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_left(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向左
    if turn_enabled
      turn_left
    end
    # 可以通行的情况下
    if passable?(@x, @y, 4)
      # 面向左
      turn_left
      # 更新坐标
      @x -= 1
      # 增加步数
      increase_steps
    # 不能通行的情况下
    else
      
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
        move_up if direct == 8
        move_down if direct == 2
        if direct == 4 or direct == 6
          randtra = rand(2)
          randtra == 0 ? move_up : move_down
        end
      else
        move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
        move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
      end
      end
      #---------------------------
      
      # 接触事件的启动判定
      check_event_trigger_touch(@x-1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向右移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_right(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向右
    if turn_enabled
      turn_right
    end
    # 可以通行的场合
    if passable?(@x, @y, 6)
      # 面向右
      turn_right
      # 更新坐标
      @x += 1
      # 增加部数
      increase_steps
    # 不能通行的情况下
    else
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
        move_up if direct == 8
        move_down if direct == 2
        if direct == 4 or direct == 6
          randtra = rand(2)
          randtra == 0 ? move_up : move_down
        end
      else
        move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
        move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
      end
      end
      #---------------------------
      # 接触事件的启动判定
      check_event_trigger_touch(@x+1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 向上移动
  #     turn_enabled : 本场地位置更改许可标志
  #--------------------------------------------------------------------------
  def move_up(turn_enabled = true)
    #---------------------------
    direct = @direction
    #---------------------------
    # 面向上
    if turn_enabled
      turn_up
    end
    # 可以通行的情况下
    if passable?(@x, @y, 8)
      # 面向上
      turn_up
      # 更新坐标
      @y -= 1
      # 歩数増加
      increase_steps
    # 不能通行的情况下
    else
      #---------------------------
      if $isnpc
      if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
        move_left if direct == 4
        move_right if direct == 6
        if direct == 2 or direct == 8
          randtra = rand(2)
          randtra == 0 ? move_left : move_right
        end
      else
        move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
        move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
      end
      end
      #---------------------------
      # 接触事件的启动判定
      check_event_trigger_touch(@x, @y-1)
    end
  end
end


此贴于 2008-10-27 12:43:53 被版主darkten提醒,请楼主看到后对本贴做出回应。
此贴于 2008-10-28 15:00:47 被版主darkten提醒,请楼主看到后对本贴做出回应。
此贴于 2008-11-1 13:17:32 被版主darkten提醒,请楼主看到后对本贴做出回应。
版务信息:本贴由楼主自主结贴~
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-6-9
帖子
220
2
发表于 2008-10-26 19:02:22 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

3
发表于 2008-10-26 20:27:22 | 只看该作者
问题就是楼主在用自动寻路脚本,用事件做太难了。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
18
4
发表于 2008-10-26 20:54:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-6-9
帖子
220
5
发表于 2008-10-26 22:03:22 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

6
发表于 2008-10-26 22:10:53 | 只看该作者
事件多了话也会比较卡吧……
我以前因为这个焦头烂额死了……
不过如果真的想用事件做的话可能会麻烦点。
提示:地形标志来判断你的障碍类型。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-6-9
帖子
220
7
发表于 2008-10-26 22:16:38 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

8
发表于 2008-10-26 22:17:30 | 只看该作者
我的游戏里一直都在用防卡脚本。但是只要大于100x100的地图肯定会卡死。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-6-9
帖子
220
9
发表于 2008-10-26 22:29:39 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
10
发表于 2008-10-26 23:43:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-22 13:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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