Permanent
Creation

RPGツクールXP/VX用のRGSS素材です。
一部英語版対応です。 (A few materials can be used for English RPG MAKER XP/VX.)
競合率はルファーの独断と偏見なのでたまにハズレます。


#==============================================================================
# ■ ダブルプレイヤーモード (分割定義 3)
#------------------------------------------------------------------------------
#  2 つのデータを読み込んで対戦するシーンクラスの定義です。
# ゲーム内で使うには、 $scene = Scene_DoublePlayersLoad.new というスクリプトを
# どこかに挿入する必要があります。
# (C) ルファー
# HP  https://tkoolerlufar.pages.dev/
#==============================================================================

#----------------------------------------------------------------------------
# ◆ Sprite_DoublePlayers クラス
#----------------------------------------------------------------------------
class Sprite_DoublePlayers < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # バトラー
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     viewport     : ビューポート
  #     player_index : プレイヤーインデックス
  #     battler      : バトラー (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, player_index, battler = nil)
    super(viewport)
    @battler = battler
    @battler_visible = false
    @player_index = player_index
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      if @battler.dead? or @battler.hidden
        self.opacity = 0
      end
    end
    if @battler.damage == nil and
       @battler.state_animation_id != @state_animation_id
      @state_animation_id = @battler.state_animation_id
      loop_animation($data_animations[@state_animation_id])
    end
    if @battler.is_a?(Game_Actor) and @battler_visible
      if $game_temp.battle_main_phase
        self.opacity += 3 if self.opacity < 255
      else
        self.opacity -= 3 if self.opacity > 207
      end
    end
    if @battler.blink
      blink_on
    else
      blink_off
    end
    unless @battler_visible
      if not @battler.hidden and not @battler.dead? and
         (@battler.damage == nil or @battler.damage_pop)
        appear
        @battler_visible = true
      end
    end
    if @battler_visible
      if @battler.hidden
        $game_system.se_play($data_system.escape_se)
        escape
        @battler_visible = false
      end
      if @battler.white_flash
        whiten
        @battler.white_flash = false
      end
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
      if @battler.damage == nil and @battler.dead?
        if @battler.is_a?(Game_Enemy)
          $game_system.se_play($data_system.enemy_collapse_se)
        else
          $game_system.se_play($data_system.actor_collapse_se)
        end
        collapse
        @battler_visible = false
      end
    end
    self.x = @battler.screen_x
    self.y = @player_index == 0 ? @battler.screen_y - 160 : @battler.screen_y
    self.z = @battler.screen_z
  end
  #--------------------------------------------------------------------------
  # ● アニメーションスプライトのセット
  #--------------------------------------------------------------------------
  def animation_set_sprites(sprites, cell_data, position)
    for i in 0..15
      sprite = sprites[i]
      pattern = cell_data[i, 0]
      if sprite == nil or pattern == nil or pattern == -1
        sprite.visible = false if sprite != nil
        next
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
      if position == 3
        if self.viewport != nil
          sprite.x = self.viewport.rect.width / 2
          sprite.y = self.viewport.rect.height - (@player_index == 0 ? 320 :
            160)
        else
          sprite.x = 320
          sprite.y = 240
        end
      else
        sprite.x = self.x - self.ox + self.src_rect.width / 2
        sprite.y = self.y - self.oy + self.src_rect.height / 2
        sprite.y -= self.src_rect.height / 4 if position == 0
        sprite.y += self.src_rect.height / 4 if position == 2
      end
      sprite.x += cell_data[i, 1]
      sprite.y += cell_data[i, 2]
      sprite.z = 2000
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 100.0
      sprite.zoom_y = cell_data[i, 3] / 100.0
      sprite.angle = cell_data[i, 4]
      sprite.mirror = (cell_data[i, 5] == 1)
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
  end
end
#----------------------------------------------------------------------------
# ◆ Spriteset_DoublePlayers クラス
#----------------------------------------------------------------------------
class Spriteset_DoublePlayers
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :viewport1                # 1P 側のビューポート
  attr_reader   :viewport2                # 2P 側のビューポート
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport1.z = @viewport2.z = 101
    @p1_sprites = [
      Sprite_DoublePlayers.new(@viewport1, 0),
      Sprite_DoublePlayers.new(@viewport1, 0),
      Sprite_DoublePlayers.new(@viewport1, 0),
      Sprite_DoublePlayers.new(@viewport1, 0)
    ]
    @p2_sprites = [
      Sprite_DoublePlayers.new(@viewport2, 1),
      Sprite_DoublePlayers.new(@viewport2, 1),
      Sprite_DoublePlayers.new(@viewport2, 1),
      Sprite_DoublePlayers.new(@viewport2, 1)
    ]
    update
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    for sprite in @p1_sprites + @p2_sprites
      sprite.dispose
    end
    @viewport1.dispose
    @viewport2.dispose
  end
  #--------------------------------------------------------------------------
  # ● エフェクト表示中判定
  #--------------------------------------------------------------------------
  def effect?
    for sprite in @p1_sprites + @p2_sprites
      return true if sprite.effect?
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    @p1_sprites[0].battler = $game_doubleplayers[0].actors[0]
    @p1_sprites[1].battler = $game_doubleplayers[0].actors[1]
    @p1_sprites[2].battler = $game_doubleplayers[0].actors[2]
    @p1_sprites[3].battler = $game_doubleplayers[0].actors[3]
    @p2_sprites[0].battler = $game_doubleplayers[1].actors[0]
    @p2_sprites[1].battler = $game_doubleplayers[1].actors[1]
    @p2_sprites[2].battler = $game_doubleplayers[1].actors[2]
    @p2_sprites[3].battler = $game_doubleplayers[1].actors[3]
    for sprite in @p1_sprites + @p2_sprites
      sprite.update
    end
    @viewport1.update
    @viewport2.update
  end
end
#----------------------------------------------------------------------------
# ◆ Arrow_DoublePlayers クラス
#----------------------------------------------------------------------------
class Arrow_DoublePlayers < Arrow_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     viewport     : ビューポート
  #     player_index : プレイヤー インデックス
  #     enemy        : エネミー選択フラグ
  #--------------------------------------------------------------------------
  def initialize(viewport, player_index, enemy)
    @player_index = player_index
    @enemy = enemy
    super(viewport)
  end
  #--------------------------------------------------------------------------
  # ● カーソルが指しているアクターの取得
  #--------------------------------------------------------------------------
  def actor
    return $game_doubleplayers[@player_index].actors[@index]
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    $game_doubleplayers[@player_index].actors.size.times do
      break if self.actor.exist? or not @enemy
      @index += 1
      @index %= $game_doubleplayers[@player_index].actors.size
    end
    if Input.repeat?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      $game_doubleplayers[@player_index].actors.size.times do
        @index += 1
        @index %= $game_doubleplayers[@player_index].actors.size
        break if self.actor.exist? or not @enemy
      end
    end
    if Input.repeat?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      $game_doubleplayers[@player_index].actors.size.times do
        @index += $game_doubleplayers[@player_index].actors.size - 1
        @index %= $game_doubleplayers[@player_index].actors.size
        break if self.actor.exist? or not @enemy
      end
    end
    if self.actor != nil
      self.x = self.actor.screen_x
      self.y = @player_index == 0 ? self.actor.screen_y - 160 :
               self.actor.screen_y
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_actor(self.actor)
  end
end

戻る