查看: 2725|回复: 2

[已经解决] 如何实现进入战斗后将整个画面放大,然后又缩小?

[复制链接]
梦石
0
星屑
50
在线时间
82 小时
注册时间
2013-3-17
回帖
49
发表于 2013-7-6 07:53:49 | 显示全部楼层 |阅读模式

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

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

×
如题,就是类似于FF4的BOSS效果,画面整体放大,停留一段时间,然后缩回原来的大小。对画质没有要求,谢谢!

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-7-14 22:53:29 | 显示全部楼层
脚本略长,800行,因为连同这个作者500行的主脚本都包含在内了………………

第522行之后是真正的战斗效果脚本,有两个开关需要设置的请填一下,不然默认会使用1、2号开关

第675行之后我稍微修改了一下,已实现你描述的放大、缩小的效果,你可以按照自己的需要来改放大、缩小效果的时间……

[pre lang="ruby" line="1"]#◆◇◆◇◆  マスタースクリプトVXA ver 1.00  ◇◆◇◆◇
#  サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
#   by みんと

=begin

■ 更新履歴

○ Ver 1.00(2012/01/16)
公開

■ 説明

全てのみんとRGSSより上に導入してください。
(基本的にシステム上部に導入してください)

これがないと全てのみんとRGSS3は動作いたしません。

=end

#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
#   様々なフラグを扱うメインモジュールです。
#==============================================================================

module MINTO
  
  # VXRGSSの導入環境ハッシュを初期化
  RGSS = {}
  
end

#==============================================================================
# ☆ MINTO_System
#------------------------------------------------------------------------------
#   様々な機能を扱うシステムモジュールです。
#==============================================================================

module MINTO_System
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    @tone_rate = 0
    # シーンスプライトを作成
    @scene_sprite = Sprite_Base.new
    # スーパークラスを実行
    super
  end
  #--------------------------------------------------------------------------
  # ● トランジション実行
  #--------------------------------------------------------------------------
  def perform_transition
    # スーパークラスを実行
    super
  end
  #--------------------------------------------------------------------------
  # ● 開始後処理
  #--------------------------------------------------------------------------
  def post_start
    # スーパークラスを実行
    super
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # シーンスプライトを更新
    @scene_sprite.update
    # スーパークラスを実行
    super
  end
  #--------------------------------------------------------------------------
  # ● 終了前処理
  #--------------------------------------------------------------------------
  def pre_terminate
    # スーパークラスを実行
    super
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    # シーンスプライトを解放
    @scene_sprite.bitmap.dispose if @scene_sprite.bitmap
    @scene_sprite.dispose
    @scene_sprite = nil
    # スーパークラスを実行
    super
  end
end

# ☆ 開発用メソッド追加 ☆

#==============================================================================
# ■ Scene_Base
#------------------------------------------------------------------------------
#  ゲーム中のすべてのシーンのスーパークラスです。
#==============================================================================

class Scene_Base
  #--------------------------------------------------------------------------
  # ● 暗転モード処理
  #--------------------------------------------------------------------------
  def blackout(type = 0, power = 10, max = 100, sprite = nil)
    @tone_power = power
    @tone_type = type
    @tone_max = max
    update_blackout(sprite)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (暗転処理)
  #--------------------------------------------------------------------------
  def update_blackout(sprite)
    case @tone_type
    when 0
      if @tone_rate != -@tone_max
        @tone_rate = [@tone_rate - @tone_power, -@tone_max].max
        sprite.tone.red = @tone_rate
        sprite.tone.green = @tone_rate
        sprite.tone.blue = @tone_rate
      end
    when 1
      if @tone_rate != 0
        @tone_rate = [@tone_rate + @tone_power, 0].min
        sprite.tone.red = @tone_rate
        sprite.tone.green = @tone_rate
        sprite.tone.blue = @tone_rate
      end
    end
  end
end
#==============================================================================
# ■ Object
#------------------------------------------------------------------------------
#  全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。
#==============================================================================

class Object
  #--------------------------------------------------------------------------
  # ● 情報の出力
  #--------------------------------------------------------------------------
  def p2(info)
    # pメソッドを疑似的に前の仕様に戻す
    msgbox(info)
  end
  #--------------------------------------------------------------------------
  # ● 深い複製の作成
  #--------------------------------------------------------------------------
  def dec
    # Marshalもモジュールを経由して、完全な複製を作成
    return Marshal.load(Marshal.dump(self))
  end
