にゃんころ部屋

ゲーム制作、日記などのブログ。
うどん県民、ブログ歴10年。

ダメージポップアップ

2022-06-26 05:24:03 | RGSS3
ダメージポップアップを触ってました。
画像は0~9と正負記号です。1つがx:10 y:15ドットの大きさです。
ダメージの数値を画像の位置と同期させて描画する方式です。
draw_textは使用しません。スクリプト内にはありますがテスト用の表示となります。確認用です。


配列num_listが描画用データです。3桁までしか描画できません。仕様上3桁で十分なので問題なしとします。

num_list[0]が正負記号です。10で+ 11で- です。
#回復判定で数値が負の場合絶対値に変換後(abs)num_list[0]に11を設定します。

numlist[1]が100の位 numlist[2]が10の位 numlist[3]が1の位です。
実行される値が何桁かによって処理が変わるのでまず桁数の確認です。
最新のRUBYは桁数の取得を行うdigit関数があるのですがaceのRGSSはバージョンが古いのでありません。
def count_digit関数で文字列に変換後、lengthで取得します。

数値が3桁の場合100の位は100で割ることで取得できます。
10の位は100で割った余りをさらに10で割ると取得できます。
1の位は100で割った余りをさらに10で割った余りとなります。
num_list[1] = num / 100
num_list[2] = (num % 100) / 10
num_list[3] = (num % 100) % 10

取得後描画します。
self.bitmap.stretch_blt(rect_2, n_bitmap, rect_1)

#==============================================================================
# ■ Sprite_PopUpMaster
#==============================================================================
class Sprite_PopUpMaster < Sprite
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
# ■フォント
FONT = ["Meiryo", "Impact", "Arial Black"] # フォント
# ■動力
M_OP = 30 # 透明化開始フレーム数(30)
OP_S = 15 # 透明度変化スピード(15)
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(pop = [""])

# スプライト設定
super(viewport = nil)
self.bitmap = Bitmap.new(40, 30)
self.bitmap.fill_rect(0, 0, 40, 30, Color.new(255, 255, 255, 128))
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
self.x = 90
self.y = 390
self.z += 200
self.opacity = 255

num_list = [10, 0, 0, 0]

#回復判定
pop.each{|value|
if value.is_a?(Numeric) and value < 0 #valueが数値で0未満の場合
pop[0] = value.abs #valueを絶対値に変換する。
num_list[0] = 11
end
}
#

num = pop[0] #rand(150)
p num.to_s + ":桁数"
p count_digit(num)

digit = count_digit(num)
case digit
when 1 #1桁
num_list[3] = num
when 2 #2桁
num_list[2] = num / 10
num_list[3] = num % 10
when 3 #3桁
num_list[1] = num / 100
num_list[2] = (num % 100) / 10
num_list[3] = (num % 100) % 10
else
p "桁数エラー"
end

p "num_list:"
p num_list

#
base_color = color = [Color.new(255,255,255), Color.new(100,100,100)]

pop.each{|value|
self.bitmap.font.name = FONT
self.bitmap.font.size = 15 #32

self.bitmap.font.color = base_color[0]
self.bitmap.draw_text_f(0, 15, 40, 15, value, base_color[1])
}
#

#描画
n_bitmap = Cache.system("Number")

num_list.each_with_index{|value, i|
rect_1 = Rect.new(value * 10, 0, 10, 15)
rect_2 = Rect.new(0 + i * 10, 0, 10, 15)
self.bitmap.stretch_blt(rect_2, n_bitmap, rect_1)
}
#

#~ self.bitmap.stretch_blt(self.bitmap.rect, n_bitmap, n_bitmap.rect)

# 動力設定
@delay = 0
@count = 0
self.visible = false if @delay > 0
end
#--------------------------------------------------------------------------
# ● 桁数の取得
#--------------------------------------------------------------------------
def count_digit(num)
return num.to_s.length
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose if self.bitmap != nil
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @delay > 0
@delay -= 1
return
end
self.visible = true

if @count >= M_OP
self.x -= 1
self.opacity -= OP_S
end

# 更新カウント加算
@count += 1
dispose if (self.opacity == 0)
end
end

画面左下+035が描画結果となります。
下の数値は確認用です。「35」なので正常に動作しています。
def updateで30フレーム経過後、左にスライドしながらフェードアウトします。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする