#=========================================================================== # ◆ A1 Scripts ◆ # 左右顔グラフィック・顔グラフィック反転(RGSS2/RGSS3共用) # # バージョン : 1.20 (2012/01/02) # 改修元 : VIPツクスレ「RPGツクール?なにそれおいしいの?」>>259 # 改修者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・メッセージの左右に顔グラフィックを表示します # ・メッセージの顔グラフィックを左右反転して表示します #--------------------------------------------------------------------------- # 更新履歴   :2011/12/29 Ver1.00 リリース #    :2011/12/30 Ver1.10 RGSS2対応 #    :2012/01/02 Ver1.20 A1共通スクリプトVer3.30対応 #--------------------------------------------------------------------------- # 設置場所 #  A1共通スクリプトより下 #  (ネームウィンドウスクリプトより上) # # 必要スクリプト # A1共通スクリプトVer3.30以上 #--------------------------------------------------------------------------- # 使い方 # イベントコマンド「注釈」に記述 # # 右顔表示 FaceName,FaceIndex[,mirror] # FaceName :表示する顔グラフィックファイル名 # FaceIndex:表示する顔グラフィックのインデックス # mirror :反転させる場合 反転 と記述 # # 顔反転 on|off # on|off :on と記述すると顔グラフィックが反転して表示されます # メッセージで使用する場合、反転後自動で off になります #============================================================================== $imported ||= {} $imported["A1_DualFace"] = true if $imported["A1_Common_Script"] old_common_script("左右顔グラフィック・顔グラフィック反転", "3.30") if common_version < 3.30 #============================================================================== # ■ Cache #------------------------------------------------------------------------------ #  各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール # です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部 # のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト # を返すようになっています。 #============================================================================== module Cache #-------------------------------------------------------------------------- # ○ 顔グラフィックの取得(反転) #-------------------------------------------------------------------------- def self.mirror_face(filename) load_mirror_bitmap("Graphics/Faces/", filename) end #-------------------------------------------------------------------------- # ○ ビットマップの読み込み(反転) #-------------------------------------------------------------------------- def self.load_mirror_bitmap(folder_name, filename, hue = 0) @cache ||= {} key = [folder_name + filename, hue, "mirror"] return @cache[key] if include?(key) return mirror_bitmap(key, load_bitmap(folder_name, filename, hue)) end #-------------------------------------------------------------------------- # ○ ミラーリング #-------------------------------------------------------------------------- def self.mirror_bitmap(key, bitmap) mirror_bitmap = Bitmap.new(bitmap.width, bitmap.height) (0..bitmap.width).each {|x| mirror_bitmap.blt(x, 0, bitmap, Rect.new(bitmap.width - x - 1, 0, 1, bitmap.height)) } @cache[key] = mirror_bitmap return @cache[key] end end #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ #  ゲーム中の全てのウィンドウのスーパークラスです。 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ☆ 顔グラフィックの描画 #-------------------------------------------------------------------------- alias a1_mirror_face_wb_draw_face draw_face def draw_face(face_name, face_index, x, y, enabled = true) return draw_face_mirror(face_name, face_index, x, y, enabled) if $game_temp.face_mirror a1_mirror_face_wb_draw_face(face_name, face_index, x, y, enabled) end #-------------------------------------------------------------------------- # ○ 顔グラフィックの描画(反転) #-------------------------------------------------------------------------- def draw_face_mirror(face_name, face_index, x, y, enabled = true) bitmap = Cache.mirror_face(face_name) face_index = mirror_index(face_index) rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96) contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha) bitmap.dispose end #-------------------------------------------------------------------------- # ○ 反転したIndexを取得 #-------------------------------------------------------------------------- def mirror_index(index) case index % 4 when 0; return index + 3 when 1; return index + 1 when 2; return index - 1 when 3; return index - 3 end end end #============================================================================== # ◆ RGSS3用処理 #============================================================================== if rgss_version == 3 #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ #  文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Base #-------------------------------------------------------------------------- # ☆ 改ページ処理 #-------------------------------------------------------------------------- alias a1_dual_face_wm_new_page new_page def new_page(text, pos) a1_dual_face_wm_new_page(text, pos) return if $game_temp.right_face_name.empty? $game_temp.face_mirror = $game_temp.right_face_mirror draw_face($game_temp.right_face_name, $game_temp.right_face_index, Graphics.width-96-24, 1) end end #============================================================================== # ◆ RGSS2用処理 #============================================================================== elsif rgss_version == 2 #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ #  文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ☆ 改ページ処理 #-------------------------------------------------------------------------- alias a1_dual_face_wm_new_page new_page def new_page a1_dual_face_wm_new_page return if $game_temp.right_face_name.empty? $game_temp.face_mirror = $game_temp.right_face_mirror draw_face($game_temp.right_face_name, $game_temp.right_face_index, Graphics.width-96-24, 1) end end #============================================================================== # ◆ RGSS用処理 #============================================================================== elsif rgss_version == 1 end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :right_face_name attr_accessor :right_face_index attr_accessor :right_face_mirror attr_accessor :face_mirror #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 #-------------------------------------------------------------------------- alias a1_dual_face_gt_initialize initialize def initialize a1_dual_face_gt_initialize clear_dual_face end #-------------------------------------------------------------------------- # ○ 反転・Dual顔情報のクリア #-------------------------------------------------------------------------- def clear_dual_face @right_face_name = "" @right_face_index = 0 @right_face_mirror = false @face_mirror = false end end #============================================================================== # ■ Game_Message #------------------------------------------------------------------------------ #  文章や選択肢などを表示するメッセージウィンドウの状態を扱うクラスです。この # クラスのインスタンスは $game_message で参照されます。 #============================================================================== class Game_Message #-------------------------------------------------------------------------- # ☆ クリア #-------------------------------------------------------------------------- alias a1_dual_face_gm_clear clear def clear a1_dual_face_gm_clear $game_temp.clear_dual_face end end #============================================================================== # ■ A1_System::CommonModule #============================================================================== class A1_System::CommonModule #-------------------------------------------------------------------------- # ☆ 注釈コマンド定義 #-------------------------------------------------------------------------- alias a1_dual_face_define_command define_command def define_command a1_dual_face_define_command @cmd_108["右顔表示"] = :right_face @cmd_108["顔反転"] = :mirror_face end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ○ 右顔表示 #-------------------------------------------------------------------------- def right_face(params) $game_temp.right_face_name = params[0] $game_temp.right_face_index = params[1].to_i $game_temp.right_face_mirror = params[2] == "反転" ? true : false end #-------------------------------------------------------------------------- # ○ 顔反転 #-------------------------------------------------------------------------- def mirror_face(params) $game_temp.face_mirror = params[0] == "on" ? true : false end end end