end
#==============================================================================
# ■ NilClass
#------------------------------------------------------------------------------
#  nil のクラス。nil は NilClass クラスの唯一のインスタンスです。
#==============================================================================

class NilClass
  #--------------------------------------------------------------------------
  # ● デバイスの取得
  #--------------------------------------------------------------------------
  def to_d
    return "BGM"
  end
end
#==============================================================================
# ■ String
#------------------------------------------------------------------------------
#  文字列クラス。任意の長さのバイト列を扱うことができます。
#==============================================================================

class String
  #--------------------------------------------------------------------------
  # ● デバイスの取得
  #--------------------------------------------------------------------------
  def to_d
    return self
  end
end
#==============================================================================
# ■ Audio
#------------------------------------------------------------------------------
#  ミュージック、サウンドにかかわる処理を行うモジュールです。
#==============================================================================

module Audio
  #--------------------------------------------------------------------------
  # ● 音楽の解放
  #--------------------------------------------------------------------------
  def self.dispose
    #self.bgs_stop
    self.me_stop
    self.bgm_stop
  end
end
#==============================================================================
# ■ Sprite
#------------------------------------------------------------------------------
#  スプライト表示を扱う組み込みクラスです。
#==============================================================================

class Sprite
  #--------------------------------------------------------------------------
  # ● 座標の設定
  #--------------------------------------------------------------------------
  def rect_set(x, y, z = 100)
    self.x = x if x
    self.y = y if y
    self.z = z if z
  end
  #--------------------------------------------------------------------------
  # ● データの取得
  #--------------------------------------------------------------------------
  def data_copy(data)
    return if data.disposed? or self.disposed?
    # 各データをコピー
    self.x = data.x
    self.y = data.y
    self.z = data.z-1
    self.visible = data.visible
    self.ox = data.ox
    self.oy = data.oy
    self.angle = data.angle
    self.mirror = data.mirror
    self.src_rect = data.src_rect.dup
    self.zoom_x = data.zoom_x
    self.zoom_y = data.zoom_y
  end
  #--------------------------------------------------------------------------
  # ● 残像用の複製の作成
  #--------------------------------------------------------------------------
  def blink
    # 各データをコピー
    sprite = Sprite.new(self.viewport)
    sprite.bitmap = self.bitmap.dup if self.bitmap
    sprite.x = self.x
    sprite.y = self.y
    sprite.z = self.z-1
    sprite.visible = false
    sprite.ox = self.ox
    sprite.oy = self.oy
    sprite.angle = self.angle
    sprite.mirror = self.mirror
    sprite.opacity = self.opacity - 95
    sprite.blend_type = 1
    sprite.color = self.color.dup
    sprite.src_rect = self.src_rect.dup
    sprite.zoom_x = self.zoom_x
    sprite.zoom_y = self.zoom_y
    return sprite
  end
  #--------------------------------------------------------------------------
  # ● 複製の作成
  #--------------------------------------------------------------------------
  def dup
    # 各データをコピー
    sprite = Sprite.new(self.viewport)
    sprite.bitmap = self.bitmap.dup if self.bitmap
    sprite.x = self.x
    sprite.y = self.y
    sprite.z = self.z
    sprite.visible = self.visible
    sprite.ox = self.ox
    sprite.oy = self.oy
    sprite.angle = self.angle
    sprite.mirror = self.mirror
    sprite.opacity = self.opacity
    sprite.blend_type = self.blend_type
    sprite.color = self.color.dup
    sprite.src_rect = self.src_rect.dup
    sprite.zoom_x = self.zoom_x
    sprite.zoom_y = self.zoom_y
    return sprite
  end
  #--------------------------------------------------------------------------
  # ● センタリング
  #--------------------------------------------------------------------------
  def centering
    return if self.bitmap == nil
    self.x = (640 - (self.bitmap.width * self.zoom_x)) / 2
    self.y = (480 - (self.bitmap.height * self.zoom_y)) / 2
  end
  #--------------------------------------------------------------------------
  # ● ズーム
  #--------------------------------------------------------------------------
  def zoom=(n)
    zoom_x = n
    zoom_y = n
  end
  #--------------------------------------------------------------------------
  # ● エフェクト表示中判定
  #--------------------------------------------------------------------------
  def effect?
    return false
  end
end
#==============================================================================
# ■ Array
#------------------------------------------------------------------------------
#  配列全般を扱う組み込みクラスです。
#==============================================================================

