Godot3.5 でダメージ数値のフローティングテキストを出す
最初はメッセージウインドウだけでダメージ数値を表示していたが、それだと見ない
基本的にプレイヤーは主人公と敵の位置を見ていて、メッセージウインドウは見ない
ターンベースのコマンドRPGであればメッセージウインドウをずっと見ているだろうが、テンポを良く動くローグライクにしたので視線先が違う
実装
Position2Dノードの子ノードに LabelノードとTweenノードを置く
gdextends Position2D
onready var tween = $Tween
var velocity = Vector2(50, -100)
var gravity = Vector2(0, 1)
var mass = 120
var text_scale = Vector2.ONE
var text setget set_text, get_text
func _ready():
tween.interpolate_property(self, "modulate",
Color(modulate.r, modulate.g, modulate.b, modulate.a),
Color(modulate.r, modulate.g, modulate.b, 0.0),
0.3, Tween.TRANS_LINEAR, Tween.EASE_OUT, 0.7)
tween.interpolate_property(self, "scale",
Vector2(0, 0),
text_scale,
0.2, Tween.TRANS_QUART, Tween.EASE_OUT)
tween.interpolate_property(self, "scale",
text_scale,
Vector2(0.4, 0.4),
0.6, Tween.TRANS_LINEAR, Tween.EASE_OUT, 0.6)
tween.interpolate_callback(self, 0.8, "destroy")
tween.start()
func _process(delta):
velocity += gravity * mass * delta
position += velocity * delta
func set_text(new_text):
$Label.text = str(new_text)
func get_text():
return $Label.text
func destroy():
queue_free()
フローティングテキストを表示したいタイミングでこのノードを instance() 生成し、text を設定すれば表示される。
gdfunc add_player_floating_number(type, value):
var playerDamageFloatText = floaty_text.instance()
var player = get_player()
playerDamageFloatText.velocity = Vector2(rand_range(-4, 4), -70)
if type == NumberType.DAMAGE:
playerDamageFloatText.modulate = Color.pink
elif type == NumberType.RECOVER:
playerDamageFloatText.modulate = Color.green
playerDamageFloatText.text = value
player.add_child(playerDamageFloatText)
参考動画