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

Project1

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

[已经解决] 怎样制作“横向地图画面”的系统?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
237 小时
注册时间
2011-1-20
帖子
261
跳转到指定楼层
1
发表于 2011-6-1 21:21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我想制作一个横向地图画面的脚本,但找不到可以参考的脚本,有这个脚本的大大们可以给个我吗?谢谢了!!!
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
22 小时
注册时间
2011-5-8
帖子
62
2
发表于 2011-6-2 12:19:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
237 小时
注册时间
2011-1-20
帖子
261
3
 楼主| 发表于 2011-6-2 12:24:29 | 只看该作者
天空坠落 发表于 2011-6-2 12:19
神马意思?

就像雨血2烨城的游戏画面一样的。横版的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
44 小时
注册时间
2008-4-1
帖子
51
4
发表于 2011-6-2 13:48:45 手机端发表。 | 只看该作者
玩过最早用RM做的横版游戏,热血物语。哈哈…古董吧!
最近不在有事联系QQ:525958086
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
237 小时
注册时间
2011-1-20
帖子
261
5
 楼主| 发表于 2011-6-3 11:52:48 | 只看该作者
以前在6R里下载过一个,但是现在找不到了……那个脚本好像冒险岛的画面一样的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
162
在线时间
246 小时
注册时间
2010-9-18
帖子
36
6
发表于 2011-6-4 10:55:48 | 只看该作者
搜尋「重力」呀~
在沒有的話我在給你

评分

参与人数 1星屑 +200 梦石 +2 收起 理由
「旅」 + 200 + 2

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
78 小时
注册时间
2011-2-11
帖子
20
7
发表于 2011-6-26 06:20:17 | 只看该作者
我给你
=begin
====================================================================
重力状态:(在每个地图都要设置一下,"并行处理")
$ud_ok = false     
$airjump = 1
====================================================================
解除重力:(在我的这个游戏里用于爬楼梯)
$ud_ok = true
=end
#==============================================================================
# 本脚本来自奇兵RPG,使用和转载请保留此信息
#==============================================================================
$ud_ok = true     
$airjump = 1
# ————————————————————————————————————
# 全方向ドット移動 Ver ε
# 配布元?サポートURL
# http://members.jcom.home.ne.jp/cogwheel/

#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
# 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 定数
  #--------------------------------------------------------------------------
  UP    = 48                  # 上方向の余裕(0 < UP < 63)
  DOWN  = 16                  # 下方向の余裕(0 < DOWN <63)
  SIDE  = 32                  # 左右方向の余裕(0 < SIDE <63)
  SLANT = true              # 移動ルートの斜め移動時、速度修正
  JUMPMAX = 70              
  JUMPADD = 10              
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :event                    # イベント時移動速度
  attr_accessor :move_speed               # 移動速度
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias :update_original :update
  def update
    # @walk:歩行速度 @dash:ダッシュ時移動速度
    # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
    @walk  = 4
    @dash  = 5
    @event = 4
    @dot_m = true
    #ダッシュ機能。エンターキーが押されている間、移動速度を変更する。
    unless moving? or $game_system.map_interpreter.running? or
            @move_route_forcing or $game_temp.message_window_showing
      if @walk != @dash
        if Input.press?(Input::C)
          if @move_speed != @dash
            @move_speed = @dash
          end
        else
          if @move_speed != @walk
            @move_speed = @walk
          end
        end
      end
    end
    if @revise_x == nil and @revise_y == nil
      @revise_x = 0
      @revise_y = 0
    end
    unless @dot_m
      update_original
      return
    end
    if @move_route_forcing
      # ローカル変数に移動中かどうかを記憶
      last_moving = moving?
      # ローカル変数に座標を記憶
      last_real_x = @real_x
      last_real_y = @real_y
      # 座標がずれている場合
      if (@revise_x != 0 or @revise_y != 0) and not jumping? and @move == true
        if @revise_x != @real_x - @x * 128 or @revise_y != @real_y - @y * 128
          @revise_x = @real_x - @x * 128
          @revise_y = @real_y - @y * 128
        end
        # 移動距離distance1と目標距離distance2を設定
        distance1 = 2 ** @move_speed
        distance2 = Math.sqrt(@revise_x ** 2 + @revise_y ** 2)
        # 移動距離が目標距離を越えた場合
        if distance1 > distance2
          # 強制的に補正座標を零にする
          @real_x = @real_x - @revise_x
          @real_y = @real_y - @revise_y
          @revise_x = 0
          @revise_y = 0
          anime_update
        # 移動距離が目標距離に達しない場合
        else
          # 移動距離分目標距離に近づく
          @real_x -= (distance1 * @revise_x / distance2).round
          @real_y -= (distance1 * @revise_y / distance2).round
          @revise_x = @real_x - @x * 128
          @revise_y = @real_y - @y * 128
          anime_update
        end
      else
        super
      end
    else
      @move = false
      # 移動中、イベント実行中、移動ルート強制中、
      # メッセージウィンドウ表示中のいずれでもない場合
      unless moving? or $game_system.map_interpreter.running? or
             @move_route_forcing or $game_temp.message_window_showing
        @event_run = false
        # 方向ボタンが押されていれば、その方向へプレイヤーを移動
#---------------------------上下失效-----------------------------------------
      case Input.dir8
        when 1
          $ud_ok ? move_lower_left_p : move_left_p
        when 2
#          $ud_ok ? move_down_p : move_down_aaaagq
          move_down_p if $ud_ok
        when 3
         $ud_ok ? move_lower_right_p : move_right_p
        when 4
          move_left_p
        when 6
          move_right_p
        when 7
         $ud_ok ? move_upper_left_p : move_left_p
        when 8
#         $ud_ok ? move_up_p : move_up_aaaagq
         move_up_p if $ud_ok
        when 9
         $ud_ok ? move_upper_right_p : move_right_p
        end
      end
      # ローカル変数に座標を記憶
      last_real_x = @real_x
      last_real_y = @real_y
      # 移動処理
      @real_x = @x * 128 + @revise_x
      @real_y = @y * 128 + @revise_y
      # ローカル変数に移動中かどうかを記憶
      last_moving = moving?
      # 座標更新
      move_on
      # 現在の座標と以前の座標が異なる場合
      if (last_real_x != @real_x or last_real_y != @real_y)
        @move_distance = 0 if @move_distance == nil
        @move_distance += Math.sqrt((last_real_x - @real_x) ** 2 +
                                      (last_real_y - @real_y) ** 2)
        if @move_distance >= 128
          @move_distance %= 128
          increase_steps
        end
        # アニメーションを更新
        anime_update
      else
        @pattern = 0
      end
    end
    # キャラクターが下に移動し、かつ画面上の位置が中央より下の場合
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      # マップを下にスクロール
      $game_map.scroll_down(@real_y - last_real_y)
    end
    # キャラクターが左に移動し、かつ画面上の位置が中央より左の場合
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      # マップを左にスクロール
      $game_map.scroll_left(last_real_x - @real_x)
    end
    # キャラクターが右に移動し、かつ画面上の位置が中央より右の場合
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      # マップを右にスクロール
      $game_map.scroll_right(@real_x - last_real_x)
    end
    # キャラクターが上に移動し、かつ画面上の位置が中央より上の場合
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      # マップを上にスクロール
      $game_map.scroll_up(last_real_y - @real_y)
    end
    # 前回プレイヤーが移動中だった場合
    if last_moving
      # 同位置のイベントとの接触によるイベント起動判定
      result = check_event_trigger_here([1,2])
      if result == true
        if (last_real_x / 128.0).round != @x and
            (last_real_y / 128.0).round != @y
          if @direction == 2 or @direction == 8
            if (last_real_x / 128.0).round > @x
              turn_left
            else
              turn_right
            end
          else
            if (last_real_y / 128.0).round > @y
              turn_up
            else
              turn_down
            end
          end
        elsif (last_real_x / 128.0).round > @x
          turn_left
        elsif (last_real_x / 128.0).round < @x
          turn_right
        elsif (last_real_y / 128.0).round > @y
          turn_up
        elsif (last_real_y / 128.0).round < @y
          turn_down
        end
      end
      # 起動したイベントがない場合
      if result == false
        # デバッグモードが ON かつ CTRL キーが押されている場合を除き
        unless $DEBUG and Input.press?(Input::CTRL)
          # エンカウント カウントダウン
          if @encounter_count > 0
            @encounter_count -= 1
          end
        end
      end
    end