class Array
  #--------------------------------------------------------------------------
  # ● 要素の一次元化
  #--------------------------------------------------------------------------
  def divide
    array = []
    # データを複製
    data = self.dup
    # 要素の一次元化
    data.each do |i|
      if i.is_a?(Array)
        for a in i
          array.push(a)
        end
      else
        array.push(i)
      end
    end
    return array
  end
  #--------------------------------------------------------------------------
  # ● 要素のシャッフル
  #--------------------------------------------------------------------------
  def shuffle
    # データを複製
    data = self.dup
    # 要素をランダムに並び替える
    data.each_index do |i|
      j = rand(i+1)
      data, data[j] = data[j], data
    end
    return data
  end
  #--------------------------------------------------------------------------
  # ● 要素のシャッフル(破壊的)
  #--------------------------------------------------------------------------
  def shuffle!
    # 要素をランダムに並び替える
    self.each_index do |i|
      j = rand(i+1)
      self, self[j] = self[j], self
    end
  end
  #--------------------------------------------------------------------------
  # ● 要素をランダムに返す
  #--------------------------------------------------------------------------
  def get_rand
    return self[rand(self.size)]
  end
  #--------------------------------------------------------------------------
  # ● 要素の交換
  #    a : 要素1
  #    b : 要素2
  #--------------------------------------------------------------------------
  def change(a, b)
    # データを複製
    data = self.dup
    # 要素を交換する(self自体には変化がない)
    data[a] = self
    data = self[a]
    return data
  end
  #--------------------------------------------------------------------------
  # ● 要素の交換(破壊的)
  #    a : 要素1
  #    b : 要素2
  #--------------------------------------------------------------------------
  def change!(a, b)
    # 要素を交換する(selfを直接書き換える)
    self[a], self = self, self[a]
  end
end
#==============================================================================
# ■ Numeric
#------------------------------------------------------------------------------
#  数値全般を扱う組み込みクラスです。
#==============================================================================

class Numeric
  #--------------------------------------------------------------------------
  # ● 乱数の設定
  #    n : 乱数値
  #--------------------------------------------------------------------------
  def amp(n)
    amp = (self.abs * n / 100).to_min(1)
    return self + rand(amp+1) + rand(amp+1) - amp
  end
  #--------------------------------------------------------------------------
  # ● 値の調整
  #    order : 求められた値
  #    size  : 最大サイズ
  #--------------------------------------------------------------------------
  def select(order, size)
    if self - order <= -1
      return size
    elsif self + order >= size
      return 0
    else
      return self + order
    end
  end
  #--------------------------------------------------------------------------
  # ● 最大値の設定
  #    max : 求められた最大の数値
  #--------------------------------------------------------------------------
  def to_max(min, max)
    if self > max
      return max
    elsif self < min
      return min
    else
      return self
    end
  end
  #--------------------------------------------------------------------------
  # ● 最大値の設定
  #    max : 求められた最大の数値
  #--------------------------------------------------------------------------
  def to_m(max)
    if self > max
      return max
    else
      return self
    end
  end
  #--------------------------------------------------------------------------
  # ● 最小値の設定
  #    min : 求められた最小の数値
  #--------------------------------------------------------------------------
  def to_min(min)
    if self < min
      return min
    else
      return self
    end
  end
  #--------------------------------------------------------------------------
  # ● 範囲内から乱数を得る
  #    min : 求められた最小の数値
  #--------------------------------------------------------------------------
  def mm_rand(min)
    return rand(self - min + 1) + min
  end
  #--------------------------------------------------------------------------
  # ● 求めた数値に対するパーセンテージを返す
  #    order : 求められた数値
  #--------------------------------------------------------------------------
  def rate(order)
    return 100 if order == 0
    return (self * 100) / order
  end
end
#==============================================================================
# ■ Window
#------------------------------------------------------------------------------
#  ゲーム内の全てのウィンドウのスーパークラスです。
#   内部的には複数のスプライトで構成されています。
#==============================================================================

