2017-04-26 12 views
0

2D 게임을 만들기 시작하고 업데이트 함수 또는 렌더링 함수에서 회전을 수행해야하는지에 대해 혼란스러워합니다.업데이트 함수 또는 렌더링 함수에서 2D 꼭지점 회전 수행

문제는 이것입니다.

3 개의 꼭지점으로 구성된 삼각형을 가지고 있습니다. 삼각형의 회전 값은도 단위입니다.

업데이트 기능에서 정점을 회전하면 각 업데이트가 회전을 반복해서 적용하기 때문에 삼각형이 완전히 회전합니다.

따라서 업데이트 함수에서 정점을 회전하지 않고 대신 원래 정점을 기준으로 렌더 함수에서 회전을 수행하기로 결정했습니다.

이 작동하지만 지금은 다른 문제가 있습니다. 꼭지점은 실제로 보이는 곳이 아닙니다. 따라서 충돌 감지 등을 수행하기 위해 정점을 사용할 수 없습니다.

유일한 해결책은 업데이트 기능에서 회전을 수행 할 수 있지만 두 개의 정점이 있습니다. 하나는 원래 정점, 하나는 회전 된 정점입니다. 그런 다음 충돌 감지 계산에서 회전 된 정점을 사용하십시오. 이는 해킹과 비효율적 인 냄새를 풍깁니다.

나는 render 함수에 회전을 적용하는 것을 보여주는 코드 픈을 작성했습니다. https://codepen.io/anon/pen/pPRjLq

Use arrow keys to rotate 

그래서, 렌더링 또는 업데이트에서 회전해야합니까? 렌더링하는 경우 버텍스를 최신 상태로 유지하려면 어떻게해야합니까? 업데이트하는 경우 무한 회전을 방지하려면 어떻게해야합니까?

경험 많은 사람의 도움을 주시면 감사하겠습니다. - 감사합니다!

답변

0

액터의 회전을 업데이트 할 때 update 메서드에서 회전이 발생했습니다.

두 개의 버텍스를 기억할 필요가 없습니다. 액터의 현재 버텍스와 회전 각도를 라디안으로 유지하는 것이 더 좋으며, 원래 버텍스를 기억할 필요가 없습니다.

미리 생각해 보면, 충돌 감지는 액터의 위치 벡터에 의존해서는 안되며, 그래도 여전히 정사각형/AABB가 정의되어있어 회전자가 액터에 적용될 때 업데이트/스케일되어야합니다 .

사용자 지정 AABB를 감지 용으로 사용한 경우 기본적으로 액터 벡터의 위치로 설정할 수 있지만 구문을 분리하여 액터 히트 경계 x/y/width를 변경하는 등 많은 가능성을 열어줍니다/실행시 길이; 액터 x/y/width/height와 결합되어서는 안됩니다.

무한 회전을 멈추려면 왼손잡이 키를 올리면, boolean이 있고 오른쪽 키는 비슷하게 나타납니다.

update(delta) { 

    if(keyLeftDown) { 
     // apply rotation as rotation * delta/desiredFPS 
    } else if (keyRightDown) { 
     // 
    } 
} 

희망이 도움이됩니다.