godot

L014 エフェクト


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...

コメント