2012-05-25 3 views
1

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 초가 걸리는 워킹 애니메이션을 재생하고 싶습니다. 나는 이것을 다음과 같이 구현할 수있다 :

  1. 사용자는 'right'버튼을 누른다.
  2. 애니메이션이 클라이언트 측 재생을 시작합니다.
  3. updatePosition은 일반적으로 서버 측이라고합니다.
  4. 클라이언트의 애니메이션이 끝나면 클라이언트 측 최종 위치가 서버 측 저장된 좌표와 일치하는지 확인합니다.

사용자가 '권리'버튼/키를 누르면, 그는 1 초 후까지의 키를 반복 할 수 없습니다. 1 초 길이의 "워킹"애니메이션이 완료되어야하고 최종 위치는 서버 측 좌표로 검사되어 다시 '오른쪽'을 눌러 스프라이트를 움직일 수 있습니다.

질문 : 1 초 서버 측을 어떻게 추적합니까? 사용자가 애니메이션 시간을 줄이기 위해 클라이언트를 해킹 할 수 있기 때문에 클라이언트 쪽에서 할 수 없습니다.

위치 배열의 "타임 스탬프"솔루션입니까? 예 : 위치 = {x : 0; y : 0, 시간 : 0}. 사용자가 '오른쪽'버튼을 다시 누르면 서버는 마지막 위치 업데이트가 1 초 전인지 여부를 확인합니다. 1 초 미만이면 서버가이를 무시합니다.

+0

내가 잘못하고 있다고 말하고 싶습니다. 이러한 기능은 클라이언트 측에서만 구현되어야합니다. 클라이언트 전용 기능에 대해서는 서버 코드를 수정하지 않아야합니다. 예를 들어, 애니메이션이 끝날 때'updatePosition'을 호출하지 않는 이유는 무엇입니까? 또는 사용자가 다른 시간을 클릭하면 애니메이션이 중단됩니까? 또는 단순히 쌓아 올리면됩니까? 이것은 중요한 기능입니까? – Pierre

+0

완료하려면 1 초가 걸릴 애니메이션이 필요합니다. 사용자는 0.5 초 안에 애니메이션을 끝내기 위해 클라이언트를 해킹 할 수 있습니다. 여러 사용자가있는 경우 해커는 다른 모든 사용자보다 두 배나 빠르게 이동할 수 있습니다. – Legendre

+0

알겠습니다. 고마워요. – Pierre

답변

0

단순히 사용자 세션에 "잠금"을 저장하지 않는 이유는 무엇입니까? 또 다른 편집이 클라이언트에 의해 트리거됩니다

session.editLock = new Date().getTime(); 

, 단지 :

if(session.editLock && new Date().getTime() - session.editLock > 1000) { 
    // Return error 
} 

는 위치 객체는 나에게 느낌이 좋지 않습니다 수정. position 객체는 시간이 아닌 위치를 저장하기위한 객체입니다.

+0

답장을 보내 주셔서 감사합니다.플레이어가 세션을 해킹하여 자신을 "잠금 해제"할 수 있습니까? 나는 express + passportjs를 사용하여 로그인 세션을 처리하고 있습니다. 요점은 "Data(). getTime()"을 사용하여 서버 측에서 시간 (위치 업데이트 타임 스탬프)을 추적한다고 가정합니다. 타임 스탬프 (세션 또는 위치 배열)를 유지할 곳은 중요하지 않습니다. – Legendre

+0

아니요, 세션은 엄격하게 서버 측이며 사용자는 세션 데이터를 변경할 수 없습니다. 그것이 인증 목적으로 사용되는 이유입니다. 기술적으로, 타임 스탬프를 저장하면 아무런 차이가 없습니다. 그러나 어떤 데이터를 저장할 위치를 주저 할 때는 언제나 더 의미있는 것이 무엇인지 스스로에게 자문 해 줄 것을 권합니다. 이 경우 세션에서 저장하는 것이 포지션 데이터보다 더 의미가 있다고 말하고 싶습니다. 포지션 데이터는 위치를 저장하는 것으로 기대됩니다. 타임 스탬프가 아닙니다. – Pierre

+0

니스. 나는 세션을 사용하여 "잠금 장치"를 저장할 것이라고 생각합니다. 그리고 여전히 위치를 타임 스탬프합니다. 그 이유는 여러 사용자가 내 웹 사이트에서 스프라이트를 이동하고 상호 작용 (예 : 충돌시 애니메이션) 할 계획이기 때문입니다. 위치 배열은 최종 위치 인 서버 쪽에서 업데이트 될 수 있지만 클라이언트 측에서는 여전히 해당 "보행"상태입니다. 마지막 질문 하나 : 세션은 플레이어와 관련된 모든 변수를 버리는 편리한 장소 인 것처럼 보입니다. 예 : 스프라이트가 충돌 할 때마다 "건강"을 줄이기로 결정했다면 세션에 "건강"변수를 저장할 수 있습니다. 또는 나는 틀린가? – Legendre