Project1
标题:
多个伤害数值显示的问题再问
[打印本页]
作者:
a364774426
时间:
2012-3-27 19:40
标题:
多个伤害数值显示的问题再问
本帖最后由 a364774426 于 2012-3-28 10:43 编辑
有没有人知道横版里怎么同时显示多个伤害数值呢?比如多段攻击的时候会同时显示出每一次攻击的伤害,而不是下一个数值替换掉当前的一个。最具体的就是冒险岛那种 dsu_plus_rewardpost_czw
作者:
消失的三千
时间:
2012-3-28 05:01
于是把STR的脚本改一改……丢上来了~
#==============================================================================
# ★RGSS2
# STR11d_XP風バトル#ダメージポップアップ v2.2 09/07/25
#
# ・バトラーにダメージ・ステートの変化等のポップアップが
# 出るようになります。
# ・数字ポップアップに画像を使用することが出来ます。
# 使用する数字グラフィックはSystemにインポートしてください。
#
# <規格>
# 並べ方 0123456789
# 幅 = 数字一コマの幅 * 10
# 高さ = 数字一コマの高さ * 5
# 一列目に通常の数字
# ニ列目に回復用数字
# 三列目にMPダメージ用数字
# 四列目にクリティカル用数字
# 五列目にMP回復用数字 を配置します。
#
#------------------------------------------------------------------------------
#
# 更新履歴
# ◇2.1a→2.2
# 吸収時のポップアップの仕様を変更
# (ダメージと回復を別々に表示させるようにした)
# MP回復用のフォントカラーを設定
# ・これに伴い、数字素材の規格が変更されました。ご注意。
# ◇2.1→2.1a
# HP吸収のポップアップ文字が間違っているミスを修正
# ◇2.0→2.1
# レベルアップ時にエラーが出るバグを修正
# ◇1.2s→2.0
# ★メジャーバージョンアップ
# ポップアップスプライトの挙動をほぼ全て変更
# →バウンド機能追加、設定箇所の簡略化
# スリップダメージ/自動回復のポップアップに対応
# 0ダメージがポップアップされない仕様は廃止になりました。
#
#==============================================================================
class Scene_Battle < Scene_Base
# ■ポップアップテキスト定数
MISS = "Miss!" # ミス
EVAD = "Evaded!" # 回避
FAIL = "Failed!" # 失敗
CRIT = "Critical!" # クリティカル
MPDA = "MP-Damage" # MPダメージ
MPRE = "MP-Recovery" # MP回復
V_MPDA = false # MPダメージのポップアップテキストを表示しない
V_MPRE = false # MP回復のポップアップテキストを表示しない
V_SLIP = false # スリップダメージ/自動回復をポップアップしない
V_EVAD = false # 回避をポップアップしない
V_FAIL = true # 失敗をポップアップしない
V_STAT = false # ステートの変化をポップアップしない
end
class Sprite_PopUpText < Sprite
# ■サイズ
DMPP_FSIZE = 32 # ダメージポップアップのサイズ
TXPP_FSIZE = 20 # 文字ポップアップのサイズ
TXPP_SY = 16 # 文字ポップアップのY座標修正
# ■数字1コマあたりのサイズ(pixel)
NW = 16 # 数字横幅 グラフィックを指定する場合は グラフィックの横幅 / 10
NH = 20 # 数字縦幅 グラフィックを指定する場合は グラフィックの縦幅 / 4
# ■数字グラフィックファイル名 指定しない場合は ""
FONTFILE = "Btskin_n00" # "Btskin_n02"
# ■フォント
FONT = ["Arial Black"] # 数字フォント
TFONT = ["MS Pゴシック", "UmePlus Gothic"] # 文字フォント
# ■フォントカラー
# 通常 中の色 / 縁の色
COLOR0 = [Color.new(255,255,255), Color.new( 0, 0, 0)]
# 回復
COLOR1 = [Color.new(128,255,192), Color.new( 0, 64, 0)]
# MPダメージ
COLOR2 = [Color.new(255,128,224), Color.new( 64, 0, 64)]
# クリティカル
COLOR3 = [Color.new(255,224,128), Color.new(192, 0, 0)]
# MP回復
COLOR4 = [Color.new(128,248,255), Color.new( 0, 0, 64)]
# ■動力
GRAV = 0.5 # 重力(この値が高いほど早く落下する)
JUMP = 4.0 # 上昇初速(この値が高いほど上に上がる)
BU_Y = 48 # 縦バウンド位置(ポップアップ位置が基準)
BUND = 5 # 縦バウンドさせる最大回数
LRMV = 2 # 左右の移動のバラつき(ランダム)
LRBW = true # 画面左右端でバウンドする
M_OP = 40 # 透明化開始フレーム数
OP_S = 16 # 透明度変化スピード
end
#==============================================================================
# ■ Bitmap
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ● 文字縁取り描画
#--------------------------------------------------------------------------
def draw_text_f(x, y, width, height, str, align = 0,
color = Color.new(64,32,128))
shadow = self.font.shadow
b_color = self.font.color.dup
font.shadow = false
font.color = color
draw_text(x + 1, y, width, height, str, align)
draw_text(x - 1, y, width, height, str, align)
draw_text(x, y + 1, width, height, str, align)
draw_text(x, y - 1, width, height, str, align)
font.color = b_color
draw_text(x, y, width, height, str, align)
font.shadow = shadow
end
def draw_text_f_rect(r, str, align = 0, color = Color.new(64,32,128))
draw_text_f(r.x, r.y, r.width, r.height, str, align = 0, color)
end
end
#==============================================================================
# ■ Sprite_PopUpText
#==============================================================================
class Sprite_PopUpText < Sprite
@@numcache = nil
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, pop = [""], flag = 0, delay = 0)
n_cache if @@numcache == nil
size = DMPP_FSIZE
# スプライト設定
super(nil)
self.bitmap = Bitmap.new(128, pop.size * (size + 4))
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
self.x = x
self.y = y - 56
self.z += 20
# フラグ 0 = 通常 1 = 回復 2 = MPダメージ 3 = クリティカル
case flag
when 0 ;color = COLOR0
when 1 ;color = COLOR1
when 2 ;color = COLOR2
when 3 ;color = COLOR3
when 4 ;color = COLOR4
end
# 描画
self.bitmap.font.color = color[0]
for i in 0...pop.size
if pop[i].is_a?(Numeric)
number(pop[i].abs, size * i, flag)
else
self.bitmap.font.name = TFONT
self.bitmap.font.size = TXPP_FSIZE
sy = TXPP_SY
h = TXPP_FSIZE
self.bitmap.draw_text_f(0, size * i + sy, 128, h, pop[i], 1, color[1])
end
end
# 動力設定
@delay = delay
@rx = self.x
@lrmove = (-LRMV * 10 + rand(LRMV*20+1))/10.0
@jump = JUMP
@yuka = self.y + BU_Y
@bound = BUND
@count = 0
self.visible = false if @delay > 0
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose if self.bitmap != nil
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @delay > 0
@delay -= 1
return
end
self.visible = true
self.x = @rx;@rx += @lrmove
self.y -= @jump
@jump -= GRAV
self.opacity -= OP_S if @count >= M_OP
# 縦バウンド
if self.y >= @yuka
self.y = @yuka
if @bound > 0
@jump = -@jump / 3 * 2
@jump -= 1
@jump = @lrmove = 0 if @jump.truncate <= 1
@bound -= 1
else
@jump = @lrmove = 0
end
end
# 横バウンド
if LRBW
if @rx <= 0
@rx = 1
@lrmove = -@lrmove
elsif @rx >= 544
@rx = 543
@lrmove = -@lrmove
end
end
# 更新カウント加算
@count += 1
dispose if (self.opacity == 0)
end
#--------------------------------------------------------------------------
# ● 数字キャッシュ作成/確保
#--------------------------------------------------------------------------
def n_cache
if FONTFILE == ""
c = [COLOR0, COLOR1, COLOR2, COLOR3, COLOR4]
@@numcache = Bitmap.new(NW * 10, NH * 5)
@@numcache.font.size = NH
@@numcache.font.name = FONT
for f in 0...c.size
@@numcache.font.color = c[f][0]
fc = c[f][1]
for i in 0..9
@@numcache.draw_text_f(i * NW, f * NH, NW, NH, i, 1, fc)
end
end
else
@@numcache = Cache.system(FONTFILE)
end
end
#--------------------------------------------------------------------------
# ● 数字描画
#--------------------------------------------------------------------------
def number(n, y, c)
n = (n.to_s).split('')
for i in 0...n.size do n[i] = n[i].to_i end
x = (self.bitmap.width / 2) - ((NW * n.size) / 2)
rect = Rect.new(0 ,0, NW, NH)
rect.y = c * NH
for i in n
rect.x = i * NW
self.bitmap.blt(x, y, @@numcache, rect)
x += NW
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
def hppopup
@hppopup = [] if @hppopup == nil
@hppopup
end
def hppopup=(a)
@hppopup = a
end
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_str11d initialize
def initialize
@hppopup = []
initialize_str11d
end
#--------------------------------------------------------------------------
# ● 行動効果の保持用変数をクリア
#--------------------------------------------------------------------------
alias clear_action_results_str11d clear_action_results
def clear_action_results
@hppopup = []
clear_action_results_str11d
end
#--------------------------------------------------------------------------
# ● スリップダメージの効果適用
#--------------------------------------------------------------------------
alias slip_damage_effect_str11d slip_damage_effect
def slip_damage_effect
ar_hp = self.hp
slip_damage_effect_str11d
@hppopup.push(ar_hp - self.hp) if ar_hp != self.hp
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 自動回復の実行 (ターン終了時に呼び出し)
#--------------------------------------------------------------------------
alias do_auto_recovery_str11d do_auto_recovery
def do_auto_recovery
ar_hp = self.hp
do_auto_recovery_str11d
@hppopup.push(ar_hp - self.hp) if ar_hp != self.hp
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ★ エイリアス
#--------------------------------------------------------------------------
alias start_str11d start
def start
@popup = []
start_str11d
end
alias terminate_str11d terminate
def terminate
for i in
[email protected]
@popup[i].dispose if @popup[i] != nil
end
@popup = nil
terminate_str11d
end
alias update_basic_str11d update_basic
def update_basic(main = false)
update_basic_str11d(main)
for i in
[email protected]
if @popup[i] != nil
@popup[i].update
@popup.delete_at(i) if @popup[i].disposed?
end
end
end
#--------------------------------------------------------------------------
# ● バトルイベントの処理
#--------------------------------------------------------------------------
alias process_battle_event_str11d process_battle_event
def process_battle_event
slippopup unless V_SLIP
process_battle_event_str11d
end
#--------------------------------------------------------------------------
# ● スリップダメージのポップアップ
#--------------------------------------------------------------------------
def slippopup
for i in $game_party.members + $game_troop.members
if i.hppopup.size > 0
for p in i.hppopup
array = [p]
@popup.push(Sprite_PopUpText.new(i.position_x, i.position_y, array))
end
i.hppopup.clear
end
end
end
#--------------------------------------------------------------------------
# ● ミスの表示
#--------------------------------------------------------------------------
alias display_miss_str11d display_miss
def display_miss(target, obj = nil)
t = target
tx = MISS
@popup.push(Sprite_PopUpText.new(t.position_x,t.position_y,[tx]))
display_miss_str11d(target, obj)
end
#--------------------------------------------------------------------------
# ● 回避の表示
#--------------------------------------------------------------------------
alias display_evasion_str11d display_evasion
def display_evasion(target, obj = nil)
unless V_EVAD
t = target
tx = EVAD
@popup.push(Sprite_PopUpText.new(t.position_x,t.position_y,[tx]))
end
display_evasion_str11d(target, obj)
end
def pop_damage(target, obj, action)
index = @active_battler.index
actor = @active_battler.actor?
if obj != nil
# スキルやアイテムが吸収属性なら
absorb = absorb_attack(obj, target, index, actor) if obj.absorb_damage
action.push(true) if absorb == 0
# 拡張設定でダメージアクション禁止なら
action[2] = false if obj.extension.include?("NOOVERKILL")
end
# 対象のリアクション
@spriteset.set_damage_action(target.actor?, target.index, action)
display_damage(target, obj)
end
#--------------------------------------------------------------------------
# ● HP ダメージ表示
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
t = target
c = 0
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
array = [t.hp_damage]
if target.critical
array.unshift(CRIT);c = 3
end
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
elsif target.absorbed # 吸収
array = [t.hp_damage]
n = t.hp_damage
c = (t.hp_damage >= 0 ? 0 : 1)
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
# 使用者の回復量を表示
t = @active_battler
array = [n]
c = (t.hp_damage >= 0 ? 1 : 0)
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
elsif target.hp_damage > 0 # ダメージ
array = [t.hp_damage]
if target.critical
array.unshift(CRIT);c = 3
end
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
else # 回復
array = [t.hp_damage]
if target.critical
array.unshift(CRIT)
end
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, 1))
end
# 呼び戻し
end
#--------------------------------------------------------------------------
# ● MP ダメージ表示
#--------------------------------------------------------------------------
def display_mp_damage(target, obj = nil)
return if target.dead?
return if target.mp_damage == 0
t = target
if target.absorbed # 吸収
array = [t.mp_damage]
n = t.mp_damage
if t.mp_damage >= 0
c = 2 ; array.unshift(MPDA) unless V_MPDA
else
c = 4 ; array.unshift(MPRE) unless V_MPRE
end
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
t = @active_battler
array = [n]
if t.mp_damage >= 0
c = 4 ; array.unshift(MPRE) unless V_MPRE
else
c = 2 ; array.unshift(MPDA) unless V_MPDA
end
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, c))
elsif target.mp_damage > 0 # ダメージ
array = [t.mp_damage]
array.unshift(MPDA) unless V_MPDA
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, 2))
else # 回復
array = [t.mp_damage]
array.unshift(MPRE) unless V_MPRE
@popup.push(Sprite_PopUpText.new(t.position_x, t.position_y, array, 4))
end
# 呼び戻し
end
#--------------------------------------------------------------------------
# ● 付加されたステートの表示
#--------------------------------------------------------------------------
def display_added_states(target, obj = nil)
unless V_STAT
t = target
tx = ""
delay = 0
for state in t.added_states
tx = state.name if state.id != 1
@popup.push(Sprite_PopUpText.new(t.position_x,t.position_y,[tx], 0, delay))
delay += 24
end
end
# 呼び戻し
end
#--------------------------------------------------------------------------
# ● 解除されたステートの表示
#--------------------------------------------------------------------------
def display_removed_states(target, obj = nil)
unless V_STAT
t = target
delay = 0
for state in t.removed_states
tx = state.name
@popup.push(Sprite_PopUpText.new(t.position_x,t.position_y,[tx], 1, delay))
delay += 24
end
end
# 呼び戻し
end
#--------------------------------------------------------------------------
# ● 失敗の表示
#--------------------------------------------------------------------------
def display_failure(target, obj)
unless V_FAIL
t = target
tx = FAIL
@popup.push(Sprite_PopUpText.new(t.position_x,t.position_y,[tx]))
end
# 呼び戻し
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1