2015-01-28 6 views
3

내 주인공 인 physicsBody가있는 SKSpriteNode는 이동하거나 점프 할 때 흔들립니다.내 캐릭터의 SpriteNode가 움직일 때 떨리는 이유는 무엇입니까?

나는 (가속 또는 감속을 시뮬레이트하기 위해) character.physicsBody.velocity.dx을 변경하여 캐릭터를 움직이고 있으며, 그를 점프하게하기 위해 applyImpulse을 사용합니다.

코드 :

가 이동하려면

[self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 30, self.physicsBody.velocity.dy)]; 

가 이동하려면 : 또한

if (!isJumping) 
{ 
    [self.physicsBody applyImpulse:CGVectorMake(0.0f, 6.0f)]; 
} 

을, 나는에 카메라 위치를 변경하려면 내가 인터넷에서 발견하는 방법을 사용 지도, 문자를 따르도록 :

- (void)setViewpointCenter:(CGPoint)position 
{ 
    NSInteger x = MAX(position.x, self.size.width/2); 
    NSInteger y = MAX(position.y, self.size.height/2); 
    x = MIN(x, (self.map.mapSize.width * self.map.tileSize.width) - self.size.width/2); 
    y = MIN(y, (self.map.mapSize.height * self.map.tileSize.height) - self.size.height/2); 

    CGPoint actualPosition = CGPointMake(x, y); 
    CGPoint centerOfView = CGPointMake(self.size.width/2, self.size.height/2); 
    CGPoint viewPoint = CGPointSubtract(centerOfView, actualPosition); 
self.map.position = viewPoint; 
} 

결과?

Here it is (iPhone 5의 QuickTime으로 기록됨). 이 비디오의 문제점과 내 머리 (그리고 지금 막 개발을 시작한 게임)를 어지럽 힐 수 있는지 쉽게 알 수 있습니다.

실제로 유령처럼 (때로는 완벽하지 않고 때로는 완벽하지 않습니다.) 그는 흐려집니다. 나는 아무것도 이해하지 못한다. 나는 해결책을 찾지 못한다.

나는 시뮬레이터와 내 장치에서 같은 효과를 보았습니다.

원하는 경우 더 많은 코드를 게시 할 수 있으며 모든 것을 말할 수 있습니다. 누군가 내가 잘못한 곳을 찾을 수 있기를 바랍니다.

고맙습니다!

편집 1 :

댓글 주셔서 감사합니다!

화면에 145 개의 노드가 표시되고 실제 문제가 나타나지 않습니다.

왼쪽으로 내 캐릭터를 이동하려면, 난 그냥 실행 - :

-(void)moveToRight 
{ 
    if (isJumping && !isOnRightSide) 
    { 
     [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx/2.0, self.physicsBody.velocity.dy)]; 
    } 
    [self setIsStopping:NO]; 
    [self setIsOnRightSide:YES]; 
    [self setIsRunning:YES]; 
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx + 30, self.physicsBody.velocity.dy)]; 
} 

: 그리고

(무효)가 {

if (isJumping && isOnRightSide) 
    { 
     [self.physicsBody setVelocity:CGVectorMake(-self.physicsBody.velocity.dx/2.0, self.physicsBody.velocity.dy)]; 
    } 
    [self setIsOnRightSide:NO]; 
    [self setIsStopping:NO]; 
    [self setIsRunning:YES]; 
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 30, self.physicsBody.velocity.dy)]; 
} 

을 moveToLeft 그리고 오른쪽으로

if (_isStopping) 
{ 
    if (isOnRightSide) 
    { 
     int ralentissement = MIN(self.physicsBody.velocity.dx, 10); 
     [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - ralentissement, self.physicsBody.velocity.dy)]; 
    } 
    else 
    { 
     int ralentissement = MAX(self.physicsBody.velocity.dx, -10); 
     [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - ralentissement, self.physicsBody.velocity.dy)]; 
    } 


    if (abs(self.physicsBody.velocity.dx) < 1) 
    { 
     isRunning = NO; 
     _isStopping = NO; 
     if (self.hasActions) 
      [self removeAllActions]; 
     [self.physicsBody setVelocity:CGVectorMake(0, self.physicsBody.velocity.dy)]; 
    } 
} 


if (isOnRightSide && isRunning && self.physicsBody.velocity.dx < 150 && !_isStopping) 
{ 
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx + 10, self.physicsBody.velocity.dy)]; 
} 
else if (!isOnRightSide && isRunning && self.physicsBody.velocity.dx > -150 && !_isStopping) 
{ 
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 10, self.physicsBody.velocity.dy)]; 
} 

if (abs(self.physicsBody.velocity.dx) > 150) 
{ 
    if (isOnRightSide) 
     [self.physicsBody setVelocity:CGVectorMake(150, self.physicsBody.velocity.dy)]; 
    else 
     [self.physicsBody setVelocity:CGVectorMake(-150, self.physicsBody.velocity.dy)]; 
} 

가속과 감속을 지속적으로 적용하는 더 좋은 해결책이 있습니까?

내 이미지를 모두 확인했지만 모두 크기가 같습니다.

카메라 기능을 끄고 실제로 이 흔들 렸습니다!이 함수는 잘못된 부분이어야하므로 raywenderlich에서이 함수를 찾았습니다. 어떻게 대체 할 수 있는지 알지 못합니다. 어떻게 아십니까? 감사!

편집 2 :

