2011-04-05 5 views
4

포켓몬과 비슷하게 맨 아래로, RPG 형식의 게임을 만들고 있지만 캐릭터의 움직임에 고생하고 있습니다. 기본적으로, 내가 달성하고자하는 것은 맵에서 내 플레이어 및 다른 사람들을위한 부드러운 타일 기반의 이동 시스템입니다. 누구든지 효과적으로 이것을 할 수 있었습니까? 그렇다면 어떻게?XNA의 진보 된 RPG 스타일 이동

+0

현재 캐릭터를 어떻게 움직입니까? –

답변

8

포켓 몬스터와 같이 그리드 시스템을 사용하는 경우 타일 사이를 이동할 수있는 속도를 설정하여이를 수행 할 수 있습니다.

예를 들어, 한 타일을 1 초 움직일 수 있도록 만든 경우 Update 함수에서 (float)gameTime.ElapsedGameTime.TotalSeconds을 사용하여 게임이 얼마나 빨리 업데이트되는지 확인할 수 있습니다. 이걸로 캐릭터가 각 업데이트 ((float)gameTime.ElapsedGameTime.TotalSeconds * TileSize)을 움직일 수 있도록 만들어야합니다.

이것은 4 개의 업데이트가 1 초 (매우 느리지 만 예를 들어) 인 경우 매 업데이트마다 타일에 1/4의 거리를 이동하고 이동이 끝날 때 끝점에 도달한다는 것을 의미합니다 기간 (이 경우 1 초). 이 상황에서, 당신은 32 픽셀 타일을 가지고 있다면, 그들은 0.25 * 32마다 업데이트, 또는 8 픽셀 이동합니다.

희망이 도움이됩니다.

+0

매우 흥미 롭습니다 ... 감사합니다! 나는 가능한 한 빨리 이걸 줄 것이다! – Xedfire

+0

행운을 빈다. 출발점을 알려줄 수있어서 기쁩니다. – Lyise

2

원하는 '기술'단어는 '보간'입니다.

당신이하고 싶은 가장 간단한 것은 시작 시간 (타일 시작 중간)과 종료 시간 (중간 타일 끝) 사이의 단위 위치를 보간하는 것입니다. 부드러운 움직임.

공식은 이런 식입니다 : 게임에서

float k = timeSinceStarted/durationOfMovement; 
pos.X = startPos.X + (endPos.X - startPos.X) * k; 
pos.Y = startPos.Y + (endPos.Y - startPos.Y) * k; 

, 그것은 델타를 미리 계산하고, 대신에 시작 위치를 저장하는 단위를 추가하는 아마 좋습니다. 이 같은 (참고 :이 계산을 두 번 확인하지 않았습니다).

delta = endPos - startPos; 

position += delta * (timeSinceLastUpdate/durationOfMovement);