#-----------------------按跳跃-----------------------------------------------
# A ボタンが押された場合
    if Input.press?(Input::A) and not $ud_ok
      @twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, 5, true)
      if (not @apassed) and @twojump <= $airjump
        @apassed = true
        @jumpnow = JUMPMAX
        @twojump += 1
      else
        @jumpnow += 3        
      end
    else
      @apassed = false
    end
#----------------------自由落体--------------------------------
    if not $ud_ok
      @jumpnow -= 10
      if @jumpnow < 0
        @jumpnow = [@jumpnow, -JUMPMAX].max
        if not down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
          @jumpnow = 0
          @twojump = 0
        end
      elsif @jumpnow > 0
        @jumpnow = [@jumpnow, JUMPMAX].min
        if not up1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
          @jumpnow = 0
        end
      end
    end
    if Input.trigger?(Input::C)
      # 同位置および正面のイベント起動判定
      check_event_trigger_here([0])
      check_event_trigger_there([0,1,2])
    end
  end
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @jumpnow = 0
    @twojump = 0
    @apassed = false
    @revise_x = 0
    @revise_y = 0
    @move == false
    super
  end
  #--------------------------------------------------------------------------
  # ● 移動判定
  #--------------------------------------------------------------------------
  def moving?
    unless @dot_m
      result = super
      return result
    end
    # 強制移動の場合オリジナルの判定をさせる
    if @move_route_forcing
      if @move == false
        return false
      end
      super
    # 通常時は現座標が実座標と異なる場合のみ移動中と判定
    else
      return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動判定
  #--------------------------------------------------------------------------
  def moving_a?
    if @move == false
      if (@move_route.list[@move_route_index].code <= 14 or
          @move_route.list[@move_route_index].code == 25)
        @move = true
      end
      return false
    end
    moving?
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ジャンプ)
  #--------------------------------------------------------------------------
  def update_jump
    # ジャンプカウントを 1 減らす
    @jump_count -= 1
    # 新しい座標を計算
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    if @jump_count == 0
      @revise_x = 0
      @revise_y = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動タイプ : カスタム
  #--------------------------------------------------------------------------
  def move_type_custom
    unless @dot_m
      super
      return
    end
    # 停止中でなければ中断
    if jumping? or moving_a?
      return
    end
    # 移動コマンドのリストの最後に到達するまでループ
    while @move_route_index < @move_route.list.size
      # 移動コマンドを取得
      command = @move_route.list[@move_route_index]
      # コマンドコード 0 番 (リストの最後) の場合
      if command.code == 0
        # オプション [動作を繰り返す] が ON の場合
        if @move_route.repeat
          # 移動ルートのインデックスを最初に戻す
          @move_route_index = 0
        end
        # オプション [動作を繰り返す] が OFF の場合
        unless @move_route.repeat
          # 移動ルート強制中の場合
          if @move_route_forcing and not @move_route.repeat
            # 移動ルートの強制を解除
            @move_route_forcing = false
            # オリジナルの移動ルートを復帰
            @move_route = @original_move_route
            @move_route_index = @original_move_route_index
            @original_move_route = nil
          end
          # 停止カウントをクリア
          @stop_count = 0
        end
        return
      end
      # 移動系コマンド (下に移動~ジャンプ) の場合
      if command.code <= 14
        # コマンドコードで分岐
        case command.code
        when 1  # 下に移動
          move_down
        when 2  # 左に移動
          move_left
        when 3  # 右に移動
          move_right
        when 4  # 上に移動
          move_up
        when 5  # 左下に移動
          move_lower_left
        when 6  # 右下に移動
          move_lower_right
        when 7  # 左上に移動
          move_upper_left
        when 8  # 右上に移動
          move_upper_right
        when 9  # ランダムに移動
          move_random
        when 10  # プレイヤーに近づく
          move_toward_player
        when 11  # プレイヤーから遠ざかる
          move_away_from_player
        when 12  # 一歩前進
          move_forward
        when 13  # 一歩後退
          move_backward
        when 14  # ジャンプ
          jump(command.parameters[0], command.parameters[1])
        end
        # オプション [移動できない場合は無視] が OFF で、移動失敗の場合
        if not @move_route.skippable and not moving? and not jumping?
          return
        end
        @move_route_index += 1
        return
      end
      # ウェイトの場合
      if command.code == 15
        # ウェイトカウントを設定
        @wait_count = command.parameters[0] * 2 - 1
        @move_route_index += 1
        return
      end
      # 向き変更系のコマンドの場合
      if command.code >= 16 and command.code <= 26
        # コマンドコードで分岐
        case command.code
        when 16  # 下を向く
          turn_down
        when 17  # 左を向く
          turn_left
        when 18  # 右を向く
          turn_right
        when 19  # 上を向く
          turn_up
        when 20  # 右に 90 度回転
          turn_right_90
        when 21  # 左に 90 度回転
          turn_left_90
        when 22  # 180 度回転
          turn_180
        when 23  # 右か左に 90 度回転
          turn_right_or_left_90
        when 24  # ランダムに方向転換
          turn_random
        when 25  # プレイヤーの方を向く
          turn_toward_player
        when 26  # プレイヤーの逆を向く
          turn_away_from_player
        end
        @move_route_index += 1
        return
      end
      # その他のコマンドの場合
      if command.code >= 27
        # コマンドコードで分岐
        case command.code
        when 27  # スイッチ ON
          $game_switches[command.parameters[0]] = true
          $game_map.need_refresh = true
        when 28  # スイッチ OFF
          $game_switches[command.parameters[0]] = false
          $game_map.need_refresh = true
        when 29  # 移動速度の変更
          @move_speed = command.parameters[0]
        when 30  # 移動頻度の変更
          @move_frequency = command.parameters[0]
        when 31  # 移動時アニメ ON
          @walk_anime = true
        when 32  # 移動時アニメ OFF
          @walk_anime = false
        when 33  # 停止時アニメ ON
          @step_anime = true
        when 34  # 停止時アニメ OFF
          @step_anime = false
        when 35  # 向き固定 ON
          @direction_fix = true
        when 36  # 向き固定 OFF
          @direction_fix = false
        when 37  # すり抜け ON
          @through = true
        when 38  # すり抜け OFF
          @through = false
        when 39  # 最前面に表示 ON
          @always_on_top = true
        when 40  # 最前面に表示 OFF
          @always_on_top = false
        when 41  # グラフィック変更
          @tile_id = 0
          @character_name = command.parameters[0]
          @character_hue = command.parameters[1]
          if @original_direction != command.parameters[2]
            @direction = command.parameters[2]
            @original_direction = @direction
            @prelock_direction = 0
          end
          if @original_pattern != command.parameters[3]
            @pattern = command.parameters[3]
            @original_pattern = @pattern
          end
        when 42  # 不透明度の変更
          @opacity = command.parameters[0]
        when 43  # 合成方法の変更
          @blend_type = command.parameters[0]
        when 44  # SE の演奏
          $game_system.se_play(command.parameters[0])
        when 45  # スクリプト
          result = eval(command.parameters[0])
        end
        @move_route_index += 1
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 下に移動
  #--------------------------------------------------------------------------
  def move_down_p
    # 下を向く
    turn_down
    # 移動距離を算出
    distance = 2 ** @move_speed
    down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  def move_down_aaaagq
    distance = 2 ** @move_speed
    down1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 下に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def down1(x, y, distance, down = false)
    result = down2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x, y+1)
      return result
    end
    if @revise_x < -SIDE
      result = down2(x, y + 1, distance, 4)
      result &= down2(x - 1, y, distance)
      if result == false
        if down
          move_lower_right_p
          if @revise_x > SIDE
            @revise_x = SIDE
          end
        end
        return result
      end
    elsif @revise_x > SIDE
      result = down2(x, y + 1, distance, 6)
      result &= down2(x + 1, y, distance)
      if result == false
        if down
          move_lower_left_p
          if @revise_x < -SIDE
            @revise_x = -SIDE
          end
        end
        return result
      end
    end
    # 下に移動可能ならば距離分移動
    @revise_y += distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 下に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def down2(x, y, distance, d = 2)
    if @revise_y + distance > DOWN
      unless passable?(x, y, d)
        if @revise_y < DOWN
          @revise_y = DOWN
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 左に移動
  #--------------------------------------------------------------------------
  def move_left_p
    # 左を向く
    turn_left
    distance = 2 ** @move_speed
    left1(((@x * 128 + @revise_x) / 128.0).round,
          ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 左に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def left1(x, y, distance, left = false)
    result = left2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x-1, y)
      return result
    end
    if @revise_y < -UP and $ud_ok
      result = left2(x - 1, y, distance, 8)
      result &= left2(x, y - 1, distance)
      if result == false
        if left
          move_lower_left_p
          if @revise_y > DOWN
            @revise_y = DOWN
          end
        end
        return result
      end
    elsif @revise_y > DOWN and $ud_ok
      result = left2(x - 1, y, distance, 2)
      result &= left2(x, y + 1, distance)
      if result == false
        if left
          move_upper_left_p
          if @revise_y < -UP
            @revise_y = -UP
          end
        end
        return result
      end
    end
    @revise_x -= distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 左に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def left2(x, y, distance, d = 4)
    if @revise_x - distance < -SIDE
      unless passable?(x, y, d)
        if @revise_x > -SIDE
          @revise_x = -SIDE
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 右に移動
  #--------------------------------------------------------------------------
  def move_right_p
      # 右を向く
      turn_right
    distance = 2 ** @move_speed
    right1(((@x * 128 + @revise_x) / 128.0).round,
            ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 右に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def right1(x, y, distance, right = false)
    result = right2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x+1, y)
      return result
    end
    if @revise_y < -UP and $ud_ok
      result = right2(x + 1, y, distance, 8)
      result &= right2(x, y - 1, distance)
      if result == false
        if right
          move_lower_right_p
          if @revise_y > DOWN
            @revise_y = DOWN
          end
        end
        return result
      end
    elsif @revise_y > DOWN and $ud_ok
      result = right2(x + 1, y, distance, 2)
      result &= right2(x, y + 1, distance)
      if result == false
        if right
          move_upper_right_p
          if @revise_y < -UP
            @revise_y = -UP
          end
        end
        return result
      end
    end
    @revise_x += distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 右に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def right2(x, y, distance, d = 6)
    if @revise_x + distance > SIDE
      unless passable?(x, y, d)
        if @revise_x < SIDE
          @revise_x = SIDE
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 上に移動
  #--------------------------------------------------------------------------
  def move_up_p
    # 上を向く
    turn_up
    # 下に移動
    distance = 2 ** @move_speed
    up1(((@x * 128 + @revise_x) / 128.0).round,
        ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  def move_up_aaaagq
    distance = 2 ** @move_speed
    up1(((@x * 128 + @revise_x) / 128.0).round,
        ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  end
  #--------------------------------------------------------------------------
  # ● 上に移動可能かどうかの判定1
  #--------------------------------------------------------------------------
  def up1(x, y, distance, up = false)
    result = up2(x, y, distance)
    if result == false
      @event_run = check_event_trigger_touch(x, y-1)
      return result
    end
    if @revise_x < -SIDE
      result = up2(x, y - 1, distance, 4)
      result &= up2(x - 1, y, distance)
      if result == false
        if up
          move_upper_right_p
          if @revise_x > SIDE
            @revise_x = SIDE
          end
        end
        return result
      end
    elsif @revise_x > SIDE
      result = up2(x, y - 1, distance, 6)
      result &= up2(x + 1, y, distance)
      if result == false
        if up
          move_upper_left_p
          if @revise_x < -SIDE
            @revise_x = -SIDE
          end
        end
        return result
      end
    end
    @revise_y -= distance
    return result
  end
  #--------------------------------------------------------------------------
  # ● 上に移動可能かどうかの判定2
  #--------------------------------------------------------------------------
  def up2(x, y, distance, d = 8)
    if @revise_y - distance < -UP
      unless passable?(x, y, d)
        if @revise_y > -UP
          @revise_y = -UP
        end
        return false
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 左下に移動
  #--------------------------------------------------------------------------
  def move_lower_left_p
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、上向きだった場合は下を向く
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 左下に移動
    distance = (2 ** @move_speed) / Math.sqrt(2)
    if @direction == 2
      turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_down if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 2, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y > DOWN and -UP > @revise_y - distance
          @revise_y = DOWN
        end
        turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_left if @event_run
      end
    else
      turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_left if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 4, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if  @revise_x + distance> SIDE and -SIDE > @revise_x
          @revise_x = -SIDE
        end
        turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_down if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 右下に移動
  #--------------------------------------------------------------------------
  def move_lower_right_p
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、上向きだった場合は下を向く
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    # 右下に移動
    distance = (2 ** @move_speed) / Math.sqrt(2)
    if @direction == 2
      turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_down if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 2, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y > DOWN and -UP > @revise_y - distance
          @revise_y = DOWN
        end
        turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_right if @event_run
      end
    else
      turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_right if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 6, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_down if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 左上に移動
  #--------------------------------------------------------------------------
  def move_upper_left_p
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、下向きだった場合は上を向く
      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
    end
    # 左上に移動
    distance = (2 ** @move_speed) / Math.sqrt(2)
    if @direction == 8
      turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_up if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 8, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y + distance > DOWN and -UP > @revise_y
          @revise_y = -UP
        end
        turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_left if @event_run
      end
    else
      turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_left if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 4, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_up if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 右上に移動
  #--------------------------------------------------------------------------
  def move_upper_right_p
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、下向きだった場合は上を向く
      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
    end
    # 右上に移動
    distance = (2 ** @move_speed) / Math.sqrt(2)
    if @direction == 8
      turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_up if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 8, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_y + distance > DOWN and -UP > @revise_y
          @revise_y = -UP
        end
        turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_right if @event_run
      end
    else
      turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
                            ((@y * 128 + @revise_y) / 128.0).round, distance)
      turn_right if @event_run
      unless @event_run
        if last_move?(@real_x, @real_y, 6, distance)
          result = check_event_trigger_here([1,2], false)
          if result == true
            return
          end
        end
        move_on
        if @revise_x > SIDE and -SIDE > @revise_x - distance
          @revise_x = SIDE
        end
        turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
                              ((@y * 128 + @revise_y) / 128.0).round, distance)
        turn_up if @event_run
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 同位置のイベント起動判定
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers, run = true)
    result = false
    # イベント実行中の場合
    if $game_system.map_interpreter.running?
      return result
    end
    # 全イベントのループ
    for event in $game_map.events.values
      # イベントの座標とトリガーが一致した場合
      if event.x == ((@x * 128 + @revise_x) / 128.0).round and
          event.y == ((@y * 128 + @revise_y) / 128.0).round and
          triggers.include?(event.trigger)
        # ジャンプ中以外で、起動判定が同位置のイベントなら
        if not event.jumping? and event.over_trigger?
          if event.list.size > 1
            if run == true
              event.start
            end
            result = true
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● 座標修正
  #--------------------------------------------------------------------------
  def move_on
    if @y < (@y + @revise_y / 128.0).round
      @y += 1
      @revise_y -= 128
    end
    if @x > (@x + @revise_x / 128.0).round
      @x -= 1
      @revise_x += 128
    end
    if @x < (@x + @revise_x / 128.0).round
      @x += 1
      @revise_x -= 128
    end
    if @y > (@y + @revise_y / 128.0).round
      @y -= 1
      @revise_y += 128
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーションアップデート
  #--------------------------------------------------------------------------
  def anime_update
    # 移動時アニメが ON の場合
    if @walk_anime
      # アニメカウントを 1.5 増やす
      @anime_count += 1.5
    # 移動時アニメが OFF で、停止時アニメが ON の場合
    elsif @step_anime
      # アニメカウントを 1 増やす
      @anime_count += 1
    end
    # アニメカウントが最大値を超えた場合
    # ※最大値は、基本値 18 から移動速度 * 1 を引いた値
    if @anime_count > 18 - @move_speed * 2
      # 停止時アニメが OFF かつ 停止中の場合
      if not @step_anime and @stop_count > 0
        # パターンをオリジナルに戻す
        @pattern = @original_pattern
      # 停止時アニメが ON または 移動中の場合
      else
        # パターンを更新
        @pattern = (@pattern + 1) % 4
      end
      # アニメカウントをクリア
      @anime_count = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 指定位置に移動
  #--------------------------------------------------------------------------
  # オリジナルのイベントを改名
  alias :moveto_original :moveto
  def moveto(x, y)
    # 補正座標を初期化
    @revise_x = 0
    @revise_y = 0
    # オリジナルのイベントを呼び出し
    moveto_original(x, y)
  end
  #--------------------------------------------------------------------------
  # ● 移動したかどうかの判定
  #--------------------------------------------------------------------------
  def last_move?(x, y, direction, distance)
    if direction == 2 or direction == 6
      distance *= -1
    end
    if (direction == 2 or direction == 8) and
        (y / 128.0).round != ((y - distance) / 128.0).round
      return true
    end
    if (direction == 4 or direction == 6) and
        (x / 128.0).round != ((x - distance) / 128.0).round
      return true
    end
    return false
  end
