오늘은 캐릭터가 돌에 맞으면 일정 시간 동안 무적을 유지하다가 지정한 시간이 끝나면 다시 돌에 맞게 하는 코드를 작성했어요!
오늘은 별로 어려움은 없었지만.. 집중력이 흐뜨러지는.... ~_~
우선 코드~~~
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 |