class Window
  #--------------------------------------------------------------------------
  # ● 暗転モード処理
  #--------------------------------------------------------------------------
  def blackout(type = 0, power = 10, max = 100, sprite = @win_viewport)
    @tone_power = power
    @tone_type = type
    @tone_max = max
    update_blackout(sprite)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (暗転処理)
  #--------------------------------------------------------------------------
  def update_blackout(sprite = @win_viewport)
    case @tone_type
    when 0
      if @tone_rate != -@tone_max
        @tone_rate = [@tone_rate - @tone_power, -@tone_max].max
        sprite.tone.red = @tone_rate
        sprite.tone.green = @tone_rate
        sprite.tone.blue = @tone_rate
      end
    when 1
      if @tone_rate != 0
        @tone_rate = [@tone_rate + @tone_power, 0].min
        sprite.tone.red = @tone_rate
        sprite.tone.green = @tone_rate
        sprite.tone.blue = @tone_rate
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウの右寄せ
  #--------------------------------------------------------------------------
  def right(x)
    # ウィンドウを画面の右に配置する
    self.x = (x - self.width)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウの下寄せ
  #--------------------------------------------------------------------------
  def down(y)
    # ウィンドウを画面の右に配置する
    self.y = (480 - self.height - y)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウのセンタリング
  #--------------------------------------------------------------------------
  def centering
    # ウィンドウを画面の中央に配置する
    self.x = (640 - self.width)  / 2
    self.y = (480 - self.height) / 2
  end
end


#===============================================================================
#===============================================================================
#===============================================================================



#◆◇◆◇◆  バトル突入演出VXA ver 1・00  ◇◆◇◆◇
#  サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
#   by みんと

=begin

■ 更新履歴

○ ver 1.00(2012/01/21)
公開

■ 説明

戦闘開始時、
現在の画面をホワイトアウトさせながらズームさせます。

ただし、
あくまでも「現在の画面の中央」を基点としていますので、
プレイヤーが中央に表示されていない場合は
ズームがプレイヤーに合わせられません。

=end

#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
#   様々なフラグを扱うメインモジュールです。
#==============================================================================

module MINTO
  
  # バトル突入演出VXAを有効化 ( true で有効 / false で無効 )
  RGSS["バトル突入演出VXA"] = true
  
  # 演出を行わないスイッチ
  #(このIDのスイッチが「オン」の場合、演出を行いません)
  Not_BattleStart_Switch = 1
  #使用这种战斗效果的开关
  
  # トランジョン演出を行わないスイッチ
  #(このIDのスイッチが「オン」の場合、トランジョン演出を行いません)
  Not_BattleEffect_Switch = 2
  #使用战斗渐变图的开关
  
end

# バトル突入演出VXAが有効な場合に以降の処理を実行する
if MINTO::RGSS["バトル突入演出VXA"] == true then
  
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● バトルの処理
  #--------------------------------------------------------------------------
  def command_301
    return if $game_party.in_battle
    if @params[0] == 0                      # 直接指定
      troop_id = @params[1]
    elsif @params[0] == 1                   # 変数で指定
      troop_id = $game_variables[@params[1]]
    else                                    # マップ指定の敵グループ
      troop_id = $game_player.make_encounter_troop_id
    end
    if $data_troops[troop_id]
      BattleManager.setup(troop_id, @params[2], @params[3])
      BattleManager.event_proc = Proc.new {|n| @branch[@indent] = n }
      $game_player.make_encounter_count
      SceneManager.scene.call_battle
      SceneManager.call(Scene_Battle)
    end
    Fiber.yield
  end
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  マップ画面の処理を行うクラスです。
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● システムインクルード
  #--------------------------------------------------------------------------
  include MINTO_System                    # みんとシステムモジュール
  #--------------------------------------------------------------------------
  # ● バトル突入演出
  #--------------------------------------------------------------------------
  def battle_effect
    # 出力した画像を読み込む
    bitmap = Graphics.snap_to_bitmap
    # シーンスプライトが有効な場合
    unless @scene_sprite.nil?
      unless @scene_sprite.bitmap.nil?
        # シーンスプライトをクリア
        @scene_sprite.bitmap.dispose
        @scene_sprite.bitmap = nil
      end
    end
    # サブスプライトを作成
    sub_sprite = @scene_sprite.dup
    # ビットマップを渡して描写する
    @scene_sprite.bitmap = bitmap
    sub_sprite.bitmap = bitmap
    # 座標を中心で固定する
    @scene_sprite.x = Graphics.width / 2
    @scene_sprite.y = Graphics.height / 2
    @scene_sprite.ox = Graphics.width / 2
    @scene_sprite.oy = Graphics.height / 2
    sub_sprite.x = Graphics.width / 2
    sub_sprite.y = Graphics.height / 2
    sub_sprite.ox = Graphics.width / 2
    sub_sprite.oy = Graphics.height / 2
    # スプライトを最前面に表示する
    @scene_sprite.z = 999999
    sub_sprite.z = 999998
    # シーンスプライトを加算表示にする
    @scene_sprite.blend_type = 1
    # シーンスプライトを光転させる
    blackout(0, 160, -160, @scene_sprite)
    # スプライトの不透明度を設定する
    @scene_sprite.opacity = 0
    sub_sprite.opacity = 255
    # ズーム補正値を定義
    zoom = (3.0 / 40.0)
    zoom2 = (3.5 / 40.0)
    # ループ処理(40回処理する)