그래서, 나는 didFinishUpdate에 내 카메라 이동 방법의 호출을 이동했는데, 을이를 정말 잘 작동! 이 떨리는 느낌은 사라졌으며 이제는 그 나쁜 경험 없이도 놀 수 있습니다. 그가 갈 때, 그는 여전히 아래로 가끔가는 것처럼 보인다 1 픽셀 여기 나이 : (applyForce 방법 덕분에 이루어집니다) 문자 점프 할 때

하지만 일이 한 가지가 남아 있습니다. 그것은 매우 특별하며 Sprite Kit의 실제 이슈인지 또는 너무 크거나 다른 텍스처인지 여부를 알지 못합니다. 나는 물리학자가 그려진 애니메이션을 보려고 노력했다. 그리고 사실 몇 가지 수직적 인 흔들림이 있었다. (더 정확히 말해, 파란색으로 채색 된 사각형은 깜박 거리는 것처럼 보인다.)

지난 호에 대한 아이디어가 있습니까?

수평 이동이 이제 완벽합니다. 도움을 주셔서 감사합니다.

+0

는 내 마음에 와서 제일 먼저 뭔가 애니메이션 잘못된 것입니다. 캐릭터 애니메이션 이미지 크기를 확인하십시오. 아마 이것은 문제가 아니지만 확인할 수 있습니다. 또한 코드에서 캐릭터를 좌우로 움직이는 방법을 보여줄 수도 있습니다. – Whirlwind

+0

또한 showsPhysics를보기 컨트롤러 및 showsNode 및 showsDrawCount에서 사용할 수 있습니다. 디버깅 할 때 유용합니다. – Whirlwind

+0

멋진 아트! 문제가 무엇인지 알 수있을 것 같습니다. 그 카메라 기능을 끄고 뛰어 넘을 수 있습니까? 그것은 여전히 ​​더듬 거리는가? – hamobi

답변

1

나는이 똑같은 문제가있다. (또한 레이의 튜토리얼을 따른다.) 정말로 멋지게 보이는 캐릭터를 따라 카메라를 움직이게하지만, 말더듬이가 발생한다. 세상은 편도로 움직이고 있고, 캐릭터는 반대 방향으로 움직이고 있습니다. 러닝 머신과 같은 일이 일어나면 캐릭터가 더듬 거리게됩니다. 레이의 현재 책에서 그는 다음과 같이 말합니다 :

override func didSimulatePhysics() { 
    let target = getCenterPointWithTarget(player.position) 
    worldNode.position += (target - worldNode.position) * 0.1 

나는 이것이 당신이하는 일과 거의 비슷하다고 확신합니까 ?? 이것은 worldNode가 끊임없이 플레이어의 움직임에 따라 잡으려고 노력하도록 만듭니다. 카메라에 탄력있는 느낌을줍니다.

이 그때 우리가 더 좁혀 것, 그것을 해결하면 바로

worldNode.position = getCenterPointWithTarget(player.position) 

을 진행하려고합니다. 여기서 문제는 멋진 카메라 이징 효과를 잃어버린 것입니다.

플레이어 움직임에 대한 변경 사항을 어디에서 변경하고 있는지 알 수 없습니다.이 정보가 단지 한 번만 호출하는 방법인지 또는 업데이트 루프에서 실행되는지는 확실하지 않습니다.

업데이트에서

가 :

// update ship position 
    ship.update(self.delta) 

내가 didFinishUpdate에서 화면을 이동 그래서이 있는지 확인

난 그냥 당신이 내 게임을하고 있어요 방법의 예를주지 일어나는 마지막 일입니다. 잘하면이 모든 말더듬을 중지합니다.

didFinishUpdate

override func didFinishUpdate() { 
    // move BG Nodes 
    self.moveBGNodes() 
} 

moveBGNodes 방법 나는 당신의 비디오를 시청

func moveBGNodes(){ 

    // method that calculates camera position (stops camera at screen edges) 
    let target = self.pointToCenterViewOn(ship.position) 

    // ease gameworld into ship's position 
    gameLayer.position += (target - gameLayer.position) * 0.1 
+0

답장을 보내 주셔서 감사합니다. 처음에 말했듯이 나는하지 않지만 이미 두 번째 방법을 사용하고 있습니다.'self.map.position = viewPoint;'(다른 행은 카메라를지도에 그대로두기 위해 사용됩니다). didFinishUpdate에서 카메라 메서드를 호출하려고 시도했는데 정말 (업데이트 메서드에서 수행하고있었습니다). 그래서 내 성격을 움직이게하기 위해, 나는 update 메소드의 모든 프레임을 테스트하는 부울 값을 가지며, 위의 경우에 대해 쓴다. 더 나은 솔루션을 얻었습니까? 고마워요! – Polo

+0

사례별로 제공됩니다. 그것이 지금 당신을 위해 일하고 있다면 바로 그걸 붙잡아 라. 보다 깔끔한 솔루션이나 현재 솔루션으로 인해 어려움을 겪고 있다고 생각할 수 있다면 다른 방법을 찾아야합니다. 다행히 도울 수있어. – hamobi

+0

나는이 일을하는 새로운 방법에 대해 생각했지만 아이디어가 없습니다. 힘을 적용하고 캐릭터의 텍스처와 애니메이션을 조정하기 위해 항상 업데이트 방법에서 체크하는 부울 값이 거의 없습니다. 이런 식으로 잘 작동하지만 아이디어가 있다면이 문제를 개선하려고 노력하게되어 기쁩니다. – Polo