2012-09-23 3 views
0

정확한 스프라이트 위치로 정확한 스프라이트를 이동 시키길 원합니다. 플레이어가 그 자리에서 바로 근처가 아니라 중단이 코드벡터를 사용하여 대상에서 정확하게 스프라이트를 중지하십시오.

if (ccpDistance(self.position, requestedPosition) < kPlayerSpeed) { 
      [self changeState:kStateWalking]; 
      return; 
     } 

switch (self.characterState) { 
     case kStateWalkingUp: 
      self.position = ccp(self.position.x, self.position.y + kPlayerSpeed * deltaTime); 
      break; 
     case kStateWalkingDown: 
      self.position = ccp(self.position.x, self.position.y - kPlayerSpeed * deltaTime); 
      break; 
     case kStateWalkingLeft: 
      self.position = ccp(self.position.x - kPlayerSpeed * deltaTime, self.position.y); 
      break; 
     case kStateWalkingRight: 
      self.position = ccp(self.position.x + kPlayerSpeed * deltaTime, self.position.y); 
      break; 
     case kStateIdle: 
      break; 
     default: 
      break; 

if (ccpDistance(self.position, requestedPosition) < kPlayerSpeed) 

: 내 스프라이트 (kPlayerSpeed ​​= 60.0f) 이동 업데이트 방법에 다음 코드를 사용합니다.

답변

0

Andres, 답장을 보내 주셔서 감사합니다.

내가 할 수 확실히 코드가 너무 이것보다 그것을 할

float step = kPlayerSpeed * deltaTime; 
    float dist = ccpDistance(self.position, requestedPosition); 

    if (dist <= step) { 
     self.position = requestedPosition; 
    } else { 
     CGPoint vectorBetweenAB = ccpSub(self.position, requestedPosition); 
     CGPoint normVectorBetweenPositionAndEnd = ccpNormalize(vectorBetweenAB); 
     CGPoint movementVectorForThisFrame = ccpMult(normVectorBetweenPositionAndEnd, step); 
     if (self.position.x > movementVectorForThisFrame.x) { 
      movementVectorForThisFrame.x = -movementVectorForThisFrame.x; 
     } 
     if (self.position.y > movementVectorForThisFrame.y) { 
      movementVectorForThisFrame.y = -movementVectorForThisFrame.y; 
     } 
     self.position = ccpAdd(self.position, movementVectorForThisFrame); 
    } 

인가 더 나은 방법을 내가 좀 더 연구를하고이 함께했다 리드를 ...이 사용 일하러 ?

감사

1

나는이 라인을 따라 뭔가를 할 것이다. 그것을 테스트 havent, 내 GFS PC에서 쓰고 있어요.

CGPoint velocity = CGPointZero; 
CGPoint delta = ccpSubstract(requestedPosition, self.position); 

switch (self.characterState) { 
     case kStateWalkingUp: 
      velocity= ccp(0, kPlayerSpeed * deltaTime); 
      break; 
     case kStateWalkingDown: 
      velocity = ccp(0,-kPlayerSpeed * deltaTime); 
      break; 
     case kStateWalkingLeft: 
      velocity= ccp(-kPlayerSpeed * deltaTime, 0); 
      break; 
     case kStateWalkingRight: 
      velocity= ccp(kPlayerSpeed * deltaTime, 0); 
      break; 
     case kStateIdle: 
      break; 
     default: 
      break; 
} 
CGPoint signsVelocity = ccpNormalize(velocity); 
CGPoint absVelocity = ccp(MIN(fabsf(velocity.x), fabsf(delta.x)) , MIN(fabsf(velocity.y), fabsf(velocity.x)); 
self.position = ccpAdd(self.position, ccpMult(absVelocity, signsVelocity)); 
관련 문제