Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CHAPTER 4 정글 점프: 2D 플랫포머의 달리기와 점프 #891

Open
Tracked by #871
jongfeel opened this issue Aug 19, 2024 · 0 comments
Open
Tracked by #871

CHAPTER 4 정글 점프: 2D 플랫포머의 달리기와 점프 #891

jongfeel opened this issue Aug 19, 2024 · 0 comments
Assignees
Labels
2024 Godot 4 Game Development Projects - Second Edition 고도 엔진 4 게임 개발 프로젝트 - 최고의 오픈 소스 게임 엔진으로 크로스 플랫폼 2D 및 3D 게임 5가지 만들기, 제2판

Comments

@jongfeel
Copy link
Owner

jongfeel commented Aug 19, 2024

4 - Jungle Jump - Running and Jumping in a 2D Platformer

플랫포머 게임: 슈퍼 마리오 브라더스 같은 방식
플랫포머 플레이어 움직임을 구현하려면 CharacterBody2D 노드가 필요하다.

이 프로젝트에서는 다음 내용을 학습하게 된다.

  • Use CharacterBody2D node
  • Use Camera2D node
  • Create complex character moving combination between animations and user inputs
  • Level design use TileMap
  • Create infinite scroll background use ParallaxLayer
  • Switching between scenes
  • Structured project and planning expand

4.1 Technical Requirements

Download assets:
https://github.com/PacktPublishing/Godot-4-Game-Development-Projects-Second-Edition/tree/main/Downloads

4.2 Setting up the project

default texture filter set to Nearest:

image

stretch mode set to cavas_items:
stretch aspect set to expand:

image

layer_names > 2d_physics:

image

Input map actions:

image

4.3 Introducing kinematic bodies

플랫포머에는 gravity, collision, jump 등의 물리 동작이 필요하므로
캐릭터 움직임에 RigidBody2D를 써야 한다고 생각할 수 있다.

하지만 실제로 RIgidBody의 물리 움직임은 플랫폼 캐릭터에는 적합하지 않다.
이유는 사실성 있는 물리 동작 보다는 반응적 컨트롤과 액션감이 중요하기 때문이다.

Kinematic 방식의 물리가 플랫폼 캐릭터에 더 적합하다.

CharacterBody2D는 코드를 통해 직접 제어하는 물리 바디를 구현하기 위해 설계되었다.
Collision 감지는 필요하지만 중력이나 마찰 같은 물리 속성의 영향은 받지 않는다.
중력을 비롯한 힘force의 영향을 주려면 코드에서 계산해야 물리 엔진이 CharacterBody2D 노드를 자동으로 움직이지 않는다.

CharacterBody2D는 position 속성을 설정하는 것이 아니라
move_and_collide(), move_and_slide() 메서드를 사용한다.
이는 주어진 벡터를 따라 이동하다가 다른 바디와 collision이 감지가 되면 멈춘다.
그 뒤에 collision response는 구현하기 나름이다.

4.3.1 Collision response

move_and_collide()

collision 이후 KinematicCollision2D를 반환한다.
여기에는 collision 및 body에 대한 정보가 있다.
이 정보를 통해 response를 결정할 수 있다.

collision이 없다면 (이동이 성공적으로 완료된다면) null을 반환한다.

예로
body가 collision object에서 튕겨나가려면 다음 스크립트를 사용한다.

extends CharacterBody2D

velocity = Vector2(250, 250)

func _physics_process(delta):
    var collision = move_and_collide(velocity * delta)
    if collision:
        velocity = velocity.bounce(collision.get_normal())
move_and_slide()

플레이어가 벽을 따라 이동하거나 플랫포머에서 바닥을 따라 달리는 것을 구현한다.
이 함수를 쓰면 body가 충돌하는 오브젝트의 표면을 따라 자동으로 미끄러진다.
sliding collision을 통해 is_on_floor() 메서드를 써서 표면의 방향을 감지할 수 있다.

플랫포머 게임에서 캐릭터가 지면과 위/아래 경사면을 따라 달려야 하므로
move_and_slide()는 움직임에 큰 역할을 한다.

4.4 Creating the player scene

4.4.1 Collision layers and masks

4.4.2 About AnimationPlayer

AnimationPlayer는 한 번에 여러 노드에 영향을 줄 수 있는 애니매이션을 만들 수 있다.
노드의 모든 속성을 수정할 수 있다.

4.4.3 Animations

4.4.4 Collision shape

4.4.5 Finishing the player scene

4.4.6 Player states

image

4.4.7 Player script

4.4.8 Player movement

4.4.9 Player health

4.5 Collectible items

4.5.1 Scene setup

4.5.2 Collectible script

4.6 Designing the level

4.6.1 Using TileMaps

4.6.2 Designing the first level

4.6.3 Adding dangerous objects

4.6.4 Scrolling background

4.7 Adding enemies

4.7.1 Scene setup

4.7.2 Scripting the enemy

4.7.3 Damaging the enemy

4.7.4 Player script

4.8 Game UI

4.8.1 Scene setup

4.8.2 Scripting the HUD

4.8.3 Attaching the HUD

4.9 Title screen

4.9.1 Scene settup

4.10 Setting up the main scene

Scene 전환 시 필요한 데이터를 추적하기 위해 autoload를 사용한다.

Godot에서는 script, scene을 autoload 할 수 있다. 이는 엔진이 항상 자동으로 로드한다는 뜻이다.
SceneTree에서 현재 씬을 변경해도 autoload된 node는 그대로 유지된다.
Autoload scene은 게임의 다른 노드에서 이름으로 참조할 수 있다.

image

4.11 Transitioning between levels

4.11.1 Door scene

4.11.2 Screen settings

image

Aspect 값이 expand 라면 창의 너비를 넓게 해도 플레이어의 왼쪽/오른쪽에서 더 많은 게임 월드를 볼 수 있다.
이를 방지하려면 keep으로 설정한다. 그러면 카메라에 표시되는 것과 동일한 양의 게임 월드가 항상 표시된다.
하지만 창 모양을 게임과 다른 비율로 만들면 검은색 막대가 여분의 공간을 채울 것이다.
ignore로 설정할 수도 있다. 검은색 막대는 표시되지 않지만 게임 콘텐츠가 공간을 채우기 위해 늘어나게 되고 이미지가 왜곡된다.
여러 설정을 시험해 보고 어떤 설정이 좋은지 결정한다.

@jongfeel jongfeel self-assigned this Aug 19, 2024
@jongfeel jongfeel added 2024 Godot 4 Game Development Projects - Second Edition 고도 엔진 4 게임 개발 프로젝트 - 최고의 오픈 소스 게임 엔진으로 크로스 플랫폼 2D 및 3D 게임 5가지 만들기, 제2판 labels Aug 19, 2024
@jongfeel jongfeel moved this to In progress in 2024 jongfeel's study tasks Aug 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2024 Godot 4 Game Development Projects - Second Edition 고도 엔진 4 게임 개발 프로젝트 - 최고의 오픈 소스 게임 엔진으로 크로스 플랫폼 2D 및 3D 게임 5가지 만들기, 제2판
Projects
Status: In progress
Development

No branches or pull requests

1 participant