end

#==============================================================================
# ■ Game_Character (分割定義 1)
#------------------------------------------------------------------------------
#  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
# クラスのスーパークラスとして使用されます。
#==============================================================================

class Game_Character
  #--------------------------------------------------------------------------
  # ● フレーム更新 (移動)
  #--------------------------------------------------------------------------
  def update_move
    # 移動速度からマップ座標系での移動距離に変換
    distance = 2 ** @move_speed
    if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
      distance /= Math.sqrt(2)
    end
    # 論理座標が実座標より下の場合
    if @y * 128 > @real_y
      # 下に移動
      @real_y = [@real_y + distance, @y * 128].min
    end
    # 論理座標が実座標より左の場合
    if @x * 128 < @real_x
      # 左に移動
      @real_x = [@real_x - distance, @x * 128].max
    end
    # 論理座標が実座標より右の場合
    if @x * 128 > @real_x
      # 右に移動
      @real_x = [@real_x + distance, @x * 128].min
    end
    # 論理座標が実座標より上の場合
    if @y * 128 < @real_y
      # 上に移動
      @real_y = [@real_y - distance, @y * 128].max
    end
    # 移動時アニメが ON の場合
    if @walk_anime
      # アニメカウントを 1.5 増やす
      @anime_count += 1.5
    # 移動時アニメが OFF で、停止時アニメが ON の場合
    elsif @step_anime
      # アニメカウントを 1 増やす
      @anime_count += 1
    end
  end
