node.js와 express를 사용하고 있으며 nowjs를 사용하여 서버 측 함수를 호출하고 변수를 동기화하고 있습니다. 사용자가 캔버스에 스프라이트로 그려져 있다고 가정합니다. 그의 x, y 좌표는 서버 측에서 "위치"배열로 유지됩니다.Node.js/Nowjs - 스프라이트 이동 및 서버 측 시간 추적
서버 측 :
position = { x : 0; y : 0 }
updatePosition = function (a,b)
{
playerPosition.x += a;
playerPosition.y += b;
}
클라이언트 측 :
if keypress('right'){ updatePosition(32,0); }
이들은 의사입니다. 사용자가 '오른쪽'버튼을 누르면 서버 측의 "updatePosition"함수가 호출되어 "position"배열의 x 좌표에 32 (픽셀)를 더합니다. 그런 다음이 배열을 클라이언트와 공유하고 클라이언트 측 함수를 사용하여 새 위치를 캔버스에 그립니다.
스프라이트를 즉시 새 위치에 그리기를 원하지 않는다고 가정 해 봅니다. 스프라이트를 점차적으로 오른쪽으로 32 픽셀 이동하고 완료하는 데 1 초가 걸리는 워킹 애니메이션을 재생하고 싶습니다. 나는 이것을 다음과 같이 구현할 수있다 :
- 사용자는 'right'버튼을 누른다.
- 애니메이션이 클라이언트 측 재생을 시작합니다.
- updatePosition은 일반적으로 서버 측이라고합니다.
- 클라이언트의 애니메이션이 끝나면 클라이언트 측 최종 위치가 서버 측 저장된 좌표와 일치하는지 확인합니다.
사용자가 '권리'버튼/키를 누르면, 그는 1 초 후까지의 키를 반복 할 수 없습니다. 1 초 길이의 "워킹"애니메이션이 완료되어야하고 최종 위치는 서버 측 좌표로 검사되어 다시 '오른쪽'을 눌러 스프라이트를 움직일 수 있습니다.
질문 : 1 초 서버 측을 어떻게 추적합니까? 사용자가 애니메이션 시간을 줄이기 위해 클라이언트를 해킹 할 수 있기 때문에 클라이언트 쪽에서 할 수 없습니다.
위치 배열의 "타임 스탬프"솔루션입니까? 예 : 위치 = {x : 0; y : 0, 시간 : 0}. 사용자가 '오른쪽'버튼을 다시 누르면 서버는 마지막 위치 업데이트가 1 초 전인지 여부를 확인합니다. 1 초 미만이면 서버가이를 무시합니다.
내가 잘못하고 있다고 말하고 싶습니다. 이러한 기능은 클라이언트 측에서만 구현되어야합니다. 클라이언트 전용 기능에 대해서는 서버 코드를 수정하지 않아야합니다. 예를 들어, 애니메이션이 끝날 때'updatePosition'을 호출하지 않는 이유는 무엇입니까? 또는 사용자가 다른 시간을 클릭하면 애니메이션이 중단됩니까? 또는 단순히 쌓아 올리면됩니까? 이것은 중요한 기능입니까? – Pierre
완료하려면 1 초가 걸릴 애니메이션이 필요합니다. 사용자는 0.5 초 안에 애니메이션을 끝내기 위해 클라이언트를 해킹 할 수 있습니다. 여러 사용자가있는 경우 해커는 다른 모든 사용자보다 두 배나 빠르게 이동할 수 있습니다. – Legendre
알겠습니다. 고마워요. – Pierre