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

Project1

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

[已经过期] 新人提问:这个layer插件怎么用啊?

[复制链接]

Lv2.观梦者

梦石
1
星屑
5195
在线时间
51 小时
注册时间
2015-3-7
帖子
3
跳转到指定楼层
1
发表于 2015-3-11 12:14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制下载
  1. #==============================================================================
  2. # ■ Game_System
  3. #------------------------------------------------------------------------------
  4. #  システム周りのデータを扱うクラスです。乗り物や BGM などの管理も行います。
  5. # このクラスのインスタンスは $game_system で参照されます。
  6. #==============================================================================
  7. class Game_System
  8.   #--------------------------------------------------------------------------
  9.   # ● 公開インスタンス変数
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :layer                    # レイヤー
  12.   #--------------------------------------------------------------------------
  13.   # ● オブジェクト初期化
  14.   #--------------------------------------------------------------------------
  15.   alias game_system_initialize initialize
  16.   def initialize
  17.     game_system_initialize
  18.     @layer = -1
  19.   end
  20. end
  21.  
  22. #==============================================================================
  23. # ■ Game_Temp
  24. #------------------------------------------------------------------------------
  25. #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン
  26. # スタンスは $game_temp で参照されます。
  27. #==============================================================================
  28. class Game_Temp
  29.   #--------------------------------------------------------------------------
  30.   # ● 公開インスタンス変数
  31.   #--------------------------------------------------------------------------
  32.   attr_accessor :map_name   #再読み込み回避
  33.   attr_accessor :link_array #再読み込み回避
  34.   attr_accessor :check      #再読み込み回避
  35.   #--------------------------------------------------------------------------
  36.   # ● オブジェクト初期化
  37.   #--------------------------------------------------------------------------
  38.   alias game_temp_initialize initialize
  39.   def initialize
  40.     game_temp_initialize
  41.     @map_name = []    #再読み込み回避
  42.     @link_array = []  #再読み込み回避
  43.     @check = false    #再読み込み回避
  44.   end
  45. end
  46.  
  47. #==============================================================================
  48. # ■ Game_Map
  49. #------------------------------------------------------------------------------
  50. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  51. # このクラスのインスタンスは $game_map で参照されます。
  52. #==============================================================================
  53. class Game_Map
  54.   #--------------------------------------------------------------------------
  55.   # ● 定数
  56.   #--------------------------------------------------------------------------
  57.   MAX_EVENT = 1000    # 1レイヤ当たりのイベント数
  58.   MAX_LAYER = 5       # レイヤの最大数
  59.   LAYER_UP = 1022     # レイヤを上げるチップID
  60.   LAYER_DW = 1023     # レイヤを下げるチップID
  61.   #--------------------------------------------------------------------------
  62.   # ● 公開インスタンス変数
  63.   #--------------------------------------------------------------------------
  64.   attr_accessor :name
  65.   attr_accessor :para_layer
  66.   attr_accessor :spe_layer
  67.   attr_reader   :spe_picture_name
  68.   attr_reader   :spe_picture_layer
  69.   #--------------------------------------------------------------------------
  70.   # ● セットアップ
  71.   #     map_id : マップ ID
  72.   #     enable : 所属レイヤーの変更
  73.   #--------------------------------------------------------------------------
  74.   def setup(map_id,enable=false)
  75.     #########################################################################
  76.     #レイヤー   
  77.     range = 0..MAX_LAYER-1
  78.     if $game_temp.check == false
  79.       id_array = []
  80.  
  81.       $data_mapinfos.each do | i,data |
  82.         $game_temp.map_name[i] = data.name
  83.         id_array.push(i)
  84.       end
  85.  
  86.       id_array.each do | id |
  87.         buf = []
  88.         name = $game_temp.map_name[id].gsub(/\<(\w+)\>/,"")
  89.         name = name.gsub(/\[(\w+)\]/,"")
  90.  
  91.         id_array.each do | id2 |
  92.           temp_name = $game_temp.map_name[id2]
  93.           if temp_name.match(name) && temp_name.match(/\<lay(\d+)\>/)
  94.             buf[$1.to_i] = id2
  95.           end
  96.         end
  97.         buf[0] = id if buf[0] == nil
  98.         $game_temp.link_array[id] = buf
  99.       end
  100.       $game_temp.check = true
  101.     end
  102.  
  103.     @map_id = map_id
  104.     @name = $data_mapinfos[@map_id].name
  105.     @map_lay = []         #各レイヤーのマップデータ
  106.     @layer_no = 0
  107.     $game_player.active_layer=0
  108.  
  109.     @pl_layer = 0
  110.     @name.gsub(/\<lay(\d+)\>/i) { @pl_layer = enable || $game_system.layer == -1 ? $1.to_i : $game_system.layer }
  111.     $game_player.active_layer = @pl_layer  #プレイヤーのレイヤーを決定
  112.     $game_player.link_layer_followers      #フォロワーのレイヤーをリンク
  113.  
  114.     @layer_num = $game_temp.link_array[@map_id].size
  115.     @map_id = $game_temp.link_array[@map_id][0]
  116.  
  117.     #リンクするマップをレイヤーとして読み込む
  118.     @spe_picture_name = ""
  119.     @para_layer = 0
  120.     $game_temp.link_array[@map_id].each do | id |
  121.       @map_lay.push(load_data(sprintf("Data/Map%03d.rvdata2",id)))
  122.       link_name = $game_temp.map_name[id]
  123.       link_id = $game_temp.link_array[@map_id].index(id)
  124.       link_name.gsub(/<para>/)   { @para_layer = link_id }
  125.       link_name.gsub(/\[(\w+)\]/){ set_spe_picture(link_id,$1) }
  126.     end
  127.     set_layer_no(0)
  128.     @map_lay.each { |map| map.display_name = @map_lay[0].display_name }
  129.  
  130.     @display_x = [0,0,0,0,0]
  131.     @display_y = [0,0,0,0,0]
  132.     @speed_x = [0,0,0,0,0]
  133.     @speed_y = [0,0,0,0,0]
  134.     #########################################################################
  135.  
  136.     @tileset_id = @map.tileset_id
  137. #    @display_x = 0
  138. #    @display_y = 0
  139.     referesh_vehicles
  140.     setup_events
  141.     setup_scroll
  142.     setup_parallax
  143.     setup_battleback
  144.     @need_refresh = false
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● フレーム更新
  148.   #     main : インタプリタ更新フラグ
  149.   #--------------------------------------------------------------------------
  150.   def update(main = false)
  151.     refresh if @need_refresh
  152.     update_interpreter if main
  153.     update_scroll
  154.     update_move_layer
  155.     update_events
  156.     update_vehicles
  157.     update_parallax
  158.     @screen.update
  159.   end  
  160.   #--------------------------------------------------------------------------
  161.   # ● イベントのセットアップ
  162.   #--------------------------------------------------------------------------
  163.   def setup_events
  164.     @events = {}
  165.     @map_lay.each_with_index do | map,index |
  166.       map.events.each do |i, event|
  167.         event.id += MAX_EVENT*index
  168.         @events[i+MAX_EVENT*index] = Game_Event.new(@map_id, event)
  169. #        @events[i+MAX_EVENT*index].active_layer = index
  170.       end
  171.     end
  172.  
  173.     @common_events = parallel_common_events.collect do |common_event|
  174.       Game_CommonEvent.new(common_event.id)
  175.     end
  176.     refresh_tile_events
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 乗っているタイルIDを取得する
  180.   #--------------------------------------------------------------------------
  181.   def get_chip_id(x=$game_player.x,y=$game_player.y,layer=0)
  182.     [2, 1, 0].each do |i|
  183.       tile_id = @map_lay[layer].data[x, y, i]
  184.       return tile_id if tile_id != 0      # タイル ID 取得できたら終了      
  185.     end   
  186.     return nil
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 取得するレイヤーNoの設定
  190.   #--------------------------------------------------------------------------
  191.   def set_layer_no(no)
  192.     @layer_no = no
  193.     @layer_no %= @layer_num
  194.     @layer_no = 0 if @layer_no < 0
  195.     @map = @map_lay[@layer_no]
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ● レイヤー数の取得
  199.   #--------------------------------------------------------------------------
  200.   def get_layer_num
  201.     return @layer_num
  202.   end
  203.   #--------------------------------------------------------------------------
  204.   # ● リージョン ID の取得
  205.   #--------------------------------------------------------------------------
  206.   def region_id(x, y)
  207.     valid?(x, y) ? @map_lay[$game_player.active_layer].data[x, y, 3] >> 8 : 0
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   # ● エンカウントリストの取得
  211.   #--------------------------------------------------------------------------
  212.   def encounter_list
  213.     @map_lay[$game_player.active_layer].encounter_list
  214.   end
  215.   #--------------------------------------------------------------------------
  216.   # ● エンカウント歩数の取得
  217.   #--------------------------------------------------------------------------
  218.   def encounter_step
  219.     @map_lay[$game_player.active_layer].encounter_step
  220.   end
  221.   #--------------------------------------------------------------------------
  222.   # ● マップデータの取得
  223.   #--------------------------------------------------------------------------
  224.   def data
  225.     return @map_lay[@layer_no].data
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ● 通行可能判定
  229.   #     x    : X 座標
  230.   #     y    : Y 座標
  231.   #     flag : 調べる通行禁止ビット (通常 0x01、乗り物の場合のみ変更)
  232.   #--------------------------------------------------------------------------
  233.   def passable?(x, y, d, active_layer=0)
  234.     check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f, active_layer)
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # ● 小型船の通行可能判定
  238.   #--------------------------------------------------------------------------
  239.   def boat_passable?(x, y, active_layer=0)
  240.     check_passage(x, y, 0x0200, active_layer)
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 大型船の通行可能判定
  244.   #--------------------------------------------------------------------------
  245.   def ship_passable?(x, y, active_layer=0)
  246.     check_passage(x, y, 0x0400, active_layer)
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # ● 通行チェック
  250.   #     bit : 調べる通行禁止ビット
  251.   #--------------------------------------------------------------------------
  252.   def check_passage(x, y, bit, active_layer)
  253.     #上レイヤーの接続チップは"上"のみチェック
  254.     up = false
  255.     set_layer_no(active_layer+1)
  256.     up = true if LAYER_UP == tile_id(x,y,2)
  257.  
  258.     #下レイヤーの接続チップは"下"のみチェック
  259.     dw = false
  260.     unless up
  261.       set_layer_no(active_layer-1)
  262.       dw = true if LAYER_DW == tile_id(x,y,2)
  263.     end
  264.     set_layer_no(active_layer) if up == false && dw == false
  265.  
  266.     if bit == 0x0200 || bit == 0x0400
  267.       if LAYER_DW == tile_id(x,y,2) || LAYER_UP == tile_id(x,y,2)
  268.         return true
  269.       end
  270.     end
  271.  
  272.     all_tiles(x, y).each do |tile_id|
  273.       flag = tileset.flags[tile_id]
  274.       next if flag & 0x10 != 0  # [☆] : 通行に影響しない
  275.       if flag & bit == 0        # [○] : 通行可
  276.         set_layer_no(active_layer)
  277.         return true
  278.       end
  279.       if flag & bit == bit      # [×] : 通行不可
  280.         set_layer_no(active_layer)
  281.         return false
  282.       end
  283.     end
  284.     set_layer_no(active_layer)
  285.     return false                # 通行不可
  286.   end
  287.   #--------------------------------------------------------------------------
  288.   # ● 横方向にループするか?
  289.   #--------------------------------------------------------------------------
  290.   def loop_horizontal?
  291.     return (@map_lay[0].scroll_type == 2 or @map_lay[0].scroll_type == 3)
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # ● 縦方向にループするか?
  295.   #--------------------------------------------------------------------------
  296.   def loop_vertical?
  297.     return (@map_lay[0].scroll_type == 1 or @map_lay[0].scroll_type == 3)
  298.   end
  299.   #--------------------------------------------------------------------------
  300.   # ● ダッシュ禁止か否かの取得
  301.   #--------------------------------------------------------------------------
  302.   def disable_dash?
  303.     return @map_lay[0].disable_dashing
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● 遠景のセットアップ
  307.   #--------------------------------------------------------------------------
  308.   alias setup_parallax_game_map setup_parallax
  309.   def setup_parallax
  310.     old_map = @map
  311.     @map = @map_lay[@para_layer]
  312.     setup_parallax_game_map
  313.     @map = old_map
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ● BGM / BGS 自動切り替え
  317.   #--------------------------------------------------------------------------
  318.   alias autoplay_game_map autoplay
  319.   def autoplay
  320.     old_map = @map
  321.     @map = @map_lay[0]
  322.     autoplay_game_map
  323.     @map = old_map
  324.   end
  325.   #--------------------------------------------------------------------------
  326.   # ● 茂み判定
  327.   #     x : X 座標
  328.   #     y : Y 座標
  329.   #--------------------------------------------------------------------------
  330.   def bush?(x, y, layer=0)
  331.     @map = @map_lay[layer]
  332.     valid?(x, y) && layered_tiles_flag?(x, y, 0x40)
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # ● カウンター判定
  336.   #     x : X 座標
  337.   #     y : Y 座標
  338.   #--------------------------------------------------------------------------
  339.   def counter?(x, y, layer=0)
  340.     @map = @map_lay[layer]
  341.     valid?(x, y) && layered_tiles_flag?(x, y, 0x80)
  342.   end
  343.   #--------------------------------------------------------------------------
  344.   # ● レイヤースクロール
  345.   #--------------------------------------------------------------------------
  346.   def set_move_layer(lay,speed_x,speed_y)
  347.     @speed_x[lay] = speed_x
  348.     @speed_y[lay] = speed_y
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # ● レイヤースクロール
  352.   #--------------------------------------------------------------------------
  353.   def update_move_layer
  354.     return if scrolling?   
  355.  
  356.     @speed_x.each_with_index do | x,i |
  357.       if x > 0
  358.         scroll_left(2 ** x.abs / 256.0,i)
  359.       elsif x < 0
  360.         scroll_right(2 ** x.abs / 256.0,i)
  361.       end
  362.     end
  363.     @speed_y.each_with_index do | y,i |
  364.       if y > 0
  365.         scroll_up(2 ** y.abs / 256.0,i)
  366.       elsif y < 0
  367.         scroll_down(2 ** y.abs / 256.0,i)
  368.       end
  369.     end
  370.   end
  371.   #--------------------------------------------------------------------------
  372.   # ● 表示位置の設定
  373.   #     x : 新しい表示 X 座標 (*256)
  374.   #     y : 新しい表示 Y 座標 (*256)
  375.   #--------------------------------------------------------------------------
  376.   def set_display_pos(x, y)
  377.     x = [0, [x, width - screen_tile_x].min].max unless loop_horizontal?
  378.     y = [0, [y, height - screen_tile_y].min].max unless loop_vertical?
  379.     range = 0..4
  380.     range.each do | i |
  381.       @display_x[i] = (x + width) % width
  382.       @display_y[i] = (y + height) % height
  383.     end
  384.     @parallax_x = x
  385.     @parallax_y = y
  386.   end
  387.   #--------------------------------------------------------------------------
  388.   # ● 表示座標を差し引いた X 座標の計算
  389.   #     x : X 座標
  390.   #--------------------------------------------------------------------------
  391.   def adjust_x(x,lay=0)
  392.     if loop_horizontal? && x < @display_x[lay] - (width - screen_tile_x) / 2
  393.       x - @display_x[lay] + @map.width
  394.     else
  395.       x - @display_x[lay]
  396.     end
  397.   end
  398.   #--------------------------------------------------------------------------
  399.   # ● 表示座標を差し引いた Y 座標の計算
  400.   #     y : Y 座標
  401.   #--------------------------------------------------------------------------
  402.   def adjust_y(y,lay=0)
  403.     if loop_vertical? && y < @display_y[lay] - (height - screen_tile_y) / 2
  404.       y - @display_y[lay] + @map.height
  405.     else
  406.       y - @display_y[lay]
  407.     end
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # ● 下にスクロール
  411.   #     distance : スクロールする距離
  412.   #--------------------------------------------------------------------------
  413.   def scroll_down(distance,lay=-1)
  414.     range = lay==-1 ? 0..4 : lay..lay   
  415.     range.each do | i |
  416.       if loop_vertical?
  417.         @display_y[i] += distance
  418.         @display_y[i] %= @map.height
  419.         @parallax_y += distance if @parallax_loop_y && i==@para_layer
  420.       else
  421.         last_y = @display_y[i]
  422.         @display_y[i] = [@display_y[i] + distance, height - screen_tile_y].min
  423.         @parallax_y += @display_y[i] - last_y if i==@para_layer
  424.       end
  425.     end
  426.   end
  427.   #--------------------------------------------------------------------------
  428.   # ● 左にスクロール
  429.   #     distance : スクロールする距離
  430.   #--------------------------------------------------------------------------
  431.   def scroll_left(distance,lay=-1)
  432.     range = lay==-1 ? 0..4 : lay..lay
  433.     range.each do | i |
  434.       if loop_horizontal?
  435.         @display_x[i] += @map.width - distance
  436.         @display_x[i] %= @map.width
  437.         @parallax_x -= distance if @parallax_loop_x && i==@para_layer
  438.       else
  439.         last_x = @display_x[i]
  440.         @display_x[i] = [@display_x[i] - distance, 0].max
  441.         @parallax_x += @display_x[i] - last_x if i==@para_layer
  442.       end
  443.     end
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ● 右にスクロール
  447.   #     distance : スクロールする距離
  448.   #--------------------------------------------------------------------------
  449.   def scroll_right(distance,lay=-1)
  450.     range = lay==-1 ? 0..4 : lay..lay
  451.     range.each do | i |
  452.       if loop_horizontal?
  453.         @display_x[i] += distance
  454.         @display_x[i] %= @map.width
  455.         @parallax_x += distance if @parallax_loop_x && i==@para_layer
  456.       else
  457.         last_x = @display_x[i]
  458.         @display_x[i] = [@display_x[i] + distance, (width - screen_tile_x)].min
  459.         @parallax_x += @display_x[i] - last_x if i==@para_layer
  460.       end
  461.     end
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 上にスクロール
  465.   #     distance : スクロールする距離
  466.   #--------------------------------------------------------------------------
  467.   def scroll_up(distance,lay=-1)
  468.     range = lay==-1 ? 0..4 : lay..lay
  469.     range.each do | i |
  470.       if loop_vertical?
  471.         @display_y[i] += @map.height - distance
  472.         @display_y[i] %= @map.height
  473.         @parallax_y -= distance if @parallax_loop_y if i==@para_layer
  474.       else
  475.         last_y = @display_y[i]
  476.         @display_y[i] = [@display_y[i] - distance, 0].max
  477.         @parallax_y += @display_y[i] - last_y if i==@para_layer
  478.       end
  479.     end
  480.   end
  481.   #--------------------------------------------------------------------------
  482.   # ● スクロールの更新
  483.   #--------------------------------------------------------------------------
  484.   def update_scroll
  485.     return unless scrolling?
  486.     lay = $game_player.active_layer
  487.     last_x = @display_x[lay]
  488.     last_y = @display_y[lay]
  489.     do_scroll(@scroll_direction, scroll_distance)
  490.     if @display_x[lay] == last_x && @display_y[lay] == last_y
  491.       @scroll_rest = 0
  492.     else
  493.       @scroll_rest -= scroll_distance
  494.     end
  495.   end
  496.   #--------------------------------------------------------------------------
  497.   # ● 挟み込む特殊ピクチャスプライトを表示
  498.   #--------------------------------------------------------------------------
  499.   def set_spe_picture(layer,filename)
  500.     @spe_picture_name = filename
  501.     @spe_picture_layer = layer
  502.   end
  503.  
  504. end
  505.  
  506. #==============================================================================
  507. # ■ Scene_Map
  508. #------------------------------------------------------------------------------
  509. #  マップ画面の処理を行うクラスです。
  510. #==============================================================================
  511. class Scene_Map < Scene_Base
  512.   #--------------------------------------------------------------------------
  513.   # ● 公開インスタンス変数
  514.   #--------------------------------------------------------------------------
  515.   attr_accessor :spriteset
  516.   #--------------------------------------------------------------------------
  517.   # ● スプライトセットの作成
  518.   #--------------------------------------------------------------------------
  519.   def create_spriteset
  520.     @spriteset = Spriteset_Map_Ctrl.new
  521.   end
  522.   #--------------------------------------------------------------------------
  523.   # ● 場所移動の処理
  524.   #--------------------------------------------------------------------------
  525.   def perform_transfer
  526.     pre_transfer
  527.     $game_player.perform_transfer
  528.     dispose_spriteset
  529.     create_spriteset
  530.     post_transfer
  531.   end
  532. end
  533.  
  534. #==============================================================================
  535. # ■ Spriteset_Map_Ctrl
  536. #------------------------------------------------------------------------------
  537. #  レイヤー毎に持っているスプライトセットをまとめて管理
  538. #==============================================================================
  539. class Spriteset_Map_Ctrl
  540.   #--------------------------------------------------------------------------
  541.   # ● オブジェクト初期化
  542.   #--------------------------------------------------------------------------
  543.   def initialize
  544.     @spriteset = []   
  545.     range = 0..$game_map.get_layer_num-1
  546.     range.each do |i|
  547.       $game_map.set_layer_no(i)
  548.       upper_flg = i==$game_map.get_layer_num-1 ? true : false
  549.       @spriteset.push(Spriteset_Map.new(i,upper_flg))      
  550.     end
  551.   end
  552.   #--------------------------------------------------------------------------
  553.   # ● フレーム更新
  554.   #--------------------------------------------------------------------------
  555.   def update
  556.     @spriteset.each { | sprite | sprite.update }   
  557.   end
  558.   #--------------------------------------------------------------------------
  559.   # ● 終了処理
  560.   #--------------------------------------------------------------------------
  561.   def dispose
  562.     @spriteset.each { | sprite | sprite.dispose }
  563.   end
  564.   #--------------------------------------------------------------------------
  565.   # ● 内部のレイヤースプライトを取得
  566.   #--------------------------------------------------------------------------  
  567.   def get_layer_sprite
  568.     return @spriteset
  569.   end
  570.   #--------------------------------------------------------------------------
  571.   # ● キャラクターのスプライトを解放
  572.   #--------------------------------------------------------------------------  
  573.   def dispose_characters
  574.     @spriteset.each { | sprite | sprite.dispose_characters }
  575.   end
  576.  
  577. end
  578.  
  579. #==============================================================================
  580. # ■ Spriteset_Map
  581. #------------------------------------------------------------------------------
  582. #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは
  583. # Scene_Map クラスの内部で使用されます。
  584. #==============================================================================
  585. class Spriteset_Map
  586.   #--------------------------------------------------------------------------
  587.   # ● 公開インスタンス変数
  588.   #--------------------------------------------------------------------------
  589.   attr_accessor :viewport1
  590.   attr_accessor :viewport2
  591.   attr_accessor :viewport3
  592.   attr_accessor :character_sprites
  593.   #--------------------------------------------------------------------------
  594.   # ● オブジェクト初期化
  595.   #--------------------------------------------------------------------------
  596.   def initialize(pri,top)
  597.     @pri = pri
  598.     @top = top
  599.     create_viewports
  600.     create_tilemap
  601.     create_parallax   if update_parallaxes?
  602.     create_spe_pic    if update_spe?
  603.     create_characters
  604.     create_shadow     if update?
  605.     create_weather    if update?
  606.     create_pictures   if update?
  607.     create_timer      if update?
  608.     update
  609.   end
  610.   #--------------------------------------------------------------------------
  611.   # ● 解放
  612.   #--------------------------------------------------------------------------
  613.   def dispose
  614.     dispose_tilemap
  615.     dispose_parallax  if update_parallaxes?
  616.     dispose_spe_pic   if update_spe?
  617.     dispose_characters
  618.     dispose_shadow    if update?
  619.     dispose_weather   if update?
  620.     dispose_pictures  if update?
  621.     dispose_timer     if update?
  622.     dispose_viewports
  623.   end
  624.   #--------------------------------------------------------------------------
  625.   # ● フレーム更新
  626.   #--------------------------------------------------------------------------
  627.   def update
  628.     $game_map.set_layer_no(@pri)
  629.     update_tileset
  630.     update_tilemap
  631.     update_parallax   if update_parallaxes?
  632.     update_spe_pic    if update_spe?
  633.     update_characters
  634.     update_shadow     if update?
  635.     update_weather    if update?
  636.     update_pictures   if update?
  637.     update_timer      if update?
  638.     update_viewports
  639.   end
  640.   #--------------------------------------------------------------------------
  641.   # ● タイルマップの作成
  642.   #--------------------------------------------------------------------------
  643.   alias create_tilemap_layer create_tilemap
  644.   def create_tilemap
  645.     create_tilemap_layer
  646.     refresh_tilemap
  647.   end
  648.   #--------------------------------------------------------------------------
  649.   # ● タイルマップの作成
  650.   #--------------------------------------------------------------------------
  651.   def refresh_tilemap
  652.     erase_tile(Game_Map::LAYER_UP)
  653.     erase_tile(Game_Map::LAYER_DW)  
  654.   end
  655.   #--------------------------------------------------------------------------
  656.   # ● いらないタイルを消す
  657.   #--------------------------------------------------------------------------
  658.   def erase_tile(id)
  659.     x=(id%8)*32 + 256*(id/888)
  660.     y=(id-768)/8*32 - 512*(id/888)
  661.     @tilemap.bitmaps[8].clear_rect(x, y, 32, 32)
  662.   end  
  663.   #--------------------------------------------------------------------------
  664.   # ● キャラクタースプライトの作成
  665.   #--------------------------------------------------------------------------
  666.   def create_characters
  667.     @character_sprites = []
  668.     $game_map.events.values.each do |event|
  669.       @character_sprites.push(Sprite_Character.new(@viewport1, event, @pri))
  670.     end
  671.     $game_map.vehicles.each do |vehicle|
  672.       @character_sprites.push(Sprite_Character.new(@viewport1, vehicle, @pri))
  673.     end
  674.     $game_player.followers.reverse_each do |follower|
  675.       @character_sprites.push(Sprite_Character.new(@viewport1, follower, @pri))
  676.     end
  677.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player, @pri))
  678.     @map_id = $game_map.map_id   
  679.   end
  680.   #--------------------------------------------------------------------------
  681.   # ● アップデートするか?
  682.   #--------------------------------------------------------------------------
  683.   def update?
  684.     return true if @pri==0
  685.     return false
  686.   end
  687.   #--------------------------------------------------------------------------
  688.   # ● アップデートするか?(遠景)
  689.   #--------------------------------------------------------------------------
  690.   def update_parallaxes?
  691.     return @pri==$game_map.para_layer ? true : false
  692.   end
  693.   #--------------------------------------------------------------------------
  694.   # ● アップデートするか?(最上層)
  695.   #--------------------------------------------------------------------------
  696.   def update_top?
  697.     return @top
  698.   end
  699.   #--------------------------------------------------------------------------
  700.   # ● アップデートするか?(挟み込むピクチャ)
  701.   #--------------------------------------------------------------------------
  702.   def update_spe?
  703.     return @pri==$game_map.spe_picture_layer ? true : false
  704.   end
  705.   #--------------------------------------------------------------------------
  706.   # ● ビューポートの更新
  707.   #--------------------------------------------------------------------------
  708.   def update_viewports
  709.     if update_top?
  710.       @viewport1.tone = $game_map.screen.tone
  711.     end
  712.     @viewport1.ox = $game_map.screen.shake
  713.     if update_top?
  714.       @viewport2.color = $game_map.screen.flash_color
  715.       @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  716.     end
  717.     @viewport1.update
  718.     @viewport2.update
  719.     @viewport3.update
  720.   end
  721.   #--------------------------------------------------------------------------
  722.   # ● タイルマップの更新
  723.   #--------------------------------------------------------------------------
  724.   def update_tilemap
  725.     @tilemap.map_data = $game_map.data
  726.     @tilemap.ox = $game_map.display_x[@pri] * 32
  727.     @tilemap.oy = $game_map.display_y[@pri] * 32
  728.     @tilemap.update
  729.   end
  730.   #--------------------------------------------------------------------------
  731.   # ● 天候の更新
  732.   #--------------------------------------------------------------------------
  733.   def update_weather
  734.     @weather.type = $game_map.screen.weather_type
  735.     @weather.power = $game_map.screen.weather_power
  736.     @weather.ox = $game_map.display_x[@pri] * 32
  737.     @weather.oy = $game_map.display_y[@pri] * 32
  738.     @weather.update
  739.   end
  740.   #--------------------------------------------------------------------------
  741.   # ● 挟み込む特殊ピクチャスプライトを作成
  742.   #--------------------------------------------------------------------------
  743.   def create_spe_pic
  744.     @layer_sprite = Sprite.new
  745.     @filename = ""
  746.     @old_filename = ""
  747.   end
  748.   #--------------------------------------------------------------------------
  749.   # ● 挟み込む特殊ピクチャスプライトを更新
  750.   #--------------------------------------------------------------------------
  751.   def update_spe_pic
  752.     @layer_sprite.update
  753.  
  754.     filename = $game_map.spe_picture_name
  755.     if @pri == $game_map.spe_picture_layer && filename != @old_filename
  756.       if filename != ""
  757.         name = "Graphics/Pictures/" + $game_map.spe_picture_name
  758.         @layer_sprite.bitmap = Bitmap.new(name)
  759.         @layer_sprite.wave_amp = 5
  760.         @layer_sprite.wave_length = 5
  761.         @layer_sprite.wave_speed = 20
  762.         @layer_sprite.x = -20
  763.         @layer_sprite.y = 0
  764.         @layer_sprite.z = 0
  765.         @layer_sprite.opacity = 200
  766.         @layer_sprite.visible = true
  767.       else
  768.         @layer_sprite.visible = false
  769.       end
  770.       @old_filename = filename
  771.     end
  772.   end
  773.   #--------------------------------------------------------------------------
  774.   # ● 挟み込む特殊ピクチャスプライトを解放
  775.   #--------------------------------------------------------------------------
  776.   def dispose_spe_pic
  777.     @layer_sprite.dispose if @layer_sprite != nil
  778.   end
  779.   #--------------------------------------------------------------------------
  780.   # ● タイルセットの更新
  781.   #--------------------------------------------------------------------------
  782.   def update_tileset
  783.     if @tileset != $game_map.tileset
  784.       load_tileset
  785.       refresh_characters
  786.       refresh_tilemap
  787.     end
  788.   end  
  789.  
  790. end
  791.  
  792. #==============================================================================
  793. # ■ Game_Player
  794. #------------------------------------------------------------------------------
  795. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  796. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  797. #==============================================================================
  798. class Game_Player < Game_Character
  799.   #--------------------------------------------------------------------------
  800.   # ● マップ通行可能判定
  801.   #     d : 方向(2,4,6,8)
  802.   #--------------------------------------------------------------------------
  803.   def map_passable?(x, y, d)
  804.     case @vehicle_type
  805.     when :boat
  806.       $game_map.boat_passable?(x, y, @active_layer)
  807.     when :ship
  808.       $game_map.ship_passable?(x, y, @active_layer)
  809.     when :airship
  810.       true
  811.     else
  812.       super
  813.     end
  814.   end
  815.   #--------------------------------------------------------------------------
  816.   # ● 場所移動の実行
  817.   #--------------------------------------------------------------------------
  818.   def perform_transfer
  819.     if transfer?
  820.       set_direction(@new_direction)
  821.       if @new_map_id != $game_map.map_id
  822.         $game_map.setup(@new_map_id,true) # レイヤー間を移動するので常にセット
  823.         $game_map.autoplay
  824.       end
  825.       moveto(@new_x, @new_y)
  826.       link_layer_followers
  827.       clear_transfer_info
  828.     end
  829.   end
  830.   #--------------------------------------------------------------------------
  831.   # ● マップイベントの起動
  832.   #     triggers : トリガーの配列
  833.   #     normal   : プライオリティ[通常キャラと同じ]かそれ以外か
  834.   #--------------------------------------------------------------------------
  835.   def start_map_event(x, y, triggers, normal)
  836.     $game_map.events_xy(x, y).each do |event|
  837.       next unless check_enable_layer(event)
  838.       if event.trigger_in?(triggers) && event.normal_priority? == normal
  839.         event.start
  840.       end
  841.     end
  842.   end
  843.   #--------------------------------------------------------------------------
  844.   # ● 更新
  845.   #--------------------------------------------------------------------------
  846.   alias game_player_update update
  847.   def update
  848.     game_player_update
  849.     $game_system.layer = $game_player.active_layer
  850.   end
  851.   #--------------------------------------------------------------------------
  852.   # ● 乗り物に乗る
  853.   #    現在乗り物に乗っていないことが前提。
  854.   #--------------------------------------------------------------------------
  855.   def get_on_vehicle
  856.     add = 0
  857.     check_layer = (@active_layer + 1) % $game_map.get_layer_num
  858.     add = 1 if $game_map.get_chip_id(self.x, self.y, check_layer) == Game_Map::LAYER_DW
  859.     check_layer = (@active_layer - 1) % $game_map.get_layer_num
  860.     add =-1 if $game_map.get_chip_id(self.x, self.y, check_layer) == Game_Map::LAYER_UP
  861.  
  862.     front_x = $game_map.x_with_direction(@x, @direction)
  863.     front_y = $game_map.y_with_direction(@y, @direction)
  864.     @vehicle_type = :boat    if $game_map.boat.pos?(front_x, front_y) && @active_layer+add == $game_map.boat.active_layer   # 正面に大型船がある?
  865.     @vehicle_type = :ship    if $game_map.ship.pos?(front_x, front_y) && @active_layer+add == $game_map.ship.active_layer   # 正面に小型船がある?
  866.     @vehicle_type = :airship if $game_map.airship.pos?(@x, @y)
  867.  
  868.     if vehicle
  869.       @vehicle_getting_on = true
  870.       force_move_forward unless in_airship?
  871.       @followers.gather
  872.     end
  873.     @vehicle_getting_on
  874.   end
  875.   #--------------------------------------------------------------------------
  876.   # ● 乗り物から降りる
  877.   #    現在乗り物に乗っていることが前提。
  878.   #--------------------------------------------------------------------------
  879.   alias game_player_get_off_vehicle get_off_vehicle
  880.   def get_off_vehicle
  881.     front_x = $game_map.x_with_direction(@x, @direction)
  882.     front_y = $game_map.y_with_direction(@y, @direction)
  883.     id0 = $game_map.get_chip_id(front_x, front_y, @active_layer)
  884.     id1 = $game_map.get_chip_id(front_x, front_y, (@active_layer+1)%$game_map.get_layer_num)
  885.     return if id0 == Game_Map::LAYER_UP || id0 == Game_Map::LAYER_DW
  886.     return if id1 == Game_Map::LAYER_UP || id1 == Game_Map::LAYER_DW
  887.     game_player_get_off_vehicle
  888.   end
  889.   #--------------------------------------------------------------------------
  890.   # ● スクロール処理
  891.   #--------------------------------------------------------------------------
  892.   def update_scroll(last_real_x, last_real_y)
  893.     ax1 = $game_map.adjust_x(last_real_x, @active_layer)
  894.     ay1 = $game_map.adjust_y(last_real_y, @active_layer)
  895.     ax2 = $game_map.adjust_x(@real_x, @active_layer)
  896.     ay2 = $game_map.adjust_y(@real_y, @active_layer)
  897.     $game_map.scroll_down (ay2 - ay1) if ay2 > ay1 && ay2 > center_y
  898.     $game_map.scroll_left (ax1 - ax2) if ax2 < ax1 && ax2 < center_x
  899.     $game_map.scroll_right(ax2 - ax1) if ax2 > ax1 && ax2 > center_x
  900.     $game_map.scroll_up   (ay1 - ay2) if ay2 < ay1 && ay2 < center_y   
  901.   end
  902.   #--------------------------------------------------------------------------
  903.   # ● フォロワーのレイヤーをリンクする
  904.   #--------------------------------------------------------------------------
  905.   def link_layer_followers
  906.     @followers.each { |f| f.active_layer = @active_layer }
  907.   end
  908. end
  909.  
  910. #==============================================================================
  911. # ■ Game_Vehicle
  912. #------------------------------------------------------------------------------
  913. #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
  914. # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
  915. #==============================================================================
  916. class Game_Vehicle < Game_Character
  917.   #--------------------------------------------------------------------------
  918.   # ● 接岸/着陸可能判定
  919.   #     d : 方向(2,4,6,8)
  920.   #--------------------------------------------------------------------------
  921.   def land_ok?(x, y, d)
  922.     if @type == :airship
  923.       return false unless $game_map.airship_land_ok?(x, y)
  924.       return false unless $game_map.events_xy(x, y).empty?
  925.     else
  926.       x2 = $game_map.round_x_with_direction(x, d)
  927.       y2 = $game_map.round_y_with_direction(y, d)
  928.       return false unless $game_map.valid?(x2, y2)
  929.       return false unless $game_map.passable?(x2, y2, reverse_dir(d), @active_layer)
  930.       return false if collide_with_characters?(x2, y2)
  931.     end
  932.     return true
  933.   end
  934. end
  935.  
  936. #==============================================================================
  937. # ■ Game_Event
  938. #------------------------------------------------------------------------------
  939. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  940. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  941. #==============================================================================
  942. class Game_Event < Game_Character
  943.   #--------------------------------------------------------------------------
  944.   # ● 公開インスタンス変数
  945.   #--------------------------------------------------------------------------
  946.   attr_accessor :id
  947.   #--------------------------------------------------------------------------
  948.   # ● オブジェクト初期化
  949.   #     event : RPG::Event
  950.   #--------------------------------------------------------------------------
  951.   def initialize(map_id, event)
  952.     super()
  953.     @map_id = map_id
  954.     @event = event
  955.     @id = @event.id
  956.     self.active_layer = @id / Game_Map::MAX_EVENT
  957.     moveto(@event.x, @event.y)
  958.     refresh
  959.   end
  960.   #--------------------------------------------------------------------------
  961.   # ● 接触イベントの起動判定
  962.   #--------------------------------------------------------------------------
  963.   def check_event_trigger_touch(x, y)
  964.     return if $game_map.interpreter.running?
  965.     if @trigger == 2 && $game_player.pos?(x, y) && check_enable_layer($game_player)
  966.       start if !jumping? && normal_priority?
  967.     end
  968.   end
  969.   #--------------------------------------------------------------------------
  970.   # ● 画面の可視領域付近にいるか判定
  971.   #     dx : 画面中央から左右何マス以内を判定するか
  972.   #     dy : 画面中央から上下何マス以内を判定するか
  973.   #--------------------------------------------------------------------------
  974.   def near_the_screen?(dx = 12, dy = 8)
  975.     ax = $game_map.adjust_x(@real_x,@active_layer) - Graphics.width / 2 / 32
  976.     ay = $game_map.adjust_y(@real_y,@active_layer) - Graphics.height / 2 / 32
  977.     ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
  978.   end
  979. end
  980.  
  981. #==============================================================================
  982. # ■ Game_CharacterBase
  983. #------------------------------------------------------------------------------
  984. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  985. # ラフィックなどの基本的な情報を保持します。
  986. #==============================================================================
  987. class Game_CharacterBase
  988.   #--------------------------------------------------------------------------
  989.   # ● 公開インスタンス変数
  990.   #--------------------------------------------------------------------------
  991.   attr_accessor :active_layer
  992.   #--------------------------------------------------------------------------
  993.   # ● オブジェクト初期化
  994.   #--------------------------------------------------------------------------
  995.   alias initialize2 initialize
  996.   def initialize
  997.     initialize2
  998.     @active_layer = 0
  999.   end
  1000.   #--------------------------------------------------------------------------
  1001.   # ● フレーム更新
  1002.   #--------------------------------------------------------------------------
  1003.   def update
  1004.     update_layer_change
  1005.     update_animation
  1006.     return update_jump if jumping?
  1007.     return update_move if moving?
  1008.     return update_stop
  1009.   end
  1010.   #--------------------------------------------------------------------------
  1011.   # ● 所属レイヤーの変更
  1012.   #--------------------------------------------------------------------------
  1013.   def update_layer_change
  1014.     return false if $game_map.get_layer_num == 1
  1015.     return if @old_x == self.x && @old_y == self.y
  1016.  
  1017.     if @active_layer+1 < $game_map.get_layer_num
  1018.       id = $game_map.get_chip_id(self.x,self.y,@active_layer+1)
  1019.       @active_layer=@active_layer+1 if id == Game_Map::LAYER_UP
  1020.     end
  1021.  
  1022.     if @active_layer-1 > -1
  1023.       id = $game_map.get_chip_id(self.x,self.y,@active_layer-1)
  1024.       @active_layer=@active_layer-1 if id == Game_Map::LAYER_DW
  1025.     end
  1026.     @old_x = self.x
  1027.     @old_y = self.y
  1028.   end
  1029.   #--------------------------------------------------------------------------
  1030.   # ● キャラクター衝突判定
  1031.   #     x : X 座標
  1032.   #     y : Y 座標
  1033.   #    プレイヤーと乗り物を含め、通常キャラの衝突を検出する。
  1034.   #--------------------------------------------------------------------------
  1035.   def collide_with_characters?(x, y)
  1036.     #一歩前を見るのでこの形に
  1037.     add = 0
  1038.     check_layer = (@active_layer + 1) % $game_map.get_layer_num
  1039.     add = 1 if $game_map.get_chip_id(x, y, check_layer) == Game_Map::LAYER_UP
  1040.     check_layer = (@active_layer - 1) % $game_map.get_layer_num
  1041.     add =-1 if $game_map.get_chip_id(x, y, check_layer) == Game_Map::LAYER_DW
  1042.     collide_with_events?(x, y, add) || collide_with_vehicles?(x, y, add)   
  1043.   end
  1044.   #--------------------------------------------------------------------------
  1045.   # ● イベントとの衝突判定
  1046.   #--------------------------------------------------------------------------
  1047.   def collide_with_events?(x, y, add=0)
  1048.     $game_map.events_xy_nt(x, y).any? do |event|
  1049.       if event.active_layer == @active_layer || event.active_layer == @active_layer+add
  1050.         event.normal_priority? || self.is_a?(Game_Event)
  1051.       end
  1052.     end
  1053.   end
  1054.   #--------------------------------------------------------------------------
  1055.   # ● 乗り物との衝突判定
  1056.   #--------------------------------------------------------------------------
  1057.   def collide_with_vehicles?(x, y, add=0)
  1058.     collide_with_boat?(x, y, add) || collide_with_ship?(x, y, add)
  1059.   end
  1060.   #--------------------------------------------------------------------------
  1061.   # ● 大型船との衝突判定
  1062.   #--------------------------------------------------------------------------
  1063.   def collide_with_ship?(x, y, add=0)
  1064.     if $game_map.ship.active_layer != @active_layer+add && $game_map.ship.active_layer != @active_layer
  1065.       return false
  1066.     end
  1067.     $game_map.ship.pos_nt?(x, y)
  1068.   end
  1069.   #--------------------------------------------------------------------------
  1070.   # ● 小型船との衝突判定
  1071.   #--------------------------------------------------------------------------
  1072.   def collide_with_boat?(x, y, add=0)
  1073.     if $game_map.boat.active_layer != @active_layer+add && $game_map.boat.active_layer != @active_layer
  1074.       return false
  1075.     end
  1076.     $game_map.boat.pos_nt?(x, y)
  1077.   end
  1078.   #--------------------------------------------------------------------------
  1079.   # ● 位置設定(イベント位置設定用)
  1080.   #--------------------------------------------------------------------------
  1081.   def set_pos(new_x,new_y,dir=@direction,lay=@active_layer)
  1082.     moveto(new_x, new_y)
  1083.     set_active_layer(lay)
  1084.     case dir   # 向き
  1085.     when 8  # 上
  1086.       turn_up
  1087.     when 6  # 右
  1088.       turn_right
  1089.     when 2  # 下
  1090.       turn_down
  1091.     when 4  # 左
  1092.       turn_left
  1093.     end
  1094.   end
  1095.   #--------------------------------------------------------------------------
  1096.   # ● 茂み判定
  1097.   #--------------------------------------------------------------------------
  1098.   def bush?
  1099.     $game_map.bush?(@x, @y, @active_layer)
  1100.   end
  1101.   #--------------------------------------------------------------------------
  1102.   # ● マップ通行可能判定
  1103.   #     x : X 座標
  1104.   #     y : Y 座標
  1105.   #--------------------------------------------------------------------------
  1106.   def map_passable?(x, y, d)
  1107.     $game_map.passable?(x, y, d, @active_layer)
  1108.   end
  1109.   #--------------------------------------------------------------------------
  1110.   # ● 違うレイヤーのイベント起動判定
  1111.   #--------------------------------------------------------------------------
  1112.   def check_enable_layer(object)
  1113.     #自分が「上」に乗っている時
  1114.     #自分は今のレイヤーと一つ下のレイヤーをチェックするはず
  1115.     id = $game_map.get_chip_id(self.x, self.y, @active_layer)
  1116.     if id == Game_Map::LAYER_UP
  1117.       layer =(@active_layer-1) % $game_map.get_layer_num
  1118.       return true if object.active_layer == @active_layer
  1119.       return true if object.active_layer == @active_layer-1
  1120.     end
  1121.  
  1122.     #自分が「下」に乗っている時
  1123.     #自分は今のレイヤーと一つ上のレイヤーをチェックするはず
  1124.     id = $game_map.get_chip_id(self.x, self.y, @active_layer)
  1125.     if id == Game_Map::LAYER_DW
  1126.       layer =(@active_layer+1) % $game_map.get_layer_num
  1127.       return true if object.active_layer == @active_layer
  1128.       return true if object.active_layer == @active_layer+1
  1129.     end
  1130.     #どちらでもない場合
  1131.     return true if object.active_layer == @active_layer
  1132.     return false
  1133.   end
  1134.   #--------------------------------------------------------------------------
  1135.   # ● 画面 X 座標の取得
  1136.   #--------------------------------------------------------------------------
  1137.   def screen_x
  1138.     $game_map.adjust_x(@real_x,@active_layer) * 32 + 16
  1139.   end
  1140.   #--------------------------------------------------------------------------
  1141.   # ● 画面 Y 座標の取得
  1142.   #--------------------------------------------------------------------------
  1143.   def screen_y
  1144.     $game_map.adjust_y(@real_y,@active_layer) * 32 + 32 - shift_y - jump_height
  1145.   end
  1146.   #--------------------------------------------------------------------------
  1147.   # ● 所属レイヤーのセット
  1148.   #--------------------------------------------------------------------------
  1149.   def set_active_layer(no)
  1150.     @active_layer = no
  1151.   end
  1152.  
  1153. end
  1154.  
  1155. #==============================================================================
  1156. # ■ Sprite_Character
  1157. #------------------------------------------------------------------------------
  1158. #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
  1159. # 監視し、スプライトの状態を自動的に変化させます。
  1160. #==============================================================================
  1161. class Sprite_Character < Sprite_Base
  1162.   #--------------------------------------------------------------------------
  1163.   # ● オブジェクト初期化
  1164.   #     viewport  : ビューポート
  1165.   #     character : キャラクター (Game_Character)
  1166.   #--------------------------------------------------------------------------
  1167.   alias sprite_character_initialize initialize
  1168.   def initialize(viewport, character = nil, layer = 0)
  1169.     @layer = layer
  1170.     sprite_character_initialize(viewport, character)
  1171.   end
  1172.   #--------------------------------------------------------------------------
  1173.   # ● フレーム更新
  1174.   #--------------------------------------------------------------------------
  1175.   alias sprite_character_update update
  1176.   def update
  1177.     unless update?
  1178.       self.visible = false
  1179.       return
  1180.     end
  1181.     sprite_character_update
  1182.   end
  1183.   #--------------------------------------------------------------------------
  1184.   # ● フレーム更新を行うか?
  1185.   #--------------------------------------------------------------------------
  1186.   def update?
  1187.     test_x = @character.x
  1188.     test_y = @character.y
  1189.     char_layer = @character.active_layer    #キャラクターのレイヤー
  1190.  
  1191.     range = 0..3
  1192.     check_pos_x = [test_x,test_x,test_x-1,test_x+1]
  1193.     check_pos_y = [test_y-1,test_y+1,test_y,test_y]
  1194.  
  1195.     if char_layer+1 == @layer
  1196.       range.each do | i |
  1197.         id = $game_map.get_chip_id(check_pos_x[i],check_pos_y[i],@layer)
  1198.         return true if id == Game_Map::LAYER_UP
  1199.       end
  1200.     end
  1201.  
  1202.     if char_layer == @layer
  1203.       range.each do | i |
  1204.         id = $game_map.get_chip_id(check_pos_x[i],check_pos_y[i],@layer)
  1205.         return true if id != Game_Map::LAYER_UP
  1206.       end
  1207.     end
  1208.     return false
  1209.   end
  1210.   #--------------------------------------------------------------------------
  1211.   # ● 位置の更新
  1212.   #--------------------------------------------------------------------------
  1213.   def update_position
  1214.     self.x = @character.screen_x.round
  1215.     self.y = @character.screen_y.round
  1216.     self.z = @character.screen_z
  1217.   end
  1218. end
  1219.  
  1220. #==============================================================================
  1221. # ■ Game_Interpreter
  1222. #------------------------------------------------------------------------------
  1223. #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
  1224. # Game_Troop クラス、Game_Event クラスの内部で使用されます。
  1225. #==============================================================================
  1226. class Game_Interpreter
  1227.   #--------------------------------------------------------------------------
  1228.   # ● イベントのセットアップ
  1229.   #     list     : 実行内容
  1230.   #     event_id : イベント ID
  1231.   #--------------------------------------------------------------------------
  1232.   alias Game_Interpreter_setup setup
  1233.   def setup(list, event_id = 0)
  1234.     Game_Interpreter_setup(list, event_id)
  1235.     #どのレイヤーのイベントが起動したか
  1236.     @setup_layer = event_id / Game_Map::MAX_EVENT
  1237.   end
  1238.   #--------------------------------------------------------------------------
  1239.   # ● レイヤーの変更
  1240.   #--------------------------------------------------------------------------
  1241.   def set_active_layer(lay)
  1242.     $game_map.events[@event_id].active_layer=lay if @event_id > 0
  1243.   end
  1244.   #--------------------------------------------------------------------------
  1245.   # ● キャラクターの取得
  1246.   #     param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID
  1247.   #--------------------------------------------------------------------------
  1248.   def get_character(param)
  1249.     if $game_party.in_battle
  1250.       nil
  1251.     elsif param < 0
  1252.       $game_player
  1253.     else
  1254.       events = same_map? ? $game_map.events : {}
  1255.       add = @setup_layer * Game_Map::MAX_EVENT
  1256.       events[param > 0 ? param+add : @event_id]
  1257.     end  
  1258.   end
  1259. end

layer_ace_ver1.00.zip

1.8 MB, 下载次数: 40

范例

Lv5.捕梦者

梦石
0
星屑
22948
在线时间
8638 小时
注册时间
2011-12-31
帖子
3367
2
发表于 2015-3-11 15:15:57 | 只看该作者
本帖最后由 tseyik 于 2015-3-11 15:19 编辑

レイヤーシステムforAce Ver1.23/Ver1.32(β)1.3附説明
同頁有範例
http://librpg.zatunen.com/ace.html

改良版
マルチレイヤーシステム(RGSS3)
http://canarialt.blog.fc2.com/blog-entry-57.html
範例
http://canarialt.blog.fc2.com/blog-entry-69.html

サンプルプロジェクト

评分

参与人数 1星屑 +132 收起 理由
taroxd + 132 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 23:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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