레쭈고 godot

godot 10차시

정땅미 2024. 10. 31. 10:38

오늘은 캐릭터가 돌에 맞으면 일정 시간 동안 무적을 유지하다가 지정한 시간이 끝나면 다시 돌에 맞게 하는 코드를 작성했어요!

오늘은 별로 어려움은 없었지만.. 집중력이 흐뜨러지는.... ~_~

 

우선 코드~~~

extends Node2D

signal player_hit

const SPEED = 400
const CHARACTER_WIDTH_HALF = 40
var health
var dead = false
var invincible = false
var invincible_timer = Timer.new()
var invincible_time = 2

# Called when the node enters the scene tree for the first time.
func _ready():
	$AnimatedSprite2D.play("idle")
	health = 3
	add_child(invincible_timer)
	invincible_timer.wait_time = invincible_time
	

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	if not dead:
		var no_input = true
	
		if Input.is_action_pressed("left"):
			no_input = false
			scale.x = -1
			position.x -= SPEED * delta
		if Input.is_action_pressed("right"):
			no_input = false
			scale.x = 1
			position.x += SPEED * delta
			
		if no_input:
			$AnimatedSprite2D.play("idle")
		else:
			$AnimatedSprite2D.play("run")
		
		
	if position.x >= (540 - CHARACTER_WIDTH_HALF):
		position.x = (540 - CHARACTER_WIDTH_HALF)
	if position.x <= (0 + CHARACTER_WIDTH_HALF):
		position.x = (0 + CHARACTER_WIDTH_HALF)

func on_dead():
	dead = true
	$AnimatedSprite2D.play("dead")
	$AnimatedSprite2D.animation_finished.connect(_on_dead_animaition_finished)

func _on_dead_animaition_finished():
	queue_free()
	
func _on_invincible_end():
	invincible = false
	$Effects.stop()
	
func hit():
	invincible = true
	invincible_timer.timeout.connect(_on_invincible_end)
	invincible_timer.start()
	$Effects.play("hit")
	
	health -= 1;
	player_hit.emit()
	if health == 0:
		on_dead()
	

func _on_hit_area_entered(area):
	if not invincible and area.is_in_group("rock"):
		area.get_parent().queue_free()
		hit()

 

이건 player.gd 전체 코드이구요! 저는 오늘 추가한 일부분의 코드만.. 적도록 하겠씁니닷....

 

우선 이 코드를 작성해주기 전에 Effects 라고 이름을 바꾼 새로운 노드를 추가해 줬어요!

그리고 처음에는 그 캐릭터의 투명도를 var invincible = false 로 줍니닷.

처음에는 무적 상태가 아니라는~ 의미예요!

func hit():
invincible = true
$Effects.play("hit")

그리고 이렇게 맞았을 때는 true 로 바꿔주고 캐릭터가 hit 을 플레이할 수 있게 해줍니다.

제가 이미 그 이미지의 애니메이션에 들어가서 투명도와 몇 초 사이 간격의 색 변화를 주었어요!

 

이런 식으로 이미!~ hit 이라는 이름으로 애니메이션은 다 주었기 때문에 코드를 쓰고 잇어여.

 

그리고 여기서 만약 invincible 이 false 라면 돌을 맞게 해 줬어요

not invincible = false 라는 의미예요! 그래서 이때만 돌을 맞게 해주면 됩니닷.


func _on_hit_area_entered(area):
if not invincible and area.is_in_group("rock"):
area.get_parent().queue_free()
hit()

타이머를 설정해서 몇 초 후에 무적이 풀릴지 노드로 해도 되고, 코드로 해도 돼요!

하지만 저는 그냥 코드로 작성했어여

근데 ready() 에서 add_child() 를 안 하면 에러가 발생하기 때문에 꼭 timer 를 연결해 줘야 해요!

 

그리고 위에서 2초를 지정해 주고,
var invincible_time = 2

func _ready():
$AnimatedSprite2D.play("idle")
health = 3
add_child(invincible_timer)
invincible_timer.wait_time = invincible_time

 

이렇게 2초 동안 기다려주도록 하면 됩니다.

invincible_timer.timeout.connect(_on_invincible_end)
여기서 _on_invincible_end 함수를 호출하는데요!

이제 만들어서 거기에서, Effects(깜박이는 효과) 멈추게 하고 무적이 아니게 해야 해요~

func _on_invincible_end():
invincible = false
$Effects.stop()

바로  이 코드입니닷! 그래서 다시 무적을 false 로 해주고 Effects 를 멈춰주시면 돼요!

 

이렇게 되면 저의 의도대로 코드가 실행됩니당. O_O

맨날 제 스스로 까먹지 말자고 블로그를 쓰는 건데... 도움이 되겠죠?

저도 스스로 고도엔진 툴로 게임을 만들고 싶어요!

 

그럼 그 날이 올 때까지 열심히 달려보겠쑴미다. 파이팅~

'레쭈고 godot' 카테고리의 다른 글

godot 12차시  (0) 2024.11.19
godot 11차시  (4) 2024.11.10
godot 9차시  (1) 2024.10.23
godot 8차시  (1) 2024.10.20
godot 7차시  (1) 2024.09.27