너무너무 오랜만이라서 혹시 고도엔진을 잊고 계셨나요.....
사실 저도 잊고 있다가 너무너무 오랜만에 수업을 들으니까 어색하면서도 재밌었습니다!
저희가 저번 시간에 돌 씬까지 만들어줬는데요!
돌씬은 지금 만들어 주기만 했으니 아직 작동은 하지 않는 상태입니다.
하지만 저희는 이 돌이 위에서 아래로 떨어지게 해 줘야 돼요!
그래서 등장한 코드가 바로
extends Node2D
var speed = 400
func _ready():
pass
func _process(delta):
position.y += speed * delta
입니다. 하지만 이렇게 돌이 쭉 일정한 속도로 내려오면 게임이 너무 재미가 없잖아요?!
그렇기 때문에 가속도를 지정해 줘서 speed 에 지속적으로 더해 줘야 해요!
그럼 speed 의 값은 변하기 때문에 상수로 지정해줄 수 없어 var 로 지정해 주면 됩니다!
이제 delta 를 곱하는 것은 필수라는 것 다들 아시죠?
extends Node2D
const INIT_SPEED = 400
const ACCELERATION = 400
var speed = INIT_SPEED
func _ready():
pass
func _process(delta):
position.y += speed * delta
speed += (ACCELERATION * delta)
print(speed)
그래서 이러한 코드가 등장했어요!
저 A 로 시작하는 어려운 단어가 바로 가속도를 말합니닷.
그리고 돌은 화면을 벗어나면 사라지게 해야 합니다.
지금 사실 저희 눈에는 화면을 벗어나면 사라진 것처럼 느껴지지만 컴퓨터 내부에서는 돌이 계속 추락하고 있어요!
이게 쌓이고 쌓이다 보면 속도도 굉장히 느려지고, 렉도 걸리겠죠?
그렇기 때문에 저희가 지정해준 ViewPort 의 세로 길이인 960 을 넘어가면 소멸 시켜줍니다!
y 축은 아래로 갈수록 + 이기 때문에 y 가 960 보다 커지면 소멸시켜주면 돼요!
하지만 너무 딱 맞춰서 소멸시키면 이상하니까 임의의 값인 100을 더한 값에서 소멸 시킬게요!
extends Node2D
const INIT_SPEED = 400
const ACCELERATION = 400
var speed = INIT_SPEED
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
const MARGIN = 100
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
position.y += speed * delta
speed += ACCELERATION * delta
# print(speed)
if position.y >= (960 + MARGIN):
queue_free()
또! 여기서 새로 쓰인 메소드가 나왔는데요?!
바로 queue_free() 메소드입니다. 이것이 바로 소멸 시켜주는 메소드입니다!
사실 충돌을 하려면 충돌 영역 두 개가 만나야 하거든요!
근데 돌과 충돌하는 것은 플레이어이기 때문에 플레이어에서도 똑같이 충돌 영역을 만들어 주었습니다.
그리고 이제 Signals 를 사용해서 entered 즉, 충돌이 들어갔을 때 돌을 소멸시켜 줘야 합니다!
요기서는 스크립트가 있는 곳에서만 메서드를 만들 수 있습니다!
여기서는 player 밖에 없기 때문에 요기에 만들고 그럼 메서드가 자동 생성되어서 넘어갑니다!
메서드 이름에서 굳이 area 가 두 개일 필요는 없겠죠? 그래서 하나를 지워줬습니다.
func _on_hit_area_entered(area):
area.get_parent().queue_free()
자!! 여기서 생각을 좀 해야 해요!
지금 HitArea 에 맞았을 때 rock 이 사라져야 하기 때문에 HitArea 의 부모인 rock 이 사라져야 해요!
area 의 부모를 가져온 후 queue_free() 로 소멸 시켜야 하기 때문에 저러한 코드가 나오게 됩니다.
하지만 여기서 하나를 더 확인해 줘야 하는데요!
바로 HitArea 에서 우리가 생성해준 group 이 rock 인가? 입니다!
이게 맞다면 부모 즉, rock 을 소멸 시켜 주면 됩니다!
그럼 이러한 코드가 나오게 돼요!
func _on_hit_area_entered(area):
if area.is_in_group("rock"):
area.get_parent().queue_free()
그리고 저희는 이제 그냥 스크립트만 작성할 건데요!
이 때는
그냥 여기서 Other Node 를 누르면 됩니다!
그래서 Node 를 선택해 주면 아무것도 없이 스크립트만 작성할 수 있는 창이 떠요!
저희는 그냥 코드만 작성하면 되므로 이렇게 만들어주는 게 더 효과적이라고 생각합니다.
생각보다 너무 오랜만에 한 수업이라 엄청나게 진도를 나간 건 아니지만 또 새로운 지식이 1 추가되어서 기쁩니다!
모두 고도엔진 공부 파이팅 .^_~