해결된 질문
작성
·
303
·
수정됨
0
안녕하세요 강의를 들으면서 메이플스토리 모작 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”)로 검색해보시길 추천드립니다. 또한 강의자분께 추가적인 질문을 하시거나, 코드 리뷰를 요청해보는 것도 좋은 방법이 될 수 있습니다.
눈에 보이지 않는 논리적인 문제를 해결하기 위해서는, 때때로 다양한 조건들을 조합하고, 상태 변화 조건을 좀 더 세심하게 조정하는 작업이 필요합니다. 상태 패턴을 적절히 활용하여 플레이어의 이동 로직이 원활하게 동작하도록 만드시길 바랍니다.
감사합니다 !