godot4.xの覚書です。
テキスト表示
クリックするとテキストを表示する機能を作ります。
player.gd
extends CharacterBody2D
func _ready():
position = Vector2(100, 100)
var addLabel
var label:Label
var cnt = 0
func _on_area_2d_input_event(viewport, event, shape_idx):
cnt = 0
#-----ツリーのノード名を検索
for child in get_children():
#print(child.name)
if "Label" in child.name:
cnt += 1
#print(child.name)
addLabel = child
#print("個数:" + str(cnt))
if cnt == 0:
#print("NoLabel" )
pass
#----------------------
if cnt == 0:
if event is InputEventMouseButton:
if Input.is_action_pressed("mouspress"):
#数値の表示
var damage = 123
var label = Label.new()
label.text = str(damage) + "player"
label.add_theme_color_override("font_color", Color(1, 0, 0, 1))
label.add_theme_font_size_override("font_size", 20)
add_child(label)
elif cnt >= 1:
#if txtFlag == true:
if event is InputEventMouseButton:
# マウスの入力があった
if event.is_pressed():
# オブジェクトを消す
addLabel.queue_free()
model.gd
extends Area2D
func _ready():
position = Vector2(300, 100)
var txtFlag:bool
func _on_input_event(viewport, event, shape_idx):
if event is InputEventMouseButton:
#数値の表示
var damage = 123
var label = Label.new()
label.text = str(damage) + "model"
label.add_theme_color_override("font_color", Color(1, 0, 0, 1))
label.add_theme_font_size_override("font_size", 20)
if txtFlag == false:
add_child(label)
txtFlag == true
for ii in range(10):
await get_tree().create_timer(0.1).timeout
label.add_theme_font_size_override("font_size", 2*(10-ii))
label.queue_free()
残像
スプライトアニメーションに残像を追加します。元のデータは以下です。r3が対応します。
元のシーンにあるAnimatedSprite2Dを別のシーンに保存します。(dog_ghost.tscn)
dog_ghost.tscnを残像用のシーンとして呼び出します。
呼び出し先は元のシーンにLayerシーン(GhostLayer)を追加します。
dog.gd
extends Area2D
const SPEED := 15.0
func _ready() -> void:
position = Vector2(400,500) #初期位置
scale = Vector2(2,2) #サイズ
func _process(delta: float) -> void:
#$AnimatedSprite2D.animation = &"walk"
#$AnimatedSprite2D.play()
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
velocity.x -= 1*delta
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.flip_h = false
diretFlag = 1
if Input.is_action_pressed("ui_right"):
velocity.x += 1*delta
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.flip_h = true
diretFlag = 2
if Input.is_action_pressed("ui_up"):
velocity.y -= 1*delta
$AnimatedSprite2D.animation = &"up"
diretFlag = 3
if Input.is_action_pressed("ui_down"):
velocity.y += 1*delta
$AnimatedSprite2D.animation = &"down"
diretFlag = 4
position += velocity.normalized() * SPEED
$AnimatedSprite2D.play()
#停止しているかを位置で判定
if posi == position:
state = eState.STOP
if posi != position:
posi = position
state = eState.RUN
#残像の呼び出し
read_ghost()
#残像の設定
var FreqNum:int = 5 #残像の表示頻度 2:多い 10:少ない
#dogの状態
enum eState {
STOP,
RUN,
}
var state = eState.STOP
var ghostNum = 0
@onready var ghostDog = $"GhostLayer"
const ghostSecene = preload("res://dog_ghost.tscn")
var diretFlag:int
var posi = Vector2.ZERO
func read_ghost() -> void:
if state == eState.STOP:
ghostNum = 0
return
# 残像の生成
ghostNum += 1
if ghostNum % FreqNum == 1:
# 残像エフェクト生成
var eft = ghostSecene.instantiate()
eft.start(position, scale,diretFlag)
ghostDog.add_child(eft)
dog_ghost.gd
extends AnimatedSprite2D
var delTime:float
#残像開始
func start(DogPos:Vector2, DogScale:Vector2,diretFlag:int):
position = DogPos
scale = DogScale
delTime = 1.0
if diretFlag == 1:
animation = &"walk"
flip_h = false
elif diretFlag == 2:
animation = &"walk"
flip_h = true
elif diretFlag == 3:
animation = &"up"
elif diretFlag == 4:
animation = &"down"
play()
func _process(delta: float) -> void:
delTime -= delta
if delTime <= 0:
queue_free()
pass
var alpha = delTime * 0.5
modulate.a = alpha
エフェクト
シーンは、爆発のエフェクトを発生させる本体(effect1.tscn)とエフェクトのシーン(exp.tscn)からなります。
effect1.tscn
extends Area2D
## 爆発シーンを読み込む
const ExpObj = preload("res://exp.tscn")
func _ready() -> void:
position = Vector2(100, 100)
scale = Vector2(5,5) #サイズ
func _on_input_event(viewport, event, shape_idx):
if event is InputEventMouseButton:
if event.is_pressed():
var explosion = ExpObj.instantiate()
#位置移動
explosion.position = position
# ルートノードに爆発オブジェクトを登録する
get_tree().root.add_child(explosion)
#削除
#queue_free()
exp.tscn
extends Sprite2D
const SPEED = 100 #エフェクト速さ
var passTime = 0.0 #時間計測用変数
func _ready() -> void:
#position = Vector2(100, 100)
scale = Vector2(5,5) #サイズ
func _process(delta: float) -> void:
# 経過時間を足し込む.
passTime += delta
frame = int(passTime * SPEED)
if frame >= 33:
# アニメーションが終わったら消す.
queue_free()
expのシーンはSprite2Dでスプライトシートの画像を設定します。
Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...
コメント