【问题标题】:SKTexture get image nameSKTexture 获取图片名称
【发布时间】:2014-02-11 09:58:20
【问题描述】:

是否可以从 SKSpriteNode 的 SKTexture 获取当前图像名称?

我是 SpriteKit 的新手,我正在编写一个小游戏。我需要检测忍者何时会击中敌人。像这样的

我正在做SKAction之类的

- (void)setUpHit
{
    SKTextureAtlas *hitAtlas = [SKTextureAtlas atlasNamed:@"Ninja_hit"];

    SKTexture *hit1 = [hitAtlas textureNamed:@"Ninja_hit_1"];
    SKTexture *hit2 = [hitAtlas textureNamed:@"Ninja_hit_2"];
    SKTexture *hit3 = [hitAtlas textureNamed:@"Ninja_hit_3"];
    SKTexture *hit4 = [hitAtlas textureNamed:@"Ninja_hit_4"];

    SKAction *hitAnimation = [SKAction animateWithTextures:@[hit1, hit2, hit3, hit4]
                                              timePerFrame:0.1];

    SKAction *wait = [SKAction waitForDuration:0.3];

    SKAction *goBack = [SKAction animateWithTextures:@[hit1, [SKTexture textureWithImageNamed:@"Ninja"]]
                                        timePerFrame:0.1];

    self.hitAction = [SKAction sequence:@[hitAnimation, wait, goBack]];
}

但只有图像 Ninja_hit_2.png 或 Ninja_hit_3.png 才会命中。

所以我在与敌人做 intersectsNode ninja 时需要检测当前纹理图像名称。

现在我正在做类似的事情

if ([ninja intersectsNode:node] &&  !self.isKilled)
{
    SKTexture *currentTexture = [ninja texture];

    if ([self isHit:currentTexture])
    {
        //kill enemy here
    }  
}

在哪里

- (BOOL)isHit:(SKTexture *)texture
{
    NSString *description = [texture description];
    NSRange range = [description rangeOfString:@"'"];
    NSString *textureName = [description substringFromIndex:NSMaxRange(range)];
    range = [textureName rangeOfString:@"'"];
    textureName = [textureName substringToIndex:NSMaxRange(range) - 1];

    if ([textureName isEqualToString:@"Ninja_hit_2.png"] ||
        [textureName isEqualToString:@"Ninja_hit_3.png"])
    {
        return YES;
    }

    return NO;
}

我知道这是不正确的,但我找不到如何获取当前纹理名称或正确执行它。你可以帮帮我吗?

【问题讨论】:

    标签: ios sprite-kit skspritenode sktexture


    【解决方案1】:

    嗯,我的策略是这样的:

    在你的忍者班上有一个纹理属性。让他们留在身边

    @property (nonatomic, strong) NSArray * hitTextures;
    

    然后存储命中的纹理(注意这是一个延迟加载的getter方法)

    -(NSArray *)hitTextures{
        if (_hitTextures == nil){
            SKTexture *hit1 = [SKTexture textureWithImageNamed:@"Ninja_hit_1"];
            SKTexture *hit2 = [SKTexture textureWithImageNamed:@"Ninja_hit_2"];
            SKTexture *hit3 = [SKTexture textureWithImageNamed:@"Ninja_hit_3"];
            SKTexture *hit4 = [SKTexture textureWithImageNamed:@"Ninja_hit_4"];
    
            _hitTextures = @[hit1, hit2, hit3, hit4];
        }
        return _hitTextures;
    }
    

    请注意,我们不需要明确地创建 SKTextureAtlas 对象:

    加载纹理数据时,Sprite Kit 会在应用程序包中搜索具有指定文件名的图像文件。如果找不到匹配的图像文件,Sprite Kit 会在存储在应用程序包中的任何纹理图集中搜索纹理。如果指定的图像不存在于包中的任何位置,Sprite Kit 会创建一个占位符纹理图像。

    使用这个纹理数组来填充你的SKAction

        SKAction *hitAnimation = [SKAction animateWithTextures:self.hitTextures
                                                  timePerFrame:0.1];
    

    这允许您像这样更改您的 -isHit 方法:

    - (BOOL)isHit:(SKTexture *)texture
    {
        NSUInteger index = [self.hitTextures indexOfObject:texture];
    
        if (index == 1 ||
            index == 2)
        {
            return YES;
        }
    
        return NO;
    }
    

    这样您就不必依赖可能会更改的-description 方法的实现细节。

    【讨论】:

    • 是的,当然。谢谢。我可以把它放在数组中,除了本地存储。
    • 不错的答案我喜欢你用 ObjC 写的而不是像其他人那样快速
    • @hoboBob 这个答案是在 swift 存在之前写的 ;)
    【解决方案2】:

    从 SKAtlas 动画中检测当前名称,这不是最好的方法,但它对我有用。

    var tempstr = yoursprite.texture!.description
    
            if(tempstr.rangeOfString("currentFrameName", options: NSStringCompareOptions.LiteralSearch, range: nil, locale: nil) != nil){
    // do something
    }
    

    【讨论】:

      【解决方案3】:

      查看SKSpriteNode的纹理描述应该可以看到图片的名称

      for node in self.children {
          if node is SKSpriteNode && node.physicsBody != nil  {
              let spriteNode:SKSpriteNode = node as! SKSpriteNode
              print("sprite node image name \(spriteNode.texture!.description)")
          }
      }
      

      这个例子会在调试时打印出来

      精灵节点图像名称'Clear10x10' (10 x 10)

      然后您可以 RegX 图像名称的第三个字段,在本例中为“Clear10x10”。请注意,Apple 可能会更改此描述格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 2012-04-04
        • 2012-09-02
        • 2015-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多