Is there possible to get current image name from SKTexture from SKSpriteNode?
I am a new in SpriteKit and I'm writing a little game. I need to detect when ninja will hit enemy. Something like this
I am doing SKAction like
- (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]];
}
But hit is going only on images Ninja_hit_2.png or Ninja_hit_3.png.
So I need to detect current texture image name when i am doing intersectsNode ninja with enemy.
Now I am doing something like
if ([ninja intersectsNode:node] && !self.isKilled)
{
SKTexture *currentTexture = [ninja texture];
if ([self isHit:currentTexture])
{
//kill enemy here
}
}
where
- (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;
}
I know that is not correct, but I can't find how to take current texture name or doing it correctly. Could you help me?
to detect the current name out of a SKAtlas Animation, this is not the best way but it works for me.
Hmm my strategy would be this:
On your ninja class have a property for your textures. Keep them around
Then store the hit textures (note this is a lazy loading getter method)
Note that we don't need to make the
SKTextureAtlas
object explicitly:Use this texture array to fill in your
SKAction
This allows you do change your
-isHit
method like so:This way you don't rely on an implementation detail of the
-description
method that is subject to change.