본문 바로가기

Programming/Godot

고도 엔진 횡스크롤 게임 예제 (Godot Platformer) - 2

반응형

1. Coin 만들기

  - new scene > Area2D(Coin) 노드추가, Coin Image추가


  - CollisionShape2D추가, circle shape 선택 후 사이즈 조정합니다. 


  - AnimationPlayer추가 (Objects폴더 생성 후 scene저장)


  - animation - new animation: bouncing


  - timeline 오른쪽에 시간을 1.8로 전체 애니메이션 시간을 설정
  - timeline 오른쪽의 반복기능 on


  - 뷰포트의 rotation mask for inserting keys를 언체크함
  - 뷰포트의 Translation mask for inserting keys만 체크함


  - Coin 노드 선택 후 ins키나 뷰포트의 key를 누르면 애니메이션에 key가 추가됨

  - 0.9초에 key frame추가 후 y 값을 -10으로 설정
  - 첫 key frame의 y값을 +10으로 설정


  - 첫 프레임의 easing 진동하는 속도...를 상향 조정한다.
  - 두번째 프레임의 easing 을 하향 조정한다.


  - animation time을 1.2로 수정하여 짧게 변경하고, 두번째 프레임의 위치도 중간인 0.6정도로 위치를 변경합니다.


  - animation - new animation: fade_out 애니메이션을 추가합니다.


  - Coin(Area2D)선택
  - transform에서 원점인지 확인 후 작업을 진행합니다.


  - canvasItem > visibility > modulate 오른쪽의 key를 클릭하여 0에서, 0.6초에서 프레임을 추가하면  Modulate속성이 애니메이션에 추가됩니다.


  - 0.6초로 key frame이동 후 Modulate 오른쪽의 key를 클릭 후 alpha를 0으로 수정


  - animation 시간을 0.6초로 변경
  - shift+D로 프리뷰 가능

  - bouncing에서 첫 프레임에 modulate에서 key 추가하여 alpha 100%를 추가


  - fade_out에서 마지막 프레임에 add track버튼 - call method track 버튼 - method 추가


  - coin(Area2D)노드 선택 후 프레임의 오른쪽클릭 후 insert method 클릭

  - queue free()선택

  - Coin 스크립트 추가

<coin.gd>

extends Area2D

onready var anim_player: AnimationPlayer = get_node("AnimationPlayer")
#_ready 실행하기 전에 실행

func _on_body_entered(body:PhysicsBody2D) ->void:
	anim_player.play("fade_out")

 

  - Coin에서 layer는 coin, Mask는 player로 선택

  - signal 추가: body_entered(PhysicsBody2D body) 


  - bouncing 클릭 후 오른쪽의 버튼을 누르면 기본 animation으로 선택됨

 


  - 여기까지 따라하면 코인의 움직임이 안보입니다. animation이 Coin(Area2D)에 설정되어있어서 Play를 시작하면 animation이 원점에서 실행되고 있습니다. 이를 방지하려면 coin(sprite) 노드가 애니메이션되도록 해야합니다. 코인의 AnimationPlayer노드로 가서 ".:position" 으로되어있는 부분을 "coin:position"으로 바꿔줍니다.

  - fade_out 에니메이션을 0.4초로 변경

 

2. Portal 생성

 

  - Portal2D(Area2D)노드를 추가하고 Portal 이미지를 추가합니다.


  - CollisionShape2D 추가
  - CapsuleShape 설정


  - TransitionLayer(canvaslayer) 노드를 추가해주고, 다른 어떤 것보다도 앞에 있어야하므로 Layer 값을 +100 정도로 설정해줍니다.


  - TransitionLayer에 ColorRect 노드를 추가하여 Black으로 색깔 변경하고(layout-Full rect)하고 alpha는 0으로하여 기본적으로는 안보이게 설정합니다.


  - AnimationPlayer 추가
     ○ start애니메이션 추가. 시작될 때 검은 화면이 다시 투명하게 바꾸는 역할을 하는 애니메이션입니다.

     ○ autoplay 체크

     ○ ColorRect선택-color key 지정(투명, 처음엔 안나타나게)
     ○ Visible: off(value: off)로 선택하고 key 지정

     ○ 지속시간은 0으로 하여 한번 투명하게 값을 설정하고 끝내도록 합니다.

Visibility off인지 한번 더 확인


     ○ fade_in애니메이션 생성 (START애니메이션 복제(Ctrl+D))

     Q Visibility는 On

     ○ 지속시간 1초

     ○ 1초에 key frame 추가 - color 선택에서 alpha 255%(블랙)으로 설정 후 키 추가


  - Portal2D Monitoring: on, Monitorable: off, Layer: none, Mask: player 로 설정

3. Portal 스크립트

<protal2D.gd>

tool
extends Area2D

onready var anim_player: animationPlayer = $AnimationPlayer

export var next_scene: PackedScene

func _on_body_entered(body: PhysicsBody2D) -> void:
	teleport()

func _get_configuration_warning() -> String:
	return "The next scene property can't be empty" if not next_scene else ""

func teleport() ->void:
	anim_player.play("fade_in")
	yield(anim_player, "animation_finished") #anim_player가 끝나서 animation_finished 시그널을 보낼 때까지 기다림
	get_tree().change_scene_to(next_scene)
 

  - nextscene을 export로 추가하고, 없으면 에러메세지 popup띄우는 기능 추가

  - teleport함수 추가
  - body_entered(PhysicsBody2D body) 시그널 연결 : _on_body_entered
  - Level을 우선 복제하여 테스트

#참고로...터치패드에서 대량으로 tilemap을 지울 때에는 우클릭에 해당하는 두손가락 클릭을 하는데,,,한번하면 생성, 두번하면 삭제
#한손가락은 패드도 눌러야하고, 검지손가락은 터치도 해야함...두번씩....

반응형