iOS 混合 Spritekit 和 UIKit

Posted

技术标签:

【中文标题】iOS 混合 Spritekit 和 UIKit【英文标题】:iOS mixing Spritekit and UIKit 【发布时间】:2014-03-10 22:34:18 【问题描述】:

我正在为我的一个孩子编写一个相当简单的数学益智游戏。

我使用了标准的 XCode SpriteKit 游戏模板,它使用 SKScene 和 ViewController.m 以及 MyScene.m 文件创建了一个 SKView。

然后我添加了一个简单的 UIView 来充当带有 UIButtons 的 NumberPad 0-9 的容器。

我很想将 MyScene.m 作为 IBActions 的目标,因为它将使用按钮按下时的状态变化。

但是我想知道哪个类是 IBActions ViewController 或 MyScene 的更好目标。尤其是这两种选择是否会对性能产生影响。

我主要关心的是我看到的一些关于人们在混合 SpriteKit 和 UIKit 时遇到的问题的文章。

【问题讨论】:

对向下检查感到难过。当我试图解释一些我读过的文章时说可以将两者混合使用。其他文章,这是一个明确的禁忌。至少泰斯同情我。 我想看到一篇文章说将 Sprite Kit 与 UIKit 混合是一个禁忌。有些事情你不能做(即在 UIView 上方但在另一个 UIView 下方显示 SK 节点)。至于您的问题,实际上只有一个答案:视图控制器。不要让自己被别人说的话所迷惑。除非他们在这里说出来并获得支持。 ;) 【参考方案1】:

出于您的目的,性能影响完全可以忽略不计。但是,从代码的角度来看,我可能会针对视图控制器,以防您想换出场景但重用您的数字键盘。对于数学类型的游戏来说,这听起来像是未来可能的发展。

【讨论】:

【参考方案2】:

我接受了 Theis 的建议,因此创建场景的视图控制器包含以下代码。

ViewController.m

- (IBAction)numberPressed:(id)sender 
    UIButton *pressedButton = (UIButton*) sender;
    NSString *button = pressedButton.currentTitle;
    [scene.keysPressed addObject:button];


- (IBAction)clearPressed:(id)sender 
    UIButton *pressedButton = (UIButton*) sender;
    NSString *button = pressedButton.currentTitle;
    [scene.keysPressed addObject:button];

然后在我的场景代码中,我声明了 keysPressed 属性,有点偏执我把它变成了原子的,以防视图控制器和场景在不同的线程中运行。

MyScene.h

@property (strong, atomic) NSMutableArray *keysPressed;

然后在场景更新方法中,我只需检查我用作堆栈的可变数组,以查看已添加任何内容并获取其值并将其删除。

MyScene.m

-(void)update:(CFTimeInterval)currentTime 
...
NSString *keyNum = nil;
if([_keysPressed count] > 0) 
    keyNum = [_keysPressed firstObject];
    [_keysPressed removeObjectAtIndex:0];

到目前为止,一切都在表现自己。

【讨论】:

以上是关于iOS 混合 Spritekit 和 UIKit的主要内容,如果未能解决你的问题,请参考以下文章

在 Sprite Kit 中混合颜色

SpriteKit 自动恢复和自动暂停 iOS8

使用 SpriteKit 和 iOS 7 保存高分

iOS -- SpriteKit框架之SKPhysicsBody的移动和连接

SpriteKit + iOS8。 SpriteKit 是不是支持“烘焙”渲染结果?

如何重命名 iOS SpriteKit 模板中的默认场景?