在 SpriteKit 中不工作的过渡

Posted

技术标签:

【中文标题】在 SpriteKit 中不工作的过渡【英文标题】:Not working transitions in SpriteKit 【发布时间】:2014-03-02 17:29:39 【问题描述】:

我有一个场景正在使用这样的过渡调用下一个场景:

  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,但没有成功。

出于测试目的,我尝试将presentScene 行延迟甚至超过 2 秒。当我这样做时,我几乎看不到过渡的结束帧。

我该怎么做?构建下一个场景并进行有效过渡的正确方法是什么。

【问题讨论】:

【参考方案1】:

如果新场景资源特别多,即需要大量纹理加载,则会延迟任何帧渲染。如果纹理加载花费的时间比过渡时间长,您将错过所有这些,因为将显示的第一帧在过渡完成后已经渲染。 我也遇到了这个问题,虽然我能够更好地确定根本原因,因为我有 2 秒的过渡,其中只显示了最后 0.5 秒。

如何解决这个问题?预加载你的纹理。见Apple Docs。

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

我应该强调SKSpriteSKTexture 和您的“image.png”之间的区别。 SKSprite 根据其texture 属性(或background 颜色)和size 绘制自己。您可以将一个 SKTexture 用于多个精灵。反过来,一个图像文件(“image.png”)可以提供多个 SKTexture 对象。

重要提示:您希望使用传递给上述方法的 SKTexture 对象数组中的纹理来实际受益于纹理加载。这需要某种形式的纹理管理。

如果您的问题确实与纹理有关,如果您需要我扩展纹理管理,请告诉我。相关帖子(可能有点枯燥)可以在这里找到:SO sktexture-preloading。

【讨论】:

【参考方案2】:

我在我的应用程序中编写了完全相同的代码来显示游戏结束的场景,但有一点不同。我的代码如下:

- (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 中设置了节点,同样没有问题。一切正常。

我看不出这条线可能是问题的根源,但您可能想尝试将其注释掉,看看它是否有帮助。但是您的代码看起来不错,因此问题的根源可能在其他地方。

【讨论】:

不适合我。我认为问题在于传入的场景需要一些时间来加载所有元素(至少 10 个按钮 + 背景)。这似乎是一个 spritekit 错误。 这个问题还没有解决吗?我还没弄明白,我的游戏已经出现这个问题好几个月了。

以上是关于在 SpriteKit 中不工作的过渡的主要内容,如果未能解决你的问题,请参考以下文章

Swift Sprite Kit 中的游戏中心

阻止 Sprite 在 SpriteKit 中相互推动

SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心

Sprite不会用手指/ SpriteKit / Swift 3移动

SpriteKit Sprite 无法正确缩放

在Sprite纹理中检测触摸而不是整个框架iOS Swift SpriteKit?