在 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
我应该强调SKSprite
、SKTexture
和您的“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 中不工作的过渡的主要内容,如果未能解决你的问题,请参考以下文章
SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心