【问题标题】:Can an SKSpriteNode Object be Searched by Name可以按名称搜索 SKSpriteNode 对象吗
【发布时间】:2014-06-14 20:49:27
【问题描述】:

我正在使用 Apple 的 SpriteKit 创建游戏,我想知道在创建 SKSpriteNode 对象后最有效的方法是什么。

在一种方法中,我初始化一个精灵节点并为其分配一个名称:

SKSpriteNode* playerBody = [SKSpriteNode spriteNodeWithImageNamed:@"playerBody.png"];
playerBody.name = @"player";

稍后在touchesBegan:withEvent: 方法中,我想再次找到先前定义的精灵节点并将其存储,以便我可以对其运行操作。首先我尝试这样做:

SKSpriteNode* body = [self childNodeWithName:@"player"];

但是,我意识到childNodeWithName: 仅在SKNode 类中可用,而不是SKSpriteNode。所以这不起作用。我现在在想的是我可以创建一个SKNode 对象并将我的SKSpriteNode 放入其中。这样我就可以使用上述方法搜索SKNode。然而,这似乎有点令人费解。有没有更好的办法?

【问题讨论】:

    标签: objective-c sprite-kit skspritenode sknode


    【解决方案1】:

    SKSpriteNode 继承自 SKNode。您可以使用 childNodeWithName。

    SKSpriteNode *someSprite = [SKSpriteNode node];
    
    [someSprite childNodeWithName:@"someChildOfSprite"];
    

    下面的评论代码询问如何将 SKNode 转换为 SKSpriteNode:

    SKSpriteNode *theChildYouWant = (SKSpriteNode*)[someSprite childNodeWithName:@"someChildOfSprite"];
    

    【讨论】:

    • 或者,someSprite.children 也将返回精灵包含的所有节点的数组。
    • 好的,既然你这么说,很明显我应该能够使用childNodeWithName。我应该意识到这一点。那么,我有一个后续问题,这就是我一开始感到困惑的原因。当我执行您在上面写的操作时,Xcode 给了我一个警告,说“不兼容的指针类型初始化 'SKSpriteNode*' 使用类型为 'SKNode*' 的表达式”这只是一些无关紧要的警告吗?根据我的经验,当 Xcode 显示警告时,通常有更好的方法来重写代码以消除它。
    • 方法 childNodeWithName 返回一个 SKNode。然后,您尝试将该 SKNode 分配为 SKSprite,编译器会抱怨,因为您试图将苹果放入橙子中。但是作为编码人员,您知道孩子实际上是一个 SKSpriteNode。因此,一个步骤可以是将对象转换为 SKSpriteNode。我将代码添加到上面的答案中。
    • 我明白了。感谢您的宝贵时间和非常明确的答复。
    • 但请记住,如果您对强制转换的概念感到困惑,这并不是什么了不起的解决方案。它只是告诉编译器更多信息,但实际上并没有改变对象。通过这种方式,您实际上可以使编译器发出警告,但对对象的真实含义撒谎,从而导致坏事发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2022-01-11
    相关资源
    最近更新 更多