=begin
    40.times do
      # ゲーム画面を更新
      Graphics.update
      # スプライトをズームさせる
      sub_sprite.zoom_x += zoom
      sub_sprite.zoom_y += zoom
      @scene_sprite.zoom_x += zoom2
      @scene_sprite.zoom_y += zoom2
      # シーンスプライトを徐々に表示させる
      @scene_sprite.opacity += (255 / 40)
    end
=end

#以下部分经过我自己的修改

#放大的处理,开头数字越大时间越长

    30.times do
      
      Graphics.update
      sub_sprite.zoom_x += zoom
      sub_sprite.zoom_y += zoom
      @scene_sprite.zoom_x += zoom2
      @scene_sprite.zoom_y += zoom2
      
    end

#缩小的处理,开头数字越大时间越长

    10.times do
   
      Graphics.update
      sub_sprite.zoom_x -= zoom*3
      sub_sprite.zoom_y -= zoom*3
      @scene_sprite.zoom_x -= zoom2*3
      @scene_sprite.zoom_y -= zoom2*3
      @scene_sprite.opacity += (255 / 10)
      #画面变亮,不需要可以将本句删除,需要放大时也变亮的话也加到放大处理的后面
   
    end
   
#以上部分经过我自己的修改


    # トランジション準備
    Graphics.freeze
    # サブスプライトを解放
    sub_sprite.bitmap.dispose
    sub_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● バトル画面への切り替え
  #--------------------------------------------------------------------------
  def call_battle
    # 演出カットの場合
    if $game_switches[MINTO::Not_BattleStart_Switch] == true then
      # メソッドを返す
      return
    end
    # 現在のBGMを記憶
    BattleManager.save_bgm_and_bgs
    # 戦闘BGMを再生
    BattleManager.play_battle_bgm
    # バトル突入SEを再生
    Sound.play_battle_start
    # 戦闘開始演出を実行
    battle_effect
    # スプライトセットを更新
    @spriteset.update
    # ゲーム画面を更新
    Graphics.update
  end
  #--------------------------------------------------------------------------
  # ● バトル画面遷移の前処理
  #--------------------------------------------------------------------------
  def pre_battle_scene
    # 画面の情報を更新
    Graphics.update
    # トランジョン準備
    Graphics.freeze
    # 演出カットの場合
    if $game_switches[MINTO::Not_BattleStart_Switch] == true then
      # 現在のBGMを記憶
      BattleManager.save_bgm_and_bgs
      # 戦闘BGMを再生
      BattleManager.play_battle_bgm
      # バトル突入SEを再生
      Sound.play_battle_start
    end
    # キャラクタースプライトの解放
    @spriteset.dispose_characters
  end
  #--------------------------------------------------------------------------
  # ● エンカウントの更新
  #--------------------------------------------------------------------------
  def update_encounter
    # エンカウントが発生した場合
    if $game_player.encounter then
      # 演出を開始
      call_battle
      # 戦闘画面に切り替え
      SceneManager.call(Scene_Battle)
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘前トランジション実行
  #--------------------------------------------------------------------------
  alias perform_battle_transition_MINTO_RGSS3_05 perform_battle_transition
  def perform_battle_transition
    # 演出カットの場合
    if $game_switches[MINTO::Not_BattleEffect_Switch] == true then
      Graphics.transition(10)
      Graphics.freeze
      # メソッドを返す
      return
    end
    # 元の処理を実行
    perform_battle_transition_MINTO_RGSS3_05
  end
end

end[/pre]

评分

参与人数 1星屑 +100 收起 理由
Sion + 100 非常感谢!

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
82 小时
注册时间
2013-3-17
回帖
49
 楼主| 发表于 2013-7-14 23:34:34 来自手机 | 显示全部楼层
喵呜喵5 发表于 2013-7-14 22:53  脚本略长,800行,因为连同这个作者500行的主脚本都包含在内了………………   第522行之后是真正的战斗效果 ...

非常感谢!
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部