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
戻る