# # ダメージを受けたときにウインドウをシェイク(RGSS2) #  シェイク:(C)2011 イノビア #  アレンジ:(C)2011 TYPE74RX-T # # カスタマイズポイント:10~11行目 module RX_T SHAKE_TIMES = 64 MOVES_WINDOW = 32 # ※:SHAKE_TIMES:シェイク回数、MOVES_WINDOW:ウインドウの最大移動量 end def shake(shakes = 64, moves = 32) # ウィンドウハンドルを取得して hwnd に代入 # FindWindow関数を使った方が良いかもしれませんが。 get_a_win = Win32API.new('user32','GetActiveWindow','v','l') hwnd = get_a_win.call() # ウィンドウの現在位置を取得 (スクリーン座標系) get_w_rect = Win32API.new('user32', 'GetWindowRect', 'l p', 'l') tmp = [0, 0, 0, 0].pack("l4") get_w_rect.call(hwnd, tmp) wRect = tmp.unpack("l4") # ウィンドウをシェイク♪ # 以下では shakes 回シェイク、最大移動量を moves ピクセルまで(乱数) mw = Win32API.new('user32', 'MoveWindow', 'l l l l l l', 'l') i=0 while i < shakes do mw.call(hwnd,wRect[0]+rand(moves),wRect[1]+rand(moves),wRect[2]-wRect[0],wRect[3]-wRect[1],1) i += 1 sleep(0.01) end # 元の位置に戻す mw.call(hwnd,wRect[0],wRect[1],wRect[2]-wRect[0],wRect[3]-wRect[1],1) end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ★ HP ダメージ表示(都合により再定義) # target : 対象者 # obj : スキルまたはアイテム #-------------------------------------------------------------------------- def display_hp_damage(target, obj = nil) if target.hp_damage == 0 # ノーダメージ return if obj != nil and obj.damage_to_mp return if obj != nil and obj.base_damage == 0 fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage text = sprintf(fmt, target.name) elsif target.absorbed # 吸収 fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage) elsif target.hp_damage > 0 # ダメージ if target.actor? text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage) Sound.play_actor_damage $game_troop.screen.start_shake(5, 5, 10) else text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage) Sound.play_enemy_damage target.blink = true end else # 回復 fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage) Sound.play_recovery end @message_window.add_instant_text(text) #-------------------------------------------------------------------------- # デフォルトでは、このメソッドの最後にウェイトが入っている関係で # 再定義しております。 # 実際には、このメソッドの末尾にある「wait(30)」と記述された一つ手前の行に # 下記のshake処理を挿入すれば動作いたします。 #-------------------------------------------------------------------------- shake(RX_T::SHAKE_TIMES, RX_T::MOVES_WINDOW) if target.actor? and not target.hp_damage == 0 and not target.absorbed wait(30) end end