end

#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
# イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● イベント起動
  #--------------------------------------------------------------------------
  def start
    # 実行内容が空でない場合
    if @list.size > 1
      # $game_player.event が0でない場合
      if $game_player.event != 0
        # 移動速度を $game_player.event にする
        $game_player.move_speed = $game_player.event
      end
      @starting = true
    end
  end
end

#==============================================================================
# 本脚本来自奇兵RPG,使用和转载请保留此信息
#==============================================================================

评分

参与人数 1星屑 +200 梦石 +2 收起 理由
「旅」 + 200 + 2

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
162
在线时间
246 小时
注册时间
2010-9-18
帖子
36
8
发表于 2011-7-11 08:12:09 | 只看该作者
本帖最后由 zxc52590 于 2011-7-11 08:20 编辑
1097849185 发表于 2011-6-26 06:20
我给你
=begin
====================================================================


這版沒有在空中行走圖更換喔!
去找找洛克人與大魔界村,那腳本比較完善!
------------我是分隔線--------------------------
傳送門:http://rpg.blue/forum.php?mod=viewthread&tid=56435


zxc52590于2011-7-12 09:36补充以下内容:
  1. $ud_ok = true #上下失效
  2. $airjump = 1  #空中連跳
  3. #==============================================================================
  4. # 本腳本來自www.66RPG.com,使用和轉載請保留此信息
  5. #==============================================================================

  6. # ————————————————————————————————————
  7. # 全方向ドット移動 Ver ε
  8. # 配布元・サポートURL
  9. # http://members.jcom.home.ne.jp/cogwheel/

  10. #==============================================================================
  11. # ■ Game_Player
  12. #------------------------------------------------------------------------------
  13. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  14. # 機能を持っています。このクラスのインスタンスは $game_player で參照されます。
  15. #==============================================================================
  16. class Game_Player < Game_Character
  17.   #--------------------------------------------------------------------------
  18.   # ● 定數
  19.   #--------------------------------------------------------------------------
  20.   UP    = 48                  # 上方向の余裕(0 < UP < 63)
  21.   DOWN  = 16                  # 下方向の余裕(0 < DOWN <63)
  22.   SIDE  = 32                  # 左右方向の余裕(0 < SIDE <63)
  23.   SLANT = false               # 移動ルートの斜め移動時、速度修正
  24.   JUMPMAX = 80              
  25.   JUMPADD = 10              
  26.   #--------------------------------------------------------------------------
  27.   # ● 公開インスタンス■數
  28.   #--------------------------------------------------------------------------
  29.   attr_reader   :event                    # イベント時移動速度
  30.   attr_accessor :move_speed               # 移動速度
  31.   #--------------------------------------------------------------------------
  32.   # ● フレーム更新
  33.   #--------------------------------------------------------------------------
  34.   alias :update_original :update
  35.   def update
  36.     # @walk:步行速度 @dash:ダッシュ時移動速度
  37.     # @event:イベント時移動速度(0の時は、イベント時に速度■更をしない)
  38.     @walk  = 4
  39.     @dash  = 4
  40.     @event = 4
  41.     @dot_m = true
  42.     #ダッシュ機能。エンターキーが押されている間、移動速度を■更する。
  43.     unless moving? or $game_system.map_interpreter.running? or
  44.             @move_route_forcing or $game_temp.message_window_showing
  45.       if @walk != @dash
  46.         if Input.press?(Input::C)
  47.           if @move_speed != @dash
  48.             @move_speed = @dash
  49.           end
  50.         else
  51.           if @move_speed != @walk
  52.             @move_speed = @walk
  53.           end
  54.         end
  55.       end
  56.     end
  57.     if @revise_x == nil and @revise_y == nil
  58.       @revise_x = 0
  59.       @revise_y = 0
  60.     end
  61.     unless @dot_m
  62.       update_original
  63.       return
  64.     end
  65.     if @move_route_forcing
  66.       # ローカル■數に移動中かどうかを記憶
  67.       last_moving = moving?
  68.       # ローカル■數に座標を記憶
  69.       last_real_x = @real_x
  70.       last_real_y = @real_y
  71.       # 座標がずれている場合
  72.       if (@revise_x != 0 or @revise_y != 0) and not jumping? and @move == true
  73.         if @revise_x != @real_x - @x * 128 or @revise_y != @real_y - @y * 128
  74.           @revise_x = @real_x - @x * 128
  75.           @revise_y = @real_y - @y * 128
  76.         end
  77.         # 移動距離distance1と目標距離distance2を設定
  78.         distance1 = 2 ** @move_speed
  79.         distance2 = Math.sqrt(@revise_x ** 2 + @revise_y ** 2)
  80.         # 移動距離が目標距離を越えた場合
  81.         if distance1 > distance2
  82.           # 強制的に補正座標を零にする
  83.           @real_x = @real_x - @revise_x
  84.           @real_y = @real_y - @revise_y
  85.           @revise_x = 0
  86.           @revise_y = 0
  87.           anime_update
  88.         # 移動距離が目標距離に達しない場合
  89.         else
  90.           # 移動距離分目標距離に近づく
  91.           @real_x -= (distance1 * @revise_x / distance2).round
  92.           @real_y -= (distance1 * @revise_y / distance2).round
  93.           @revise_x = @real_x - @x * 128
  94.           @revise_y = @real_y - @y * 128
  95.           anime_update
  96.         end
  97.       else
  98.         super
  99.       end
  100.     else
  101.       @move = false
  102.       # 移動中、イベント■行中、移動ルート強制中、
  103.       # メッセージウィンドウ表示中のいずれでもない場合
  104.       unless moving? or $game_system.map_interpreter.running? or
  105.              @move_route_forcing or $game_temp.message_window_showing
  106.         @event_run = false
  107.         # 方向ボタンが押されていれば、その方向へプレイヤーを移動
  108. #---------------------------上下失效-----------------------------------------
  109.       case Input.dir8
  110.         when 1
  111.           $ud_ok ? move_lower_left_p : move_left_p
  112.           if $game_variables[2] == 0
  113.            @character_name = "洛克行走"
  114.           end
  115.         when 2
  116. #          $ud_ok ? move_down_p : move_down_aaaagq
  117.           move_down_p if $ud_ok
  118.         when 3
  119.          $ud_ok ? move_lower_right_p : move_right_p
  120.           if $game_variables[2] == 0
  121.            @character_name = "洛克行走"
  122.           end
  123.         when 4
  124.           move_left_p
  125.           if $game_variables[2] == 0
  126.            @character_name = "洛克行走"
  127.           end
  128.         when 6
  129.           move_right_p
  130.           if $game_variables[2] == 0
  131.            @character_name = "洛克行走"
  132.           end
  133.         when 7
  134.          $ud_ok ? move_upper_left_p : move_left_p
  135.           if $game_variables[2] == 0
  136.            @character_name = "洛克行走"
  137.           end
  138.         when 8
  139. #         $ud_ok ? move_up_p : move_up_aaaagq
  140.          move_up_p if $ud_ok
  141.         when 9
  142.          $ud_ok ? move_upper_right_p : move_right_p
  143.           if $game_variables[2] == 0
  144.            @character_name = "洛克行走"
  145.           end
  146.         end
  147.       end
  148.       # ローカル■數に座標を記憶
  149.       last_real_x = @real_x
  150.       last_real_y = @real_y
  151.       # 移動■理
  152.       @real_x = @x * 128 + @revise_x
  153.       @real_y = @y * 128 + @revise_y
  154.       # ローカル■數に移動中かどうかを記憶
  155.       last_moving = moving?
  156.       # 座標更新
  157.       move_on
  158.       # 現在の座標と以前の座標が異なる場合
  159.       if (last_real_x != @real_x or last_real_y != @real_y)
  160.         @move_distance = 0 if @move_distance == nil
  161.         @move_distance += Math.sqrt((last_real_x - @real_x) ** 2 +
  162.                                       (last_real_y - @real_y) ** 2)
  163.         if @move_distance >= 128
  164.           @move_distance %= 128
  165.           increase_steps
  166.         end
  167.         # アニメーションを更新
  168.         anime_update
  169.       else
  170.         @pattern = 0
  171.       end
  172.     end
  173.     # キャラクターが下に移動し、かつ畫面上の位置が中央より下の場合
  174.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  175.       # マップを下にスクロール
  176.       $game_map.scroll_down(@real_y - last_real_y)
  177.     end
  178.     # キャラクターが左に移動し、かつ畫面上の位置が中央より左の場合
  179.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  180.       # マップを左にスクロール
  181.       $game_map.scroll_left(last_real_x - @real_x)
  182.     end
  183.     # キャラクターが右に移動し、かつ畫面上の位置が中央より右の場合
  184.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  185.       # マップを右にスクロール
  186.       $game_map.scroll_right(@real_x - last_real_x)
  187.     end
  188.     # キャラクターが上に移動し、かつ畫面上の位置が中央より上の場合
  189.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  190.       # マップを上にスクロール
  191.       $game_map.scroll_up(last_real_y - @real_y)
  192.     end
  193.     # 前回プレイヤーが移動中だった場合
  194.     if last_moving
  195.       # 同位置のイベントとの接觸によるイベント起動判定
  196.       result = check_event_trigger_here([1,2])
  197.       if result == true
  198.         if (last_real_x / 128.0).round != @x and
  199.             (last_real_y / 128.0).round != @y
  200.           if @direction == 2 or @direction == 8
  201.             if (last_real_x / 128.0).round > @x
  202.               turn_left
  203.             else
  204.               turn_right
  205.             end
  206.           else
  207.             if (last_real_y / 128.0).round > @y
  208.               turn_up
  209.             else
  210.               turn_down
  211.             end
  212.           end
  213.         elsif (last_real_x / 128.0).round > @x
  214.           turn_left
  215.         elsif (last_real_x / 128.0).round < @x
  216.           turn_right
  217.         elsif (last_real_y / 128.0).round > @y
  218.           turn_up
  219.         elsif (last_real_y / 128.0).round < @y
  220.           turn_down
  221.         end
  222.       end
  223.       # 起動したイベントがない場合
  224.       if result == false
  225.         # デバッグモードが ON かつ CTRL キーが押されている場合を除き
  226.         unless $DEBUG and Input.press?(Input::CTRL)
  227.           # エンカウント カウントダウン
  228.           if @encounter_count > 0
  229.             @encounter_count -= 1
  230.           end
  231.         end
  232.       end
  233.     end
  234. #-----------------------按跳躍-----------------------------------------------
  235. # A ボタンが押された場合
  236.     if Input.press?(Input::A) and not $ud_ok
  237.       @twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
  238.           ((@y * 128 + @revise_y) / 128.0).round, 5, true)
  239.           if $game_variables[2]==0
  240.            @character_name = "洛克跳躍"
  241.            $game_variables[2]=1
  242.         end
  243.       if (not @apassed) and @twojump <= $airjump
  244.         @apassed = true
  245.         @jumpnow = JUMPMAX
  246.         @twojump += 1
  247.       else
  248.         @jumpnow += 3        
  249.       end
  250.     else
  251.       @apassed = false
  252.     end
  253. #----------------------自由落體--------------------------------
  254.     if not $ud_ok
  255.       @jumpnow -= 10
  256.       if @jumpnow < 0
  257.         @jumpnow = [@jumpnow, -JUMPMAX].max
  258.         if not down1(((@x * 128 + @revise_x) / 128.0).round,
  259.           ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
  260.           @jumpnow = 0
  261.           @twojump = 0
  262.           if $game_variables[2] == 1
  263.            @character_name = "洛克站立"
  264.           Audio.se_play("Audio/SE/角色落地.wav")
  265.            $game_variables[2]=0
  266.         end
  267.         end
  268.       elsif @jumpnow > 0
  269.         @jumpnow = [@jumpnow, JUMPMAX].min
  270.         if not up1(((@x * 128 + @revise_x) / 128.0).round,
  271.           ((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
  272.           @jumpnow = 0
  273.         end
  274.       end
  275.     end
  276.     if Input.trigger?(Input::C)
  277.       # 同位置および正面のイベント起動判定
  278.       check_event_trigger_here([0])
  279.       check_event_trigger_there([0,1,2])
  280.     end
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● オブジェクト初期化
  284.   #--------------------------------------------------------------------------
  285.   def initialize
  286.     @jumpnow = 0
  287.     @twojump = 0
  288.     @apassed = false
  289.     @revise_x = 0
  290.     @revise_y = 0
  291.     @move == false
  292.     super
  293.   end
  294.   #--------------------------------------------------------------------------
  295.   # ● 移動判定
  296.   #--------------------------------------------------------------------------
  297.   def moving?
  298.     unless @dot_m
  299.       result = super
  300.       return result
  301.     end
  302.     # 強制移動の場合オリジナルの判定をさせる
  303.     if @move_route_forcing
  304.       if @move == false
  305.         return false
  306.       end
  307.       super
  308.     # 通常時は現座標が■座標と異なる場合のみ移動中と判定
  309.     else
  310.       return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
  311.     end
  312.   end
  313.   #--------------------------------------------------------------------------
  314.   # ● 移動判定
  315.   #--------------------------------------------------------------------------
  316.   def moving_a?
  317.     if @move == false
  318.       if (@move_route.list[@move_route_index].code <= 14 or
  319.           @move_route.list[@move_route_index].code == 25)
  320.         @move = true
  321.       end
  322.       return false
  323.     end
  324.     moving?
  325.   end
  326.   #--------------------------------------------------------------------------
  327.   # ● フレーム更新 (ジャンプ)
  328.   #--------------------------------------------------------------------------
  329.   def update_jump
  330.     # ジャンプカウントを 1 減らす
  331.     @jump_count -= 1
  332.     # 新しい座標を計算
  333.     @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
  334.     @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  335.     if @jump_count == 0
  336.       @revise_x = 0
  337.       @revise_y = 0
  338.     end
  339.   end
  340.   #--------------------------------------------------------------------------
  341.   # ● 移動タイプ : カスタム
  342.   #--------------------------------------------------------------------------
  343.   def move_type_custom
  344.     unless @dot_m
  345.       super
  346.       return
  347.     end
  348.     # 停止中でなければ中斷
  349.     if jumping? or moving_a?
  350.       return
  351.     end
  352.     # 移動コマンドのリストの最後に到達するまでループ
  353.     while @move_route_index < @move_route.list.size
  354.       # 移動コマンドを取得
  355.       command = @move_route.list[@move_route_index]
  356.       # コマンドコード 0 番 (リストの最後) の場合
  357.       if command.code == 0
  358.         # オプション [動作を繰り返す] が ON の場合
  359.         if @move_route.repeat
  360.           # 移動ルートのインデックスを最初に■す
  361.           @move_route_index = 0
  362.         end
  363.         # オプション [動作を繰り返す] が OFF の場合
  364.         unless @move_route.repeat
  365.           # 移動ルート強制中の場合
  366.           if @move_route_forcing and not @move_route.repeat
  367.             # 移動ルートの強制を解除
  368.             @move_route_forcing = false
  369.             # オリジナルの移動ルートを復■
  370.             @move_route = @original_move_route
  371.             @move_route_index = @original_move_route_index
  372.             @original_move_route = nil
  373.           end
  374.           # 停止カウントをクリア
  375.           @stop_count = 0
  376.         end
  377.         return
  378.       end
  379.       # 移動系コマンド (下に移動~ジャンプ) の場合
  380.       if command.code <= 14
  381.         # コマンドコードで分岐
  382.         case command.code
  383.         when 1  # 下に移動
  384.           move_down
  385.         when 2  # 左に移動
  386.           move_left
  387.         when 3  # 右に移動
  388.           move_right
  389.         when 4  # 上に移動
  390.           move_up
  391.         when 5  # 左下に移動
  392.           move_lower_left
  393.         when 6  # 右下に移動
  394.           move_lower_right
  395.         when 7  # 左上に移動
  396.           move_upper_left
  397.         when 8  # 右上に移動
  398.           move_upper_right
  399.         when 9  # ランダムに移動
  400.           move_random
  401.         when 10  # プレイヤーに近づく
  402.           move_toward_player
  403.         when 11  # プレイヤーから遠ざかる
  404.           move_away_from_player
  405.         when 12  # 一步前進
  406.           move_forward
  407.         when 13  # 一步後退
  408.           move_backward
  409.         when 14  # ジャンプ
  410.           jump(command.parameters[0], command.parameters[1])
  411.         end
  412.         # オプション [移動できない場合は無視] が OFF で、移動失敗の場合
  413.         if not @move_route.skippable and not moving? and not jumping?
  414.           return
  415.         end
  416.         @move_route_index += 1
  417.         return
  418.       end
  419.       # ウェイトの場合
  420.       if command.code == 15
  421.         # ウェイトカウントを設定
  422.         @wait_count = command.parameters[0] * 2 - 1
  423.         @move_route_index += 1
  424.         return
  425.       end
  426.       # 向き■更系のコマンドの場合
  427.       if command.code >= 16 and command.code <= 26
  428.         # コマンドコードで分岐
  429.         case command.code
  430.         when 16  # 下を向く
  431.           turn_down
  432.         when 17  # 左を向く
  433.           turn_left
  434.         when 18  # 右を向く
  435.           turn_right
  436.         when 19  # 上を向く
  437.           turn_up
  438.         when 20  # 右に 90 度回■
  439.           turn_right_90
  440.         when 21  # 左に 90 度回■
  441.           turn_left_90
  442.         when 22  # 180 度回■
  443.           turn_180
  444.         when 23  # 右か左に 90 度回■
  445.           turn_right_or_left_90
  446.         when 24  # ランダムに方向■換
  447.           turn_random
  448.         when 25  # プレイヤーの方を向く
  449.           turn_toward_player
  450.         when 26  # プレイヤーの逆を向く
  451.           turn_away_from_player
  452.         end
  453.         @move_route_index += 1
  454.         return
  455.       end
  456.       # その他のコマンドの場合
  457.       if command.code >= 27
  458.         # コマンドコードで分岐
  459.         case command.code
  460.         when 27  # スイッチ ON
  461.           $game_switches[command.parameters[0]] = true
  462.           $game_map.need_refresh = true
  463.         when 28  # スイッチ OFF
  464.           $game_switches[command.parameters[0]] = false
  465.           $game_map.need_refresh = true
  466.         when 29  # 移動速度の■更
  467.           @move_speed = command.parameters[0]
  468.         when 30  # 移動頻度の■更
  469.           @move_frequency = command.parameters[0]
  470.         when 31  # 移動時アニメ ON
  471.           @walk_anime = true
  472.         when 32  # 移動時アニメ OFF
  473.           @walk_anime = false
  474.         when 33  # 停止時アニメ ON
  475.           @step_anime = true
  476.         when 34  # 停止時アニメ OFF
  477.           @step_anime = false
  478.         when 35  # 向き固定 ON
  479.           @direction_fix = true
  480.         when 36  # 向き固定 OFF
  481.           @direction_fix = false
  482.         when 37  # すり■け ON
  483.           @through = true
  484.         when 38  # すり■け OFF
  485.           @through = false
  486.         when 39  # 最前面に表示 ON
  487.           @always_on_top = true
  488.         when 40  # 最前面に表示 OFF
  489.           @always_on_top = false
  490.         when 41  # グラフィック■更
  491.           @tile_id = 0
  492.           @character_name = command.parameters[0]
  493.           @character_hue = command.parameters[1]
  494.           if @original_direction != command.parameters[2]
  495.             @direction = command.parameters[2]
  496.             @original_direction = @direction
  497.             @prelock_direction = 0
  498.           end
  499.           if @original_pattern != command.parameters[3]
  500.             @pattern = command.parameters[3]
  501.             @original_pattern = @pattern
  502.           end
  503.         when 42  # 不透明度の■更
  504.           @opacity = command.parameters[0]
  505.         when 43  # 合成方法の■更
  506.           @blend_type = command.parameters[0]
  507.         when 44  # SE の演奏
  508.           $game_system.se_play(command.parameters[0])
  509.         when 45  # スクリプト
  510.           result = eval(command.parameters[0])
  511.         end
  512.         @move_route_index += 1
  513.         return
  514.       end
  515.     end
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   # ● 下に移動
  519.   #--------------------------------------------------------------------------
  520.   def move_down_p
  521.     # 下を向く
  522.     turn_down
  523.     # 移動距離を算出
  524.     distance = 2 ** @move_speed
  525.     down1(((@x * 128 + @revise_x) / 128.0).round,
  526.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  527.   end
  528.   def move_down_aaaagq
  529.     distance = 2 ** @move_speed
  530.     down1(((@x * 128 + @revise_x) / 128.0).round,
  531.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  532.   end
  533.   #--------------------------------------------------------------------------
  534.   # ● 下に移動可能かどうかの判定1
  535.   #--------------------------------------------------------------------------
  536.   def down1(x, y, distance, down = false)
  537.     result = down2(x, y, distance)
  538.     if result == false
  539.       @event_run = check_event_trigger_touch(x, y+1)
  540.       return result
  541.     end
  542.     if @revise_x < -SIDE
  543.       result = down2(x, y + 1, distance, 4)
  544.       result &= down2(x - 1, y, distance)
  545.       if result == false
  546.         if down
  547.           move_lower_right_p
  548.           if @revise_x > SIDE
  549.             @revise_x = SIDE
  550.           end
  551.         end
  552.         return result
  553.       end
  554.     elsif @revise_x > SIDE
  555.       result = down2(x, y + 1, distance, 6)
  556.       result &= down2(x + 1, y, distance)
  557.       if result == false
  558.         if down
  559.           move_lower_left_p
  560.           if @revise_x < -SIDE
  561.             @revise_x = -SIDE
  562.           end
  563.         end
  564.         return result
  565.       end
  566.     end
  567.     # 下に移動可能ならば距離分移動
  568.     @revise_y += distance
  569.     return result
  570.   end
  571.   #--------------------------------------------------------------------------
  572.   # ● 下に移動可能かどうかの判定2
  573.   #--------------------------------------------------------------------------
  574.   def down2(x, y, distance, d = 2)
  575.     if @revise_y + distance > DOWN
  576.       unless passable?(x, y, d)
  577.         if @revise_y < DOWN
  578.           @revise_y = DOWN
  579.         end
  580.         return false
  581.       end
  582.     end
  583.     return true
  584.   end
  585.   #--------------------------------------------------------------------------
  586.   # ● 左に移動
  587.   #--------------------------------------------------------------------------
  588.   def move_left_p
  589.     # 左を向く
  590.     turn_left
  591.     distance = 2 ** @move_speed
  592.     left1(((@x * 128 + @revise_x) / 128.0).round,
  593.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  594.   end
  595.   #--------------------------------------------------------------------------
  596.   # ● 左に移動可能かどうかの判定1
  597.   #--------------------------------------------------------------------------
  598.   def left1(x, y, distance, left = false)
  599.     result = left2(x, y, distance)
  600.     if result == false
  601.       @event_run = check_event_trigger_touch(x-1, y)
  602.       return result
  603.     end
  604.     if @revise_y < -UP and $ud_ok
  605.       result = left2(x - 1, y, distance, 8)
  606.       result &= left2(x, y - 1, distance)
  607.       if result == false
  608.         if left
  609.           move_lower_left_p
  610.           if @revise_y > DOWN
  611.             @revise_y = DOWN
  612.           end
  613.         end
  614.         return result
  615.       end
  616.     elsif @revise_y > DOWN and $ud_ok
  617.       result = left2(x - 1, y, distance, 2)
  618.       result &= left2(x, y + 1, distance)
  619.       if result == false
  620.         if left
  621.           move_upper_left_p
  622.           if @revise_y < -UP
  623.             @revise_y = -UP
  624.           end
  625.         end
  626.         return result
  627.       end
  628.     end
  629.     @revise_x -= distance
  630.     return result
  631.   end
  632.   #--------------------------------------------------------------------------
  633.   # ● 左に移動可能かどうかの判定2
  634.   #--------------------------------------------------------------------------
  635.   def left2(x, y, distance, d = 4)
  636.     if @revise_x - distance < -SIDE
  637.       unless passable?(x, y, d)
  638.         if @revise_x > -SIDE
  639.           @revise_x = -SIDE
  640.         end
  641.         return false
  642.       end
  643.     end
  644.     return true
  645.   end
  646.   #--------------------------------------------------------------------------
  647.   # ● 右に移動
  648.   #--------------------------------------------------------------------------
  649.   def move_right_p
  650.       # 右を向く
  651.       turn_right
  652.     distance = 2 ** @move_speed
  653.     right1(((@x * 128 + @revise_x) / 128.0).round,
  654.             ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  655.   end
  656.   #--------------------------------------------------------------------------
  657.   # ● 右に移動可能かどうかの判定1
  658.   #--------------------------------------------------------------------------
  659.   def right1(x, y, distance, right = false)
  660.     result = right2(x, y, distance)
  661.     if result == false
  662.       @event_run = check_event_trigger_touch(x+1, y)
  663.       return result
  664.     end
  665.     if @revise_y < -UP and $ud_ok
  666.       result = right2(x + 1, y, distance, 8)
  667.       result &= right2(x, y - 1, distance)
  668.       if result == false
  669.         if right
  670.           move_lower_right_p
  671.           if @revise_y > DOWN
  672.             @revise_y = DOWN
  673.           end
  674.         end
  675.         return result
  676.       end
  677.     elsif @revise_y > DOWN and $ud_ok
  678.       result = right2(x + 1, y, distance, 2)
  679.       result &= right2(x, y + 1, distance)
  680.       if result == false
  681.         if right
  682.           move_upper_right_p
  683.           if @revise_y < -UP
  684.             @revise_y = -UP
  685.           end
  686.         end
  687.         return result
  688.       end
  689.     end
  690.     @revise_x += distance
  691.     return result
  692.   end
  693.   #--------------------------------------------------------------------------
  694.   # ● 右に移動可能かどうかの判定2
  695.   #--------------------------------------------------------------------------
  696.   def right2(x, y, distance, d = 6)
  697.     if @revise_x + distance > SIDE
  698.       unless passable?(x, y, d)
  699.         if @revise_x < SIDE
  700.           @revise_x = SIDE
  701.         end
  702.         return false
  703.       end
  704.     end
  705.     return true
  706.   end
  707.   #--------------------------------------------------------------------------
  708.   # ● 上に移動
  709.   #--------------------------------------------------------------------------
  710.   def move_up_p
  711.     # 上を向く
  712.     turn_up
  713.     # 下に移動
  714.     distance = 2 ** @move_speed
  715.     up1(((@x * 128 + @revise_x) / 128.0).round,
  716.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  717.   end
  718.   def move_up_aaaagq
  719.     distance = 2 ** @move_speed
  720.     up1(((@x * 128 + @revise_x) / 128.0).round,
  721.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  722.   end
  723.   #--------------------------------------------------------------------------
  724.   # ● 上に移動可能かどうかの判定1
  725.   #--------------------------------------------------------------------------
  726.   def up1(x, y, distance, up = false)
  727.     result = up2(x, y, distance)
  728.     if result == false
  729.       @event_run = check_event_trigger_touch(x, y-1)
  730.       return result
  731.     end
  732.     if @revise_x < -SIDE
  733.       result = up2(x, y - 1, distance, 4)
  734.       result &= up2(x - 1, y, distance)
  735.       if result == false
  736.         if up
  737.           move_upper_right_p
  738.           if @revise_x > SIDE
  739.             @revise_x = SIDE
  740.           end
  741.         end
  742.         return result
  743.       end
  744.     elsif @revise_x > SIDE
  745.       result = up2(x, y - 1, distance, 6)
  746.       result &= up2(x + 1, y, distance)
  747.       if result == false
  748.         if up
  749.           move_upper_left_p
  750.           if @revise_x < -SIDE
  751.             @revise_x = -SIDE
  752.           end
  753.         end
  754.         return result
  755.       end
  756.     end
  757.     @revise_y -= distance
  758.     return result
  759.   end
  760.   #--------------------------------------------------------------------------
  761.   # ● 上に移動可能かどうかの判定2
  762.   #--------------------------------------------------------------------------
  763.   def up2(x, y, distance, d = 8)
  764.     if @revise_y - distance < -UP
  765.       unless passable?(x, y, d)
  766.         if @revise_y > -UP
  767.           @revise_y = -UP
  768.         end
  769.         return false
  770.       end
  771.     end
  772.     return true
  773.   end
  774.   #--------------------------------------------------------------------------
  775.   # ● 左下に移動
  776.   #--------------------------------------------------------------------------
  777.   def move_lower_left_p
  778.     # 向き固定でない場合
  779.     unless @direction_fix
  780.       # 右向きだった場合は左を、上向きだった場合は下を向く
  781.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  782.     end
  783.     # 左下に移動
  784.     distance = (2 ** @move_speed) / Math.sqrt(2)
  785.     if @direction == 2
  786.       turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  787.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  788.       turn_down if @event_run
  789.       unless @event_run
  790.         if last_move?(@real_x, @real_y, 2, distance)
  791.           result = check_event_trigger_here([1,2], false)
  792.           if result == true
  793.             return
  794.           end
  795.         end
  796.         move_on
  797.         if @revise_y > DOWN and -UP > @revise_y - distance
  798.           @revise_y = DOWN
  799.         end
  800.         turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  801.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  802.         turn_left if @event_run
  803.       end
  804.     else
  805.       turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  806.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  807.       turn_left if @event_run
  808.       unless @event_run
  809.         if last_move?(@real_x, @real_y, 4, distance)
  810.           result = check_event_trigger_here([1,2], false)
  811.           if result == true
  812.             return
  813.           end
  814.         end
  815.         move_on
  816.         if  @revise_x + distance> SIDE and -SIDE > @revise_x
  817.           @revise_x = -SIDE
  818.         end
  819.         turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  820.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  821.         turn_down if @event_run
  822.       end
  823.     end
  824.   end
  825.   #--------------------------------------------------------------------------
  826.   # ● 右下に移動
  827.   #--------------------------------------------------------------------------
  828.   def move_lower_right_p
  829.     # 向き固定でない場合
  830.     unless @direction_fix
  831.       # 左向きだった場合は右を、上向きだった場合は下を向く
  832.       @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  833.     end
  834.     # 右下に移動
  835.     distance = (2 ** @move_speed) / Math.sqrt(2)
  836.     if @direction == 2
  837.       turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  838.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  839.       turn_down if @event_run
  840.       unless @event_run
  841.         if last_move?(@real_x, @real_y, 2, distance)
  842.           result = check_event_trigger_here([1,2], false)
  843.           if result == true
  844.             return
  845.           end
  846.         end
  847.         move_on
  848.         if @revise_y > DOWN and -UP > @revise_y - distance
  849.           @revise_y = DOWN
  850.         end
  851.         turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  852.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  853.         turn_right if @event_run
  854.       end
  855.     else
  856.       turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  857.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  858.       turn_right if @event_run
  859.       unless @event_run
  860.         if last_move?(@real_x, @real_y, 6, distance)
  861.           result = check_event_trigger_here([1,2], false)
  862.           if result == true
  863.             return
  864.           end
  865.         end
  866.         move_on
  867.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  868.           @revise_x = SIDE
  869.         end
  870.         turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  871.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  872.         turn_down if @event_run
  873.       end
  874.     end
  875.   end
  876.   #--------------------------------------------------------------------------
  877.   # ● 左上に移動
  878.   #--------------------------------------------------------------------------
  879.   def move_upper_left_p
  880.     # 向き固定でない場合
  881.     unless @direction_fix
  882.       # 右向きだった場合は左を、下向きだった場合は上を向く
  883.       @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  884.     end
  885.     # 左上に移動
  886.     distance = (2 ** @move_speed) / Math.sqrt(2)
  887.     if @direction == 8
  888.       turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  889.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  890.       turn_up if @event_run
  891.       unless @event_run
  892.         if last_move?(@real_x, @real_y, 8, distance)
  893.           result = check_event_trigger_here([1,2], false)
  894.           if result == true
  895.             return
  896.           end
  897.         end
  898.         move_on
  899.         if @revise_y + distance > DOWN and -UP > @revise_y
  900.           @revise_y = -UP
  901.         end
  902.         turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  903.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  904.         turn_left if @event_run
  905.       end
  906.     else
  907.       turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  908.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  909.       turn_left if @event_run
  910.       unless @event_run
  911.         if last_move?(@real_x, @real_y, 4, distance)
  912.           result = check_event_trigger_here([1,2], false)
  913.           if result == true
  914.             return
  915.           end
  916.         end
  917.         move_on
  918.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  919.           @revise_x = SIDE
  920.         end
  921.         turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  922.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  923.         turn_up if @event_run
  924.       end
  925.     end
  926.   end
  927.   #--------------------------------------------------------------------------
  928.   # ● 右上に移動
  929.   #--------------------------------------------------------------------------
  930.   def move_upper_right_p
  931.     # 向き固定でない場合
  932.     unless @direction_fix
  933.       # 左向きだった場合は右を、下向きだった場合は上を向く
  934.       @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  935.     end
  936.     # 右上に移動
  937.     distance = (2 ** @move_speed) / Math.sqrt(2)
  938.     if @direction == 8
  939.       turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  940.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  941.       turn_up if @event_run
  942.       unless @event_run
  943.         if last_move?(@real_x, @real_y, 8, distance)
  944.           result = check_event_trigger_here([1,2], false)
  945.           if result == true
  946.             return
  947.           end
  948.         end
  949.         move_on
  950.         if @revise_y + distance > DOWN and -UP > @revise_y
  951.           @revise_y = -UP
  952.         end
  953.         turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  954.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  955.         turn_right if @event_run
  956.       end
  957.     else
  958.       turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  959.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  960.       turn_right if @event_run
  961.       unless @event_run
  962.         if last_move?(@real_x, @real_y, 6, distance)
  963.           result = check_event_trigger_here([1,2], false)
  964.           if result == true
  965.             return
  966.           end
  967.         end
  968.         move_on
  969.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  970.           @revise_x = SIDE
  971.         end
  972.         turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  973.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  974.         turn_up if @event_run
  975.       end
  976.     end
  977.   end
  978.   #--------------------------------------------------------------------------
  979.   # ● 同位置のイベント起動判定
  980.   #--------------------------------------------------------------------------
  981.   def check_event_trigger_here(triggers, run = true)
  982.     result = false
  983.     # イベント■行中の場合
  984.     if $game_system.map_interpreter.running?
  985.       return result
  986.     end
  987.     # 全イベントのループ
  988.     for event in $game_map.events.values
  989.       # イベントの座標とトリガーが一致した場合
  990.       if event.x == ((@x * 128 + @revise_x) / 128.0).round and
  991.           event.y == ((@y * 128 + @revise_y) / 128.0).round and
  992.           triggers.include?(event.trigger)
  993.         # ジャンプ中以外で、起動判定が同位置のイベントなら
  994.         if not event.jumping? and event.over_trigger?
  995.           if event.list.size > 1
  996.             if run == true
  997.               event.start
  998.             end
  999.             result = true
  1000.           end
  1001.         end
  1002.       end
  1003.     end
  1004.     return result
  1005.   end
  1006.   #--------------------------------------------------------------------------
  1007.   # ● 座標修正
  1008.   #--------------------------------------------------------------------------
  1009.   def move_on
  1010.     if @y < (@y + @revise_y / 128.0).round
  1011.       @y += 1
  1012.       @revise_y -= 128
  1013.     end
  1014.     if @x > (@x + @revise_x / 128.0).round
  1015.       @x -= 1
  1016.       @revise_x += 128
  1017.     end
  1018.     if @x < (@x + @revise_x / 128.0).round
  1019.       @x += 1
  1020.       @revise_x -= 128
  1021.     end
  1022.     if @y > (@y + @revise_y / 128.0).round
  1023.       @y -= 1
  1024.       @revise_y += 128
  1025.     end
  1026.   end
  1027.   #--------------------------------------------------------------------------
  1028.   # ● アニメーションアップデート
  1029.   #--------------------------------------------------------------------------
  1030.   def anime_update
  1031.     # 移動時アニメが ON の場合
  1032.     if @walk_anime
  1033.       # アニメカウントを 1.5 ■やす
  1034.       @anime_count += 1.5
  1035.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  1036.     elsif @step_anime
  1037.       # アニメカウントを 1 ■やす
  1038.       @anime_count += 1
  1039.     end
  1040.     # アニメカウントが最大■を超えた場合
  1041.     # ※最大■は、基本■ 18 から移動速度 * 1 を引いた■
  1042.     if @anime_count > 18 - @move_speed * 2
  1043.       # 停止時アニメが OFF かつ 停止中の場合
  1044.       if not @step_anime and @stop_count > 0
  1045.         # パターンをオリジナルに■す
  1046.         @pattern = @original_pattern
  1047.       # 停止時アニメが ON または 移動中の場合
  1048.       else
  1049.         # パターンを更新
  1050.         @pattern = (@pattern + 1) % 4
  1051.       end
  1052.       # アニメカウントをクリア
  1053.       @anime_count = 0
  1054.     end
  1055.   end
  1056.   #--------------------------------------------------------------------------
  1057.   # ● 指定位置に移動
  1058.   #--------------------------------------------------------------------------
  1059.   # オリジナルのイベントを改名
  1060.   alias :moveto_original :moveto
  1061.   def moveto(x, y)
  1062.     # 補正座標を初期化
  1063.     @revise_x = 0
  1064.     @revise_y = 0
  1065.     # オリジナルのイベントを呼び出し
  1066.     moveto_original(x, y)
  1067.   end
  1068.   #--------------------------------------------------------------------------
  1069.   # ● 移動したかどうかの判定
  1070.   #--------------------------------------------------------------------------
  1071.   def last_move?(x, y, direction, distance)
  1072.     if direction == 2 or direction == 6
  1073.       distance *= -1
  1074.     end
  1075.     if (direction == 2 or direction == 8) and
  1076.         (y / 128.0).round != ((y - distance) / 128.0).round
  1077.       return true
  1078.     end
  1079.     if (direction == 4 or direction == 6) and
  1080.         (x / 128.0).round != ((x - distance) / 128.0).round
  1081.       return true
  1082.     end
  1083.     return false
  1084.   end

  1085. #==============================================================================
  1086. # ■ Game_Character (分割定義 1)
  1087. #------------------------------------------------------------------------------
  1088. #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
  1089. # クラスのスーパークラスとして使用されます。
  1090. #==============================================================================

  1091. class Game_Character
  1092.   #--------------------------------------------------------------------------
  1093.   # ● フレーム更新 (移動)
  1094.   #--------------------------------------------------------------------------
  1095.   def update_move
  1096.     # 移動速度からマップ座標系での移動距離に■換
  1097.     distance = 2 ** @move_speed
  1098.     if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
  1099.       distance /= Math.sqrt(2)
  1100.     end
  1101.     # 論理座標が■座標より下の場合
  1102.     if @y * 128 > @real_y
  1103.       # 下に移動
  1104.       @real_y = [@real_y + distance, @y * 128].min
  1105.     end
  1106.     # 論理座標が■座標より左の場合
  1107.     if @x * 128 < @real_x
  1108.       # 左に移動
  1109.       @real_x = [@real_x - distance, @x * 128].max
  1110.     end
  1111.     # 論理座標が■座標より右の場合
  1112.     if @x * 128 > @real_x
  1113.       # 右に移動
  1114.       @real_x = [@real_x + distance, @x * 128].min
  1115.     end
  1116.     # 論理座標が■座標より上の場合
  1117.     if @y * 128 < @real_y
  1118.       # 上に移動
  1119.       @real_y = [@real_y - distance, @y * 128].max
  1120.     end
  1121.     # 移動時アニメが ON の場合
  1122.     if @walk_anime
  1123.       # アニメカウントを 1.5 ■やす
  1124.       @anime_count += 1.5
  1125.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  1126.     elsif @step_anime
  1127.       # アニメカウントを 1 ■やす
  1128.       @anime_count += 1
  1129.     end
  1130.   end
  1131. end

  1132. #==============================================================================
  1133. # ■ Game_Event
  1134. #------------------------------------------------------------------------------
  1135. #  イベントを扱うクラスです。條件判定によるイベントページ切り替えや、並列■理
  1136. # イベント■行などの機能を持っており、Game_Map クラスの內部で使用されます。
  1137. #==============================================================================

  1138. class Game_Event < Game_Character
  1139.   #--------------------------------------------------------------------------
  1140.   # ● イベント起動
  1141.   #--------------------------------------------------------------------------
  1142.   def start
  1143.     # ■行內容が空でない場合
  1144.     if @list.size > 1
  1145.       # $game_player.event が0でない場合
  1146.       if $game_player.event != 0
  1147.         # 移動速度を $game_player.event にする
  1148.         $game_player.move_speed = $game_player.event
  1149.       end
  1150.       @starting = true
  1151.     end
  1152.   end
  1153. end
  1154. end

  1155. #==============================================================================
  1156. # 本腳本來自www.66RPG.com,使用和轉載請保留此信息
  1157. #==============================================================================
复制代码
這比較完善!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 10:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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