[Ios] SpriteKit에서 전환이 작동하지 않습니다.


Answers

새로운 장면이 특정 리소스가 많은 경우, 즉 텍스처로드가 많이 필요한 경우 프레임 렌더링이 지연됩니다. 텍스처 로딩이 트랜지션 타임보다 오래 걸리면, 트랜지션이 끝난 후에 표시 될 첫 번째 프레임이 렌더링 되었기 때문에 모든 것을 놓칠 것입니다. 나는이 문제에 대해서도 만났지만, 근본 원인을 판단 할 수는 있었지만 2 초의 전환이 있었기 때문에 근본 원인을 파악할 수 있었지만 그 중 마지막 0.5 초만 표시되었습니다.

이 문제를 해결하는 방법? 텍스처를 미리로드하십시오. Apple 문서를 참조하십시오.

+ (void)preloadTextures:(NSArray *)textures withCompletionHandler:(void (^)(void))completionHandler

SKSprite , SKTexture 및 "image.png"의 차이점을 강조해야합니다. SKSpritetexture 속성 (또는 배경색)과 size 기반으로 그립니다. 많은 스프라이트에 하나의 SKTexture를 사용할 수 있습니다. 이미지 파일 (image.png)은 여러 개의 SKTexture 객체를 제공 할 수 있습니다.

중요 : 위 메서드에 전달 된 SKTexture 개체 배열의 텍스처를 사용하여 실제로 텍스처 로딩의 이점을 얻고 자합니다. 이것은 어떤 형태의 텍스처 관리 필요합니다.

문제가 실제로 텍스처와 관련된 것이라면, 텍스처 관리를 확장해야하는지 알려주세요. 관련 게시물 (조금 건조 할 수도 있음)은 여기에서 찾을 수 있습니다 : SO sktexture-preloading .

Question

이 장면 전환을 사용하여 다음 장면을 호출하는 장면이 있습니다.

  SKTransition *transition = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:0.5];

  SKView *skView = (SKView *)self.view;

  SKScene * scene = [[GameOverScene alloc] initWithSize:self.size];
  scene.scaleMode = SKSceneScaleModeAspectFill;
  [skView presentScene:scene transition:transition];

GameOverScene (버튼, 이미지 등)을 구성하는 요소는 init 메서드에 추가됩니다.

문제는 전환이 보이지 않는다는 것입니다. 한 장면은 다른 장면으로 즉시 자릅니다.

다음 장면이 요소를 만들 기회가 오기 전에 전환이 일어난 것 같습니다. 나는 성공없이 didMoveToView 다음 장면의 생성을 이동 시키려고 노력했다.

테스트 목적으로 2 초보다 큰 경우 presentScene 라인을 지연 시키려고했습니다. 내가 그렇게 할 때 전이의 마지막 프레임을 거의 볼 수 없습니다.

어떻게해야합니까? 다음 장면을 만들고 전환 효과를내는 올바른 방법은 무엇입니까?




나는 하나의 사소한 차이로 장면 위에 게임을 보여주기 위해 내 앱에 똑같은 코드를 썼다. 내 코드는 다음과 같습니다.

- (void)showGameOverScene
{
    SKTransition* reveal = [SKTransition doorsCloseVerticalWithDuration:0.5];

    SKScene* gameOverScene = [[RSGameOverScene alloc] initWithSize:self.size];

    [self.view presentScene:gameOverScene transition: reveal];
}

그리고 그것은 매력처럼 일하고 있습니다. 유일한 차이점은 내가 부르지 않는다는 것입니다.

scene.scaleMode = SKSceneScaleModeAspectFill;

RSGameOverScene 에서 노드를 -(id)initWithSize:(CGSize)size 로 설정하고 다시 문제가 없습니다. 모든 것이 효과가 있습니다.

이 라인이 문제의 원인이 될 수있는 이유는 알 수 없지만 도움이되는지 알아보기 위해 주석을 달아 볼 수는 있습니다. 그러나 코드는 괜찮아 보이므로 문제의 원인은 다른 곳에서 발생할 수 있습니다.