2d 이동 로직 관련 질문 드립니다.
안녕하세요 강의를 들으면서 메이플스토리 모작 2d 포폴을 만들고 있습니다.
상태 변화에 따른 처리 로직을 만들던 중 한 가지 질문드립니다.
void Player::OnComponentBeginOverlap 땅과 충돌 했을때
SetState(PlayerState::MoveGround) 로 바꿔주어서 중력 작용을 받지 않게하고
void Player::OnComponentEndOverlap 땅과 충돌이 끝났으면
SetState(PlayerState::GroundFall) 로 바꿔주면서 중력 작용을 받게 하는
충돌 처리 로직이 - 충돌 했을때 밀어주는 방법을 사용하여 플레이어 상태가 GroundFall <-> MoveGround 상태를 계속 왔다 갔다 하면서 동작을 하게 됩니다.
땅과 떨어졌을때 계속 중력을 받아야 하는건 맞는 상태인 것 같은데 플레이어의 상태가 계속 변화하는 문제가 생기게 됩니다.
-> 땅과 떨어 졌을때는 GroundFall 상태로만 되고 땅과 붙었을때는 MoveGround 상태로만 동작이 되었으면 합니다.
State 패턴 강의에서 슈퍼마리오 예제를 하시다.
아름다운 방법을 찾으셨다고 말씀 하셨는데 어떠한 방법으로 해결 하셨는지 알 수 있을까요?
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
gamecoding님, 2D 게임의 이동 로직 구현과 관련된 질문 잘 받았습니다.
주신 상황 설명을 바탕으로, Player 상태가 MoveGround와 GroundFall 사이를 오가며 일관되지 못한 동작을 보이는 이슈는 충돌 검사 로직에서 시작되는 것 같습니다. 특히 땅에 닿았을 때와 떨어졌을 때의 상태 변화를 처리하는 부분에서 문제가 발생하고 있는 것으로 이해됩니다.
이 문제를 해결하기 위한 한 가지 방법은, 땅과의 충돌 상태를 좀 더 정밀하게 관리하는 것입니다. 예를 들어, 플레이어가 땅에 완전히 닿아있는지 여부를 유지하는 추가적인 변수를 두어 상태 변화를 결정짓는 하나의 조건으로 활용할 수 있습니다. 또한 땅에 닿은 부분의 갯수를 세어서 그 갯수가 0이 될 때만 GroundFall 상태로 전환하게 하는 방법도 있습니다.
특정 상태에서 다음 상태로의 전이를 결정질 때, 추가적인 조건을 검사하는 것은 상태 패턴에서 흔히 사용되는 기법입니다. 이 경우, OnComponentBeginOverlap과 OnComponentEndOverlap 이벤트만으로 상태 전환을 결정하는 것이 아니라, 현재 플레이어의 위치, 속도, 혹은 다른 물리적 상호작용 과정들을 함께 고려하여 상태를 변경하게 됩니다.
스테이트 패턴에서 마리오 예제와 같은 아름다운 해결 방법을 찾은 경우, 보통은 상태 기계(State Machine)의 각 상태가 언제 어떻게 전환되어야 하는지를 명확히 정의하고, 각 상태가 자기 책임을 가지도록 설계함을 의미합니다. 즉, 각 상태는 특정 조건이 충족될 때만 다른 상태로 전환되도록 철저히 관리되어야 합니다.
구체적인 구현 방법에 대해서는 해당 강의의 내용과 문맥에 맞는 코드 예제를 참고하는 것이 가장 좋습니다. 직접 해당 문제를 해결하셨던 강의 내용을 복습하거나, 추가적인 예제를 찾아보시는 것도 도움이 될 것 같습니다.
충돌 처리 로직을 더 세밀하게 관리하기 위한 코드 예제 및 설계 방법을 더 알고 싶으시다면, 게임 개발 커뮤니티나 Stack Overflow와 같은 플랫폼에서 관련 키워드(예: “game collision state machine”, “platformer grounded check”)로 검색해보시길 추천드립니다. 또한 강의자분께 추가적인 질문을 하시거나, 코드 리뷰를 요청해보는 것도 좋은 방법이 될 수 있습니다.
눈에 보이지 않는 논리적인 문제를 해결하기 위해서는, 때때로 다양한 조건들을 조합하고, 상태 변화 조건을 좀 더 세심하게 조정하는 작업이 필요합니다. 상태 패턴을 적절히 활용하여 플레이어의 이동 로직이 원활하게 동작하도록 만드시길 바랍니다.
문제집은 없나요 수업을 어떻게 들어야 할지 모르겠어요
0
106
2
동적배열 Vector의 push_back 함수에서 조건문 질문
0
74
1
디버깅할때 메모리보는법 단축키가 뭐죠??
0
89
1
113-충돌처리 강의에서 22:26 부근의 SetPos()를 적용해도 충돌되지 않고 뚫고 지나가게 됩니다.
0
87
1
SaveFile에서 크래시 발생하는 분들 체크해보세요
1
70
1
수업자료 확인 부탁드립니다.
0
105
3
explicit을 붙였을 때 빨간줄이 뜨는 이유가 맞는지 궁금합니다.
0
100
0
22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?
0
88
2
리소스 매니저 강의 18분 부근
0
89
1
[Service강의] owner -> shared_ptr
0
80
2
C#에서 생성자 관련 질문
0
83
2
특정 조건에서만 함수를 반환할 때
0
90
2
스택 empty
0
105
2
섹션4 배열실습 질문입니다.
0
132
1
섹션3 '파일분할' 강의 질문입니다.
0
99
1
Defines.h의 DECLARE_SINGLE관련 질문입니다.
0
110
1
세션8 우선순위 큐 pop함수의 Predicate 적용 관련 질문이 있습니다.
0
180
3
섹션9 함수 포인터 관련 질문입니다.
0
137
1
exercise_A 번 문제 해결방법에 대한 질문.
0
150
1
[강의명: virtual 소멸자] 자식 클래스의 소멸자에도 virtual 을 붙이시는 이유가 궁금합니다
0
198
2
Scene과 SceneManager 강의 수강 중 키보드 입력 오류
0
146
1
Window API 강의 수강 중 LARGE_INTEGER 타입 변환 오류
0
198
3
섹션15 스마트 포인터 20:00 질문이요!
0
127
1
55강 수업자료 빌드를 하면 이상합니다.
0
132
1





