Reputation: 1030
I ran into an issue when converting Objective-C code to Swift. I am added two sprites to an SKScene subclass. The first sprite is added directly to the scene and the second sprite is a child of the first node. When I tap on either sprite, the game should log the name of the sprite. This works as expected in the Objective-C version, but the Swift version logs "sprite1" no matter which node I tap on.
Objective-C
Declare sprites and add them to the scene
CGSize size = CGSizeMake(32, 32);
SKSpriteNode *sprite1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:size];
sprite1.name = @"sprite1";
sprite1.position = CGPointMake(100, 100);
[self addChild:sprite1];
SKSpriteNode *sprite2 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:size];
sprite2.name = @"sprite2";
sprite2.position = CGPointMake(150, 100);
[sprite1 addChild:sprite2];
Touch handler
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if ([node.name isEqualToString:@"sprite2"]) {
NSLog(@"sprite2");
}
if ([node.name isEqualToString:@"sprite1"]) {
NSLog(@"sprite1");
}
}
}
Swift
Declare sprites and add them to the scene
let size = CGSizeMake(32, 32)
let sprite1 = SKSpriteNode(color: SKColor.blueColor(), size: size)
sprite1.name = "sprite1"
sprite1.position = CGPointMake(100, 100)
self.addChild(sprite1)
let sprite2 = SKSpriteNode(color: SKColor.redColor(), size: size)
sprite2.name = "sprite1"
sprite2.position = CGPointMake(150, 100)
sprite1.addChild(sprite2)
Touch handler
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
let node = self.nodeAtPoint(location)
if (node.name == "sprite2") {
println("sprite2")
}
if (node.name == "sprite1") {
println("sprite1")
}
}
}
Upvotes: 0
Views: 189
Reputation: 7634
You are setting sprite2.name
to "sprite1."
let size = CGSizeMake(32, 32)
let sprite1 = SKSpriteNode(color: SKColor.blueColor(), size: size)
sprite1.name = "sprite1"
sprite1.position = CGPointMake(100, 100)
self.addChild(sprite1)
let sprite2 = SKSpriteNode(color: SKColor.redColor(), size: size)
sprite2.name = "sprite1" //here
sprite2.position = CGPointMake(150, 100)
sprite1.addChild(sprite2)
Change it to "sprite2."
let size = CGSizeMake(32, 32)
let sprite1 = SKSpriteNode(color: SKColor.blueColor(), size: size)
sprite1.name = "sprite1"
sprite1.position = CGPointMake(100, 100)
self.addChild(sprite1)
let sprite2 = SKSpriteNode(color: SKColor.redColor(), size: size)
sprite2.name = "sprite2"
sprite2.position = CGPointMake(150, 100)
sprite1.addChild(sprite2)
Upvotes: 2