大家好我是spriteKit和objective-c的新手,我想在方法中创建一个spriteNode并在另一个方法中删除它(相同的.m文件) 在这个方法中我创建了精灵:
(void)createSceneContents{ /*in this method i create and add the spaceship spriteNode
SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
//code...
//Add Node
[self addChild:spaceship];
}
现在我想删除触摸它的节点,但我只知道处理触摸事件的方法是:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
我正试图从那里访问我的宇宙飞船节点我不能。我尝试了一切都没有成功。有没有办法将节点从一个方法发送到另一个?或者不发送,是吗? 是否可以从未声明的方法访问子节点?
答案 0 :(得分:8)
试试这个:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];
SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:positionInScene];
}
您还可以设置节点名称:
[sprite setName:@"NodeName"];
您可以按名称访问它:
[self childNodeWithName:@"NodeName"];
答案 1 :(得分:2)
是的,有办法。
每个SKNode对象都有一个名为“name”的属性(类NSString)。您可以使用此名称枚举节点的子节点。
试试这个:
spaceship.name = @"spaceship";
并在touchesBegan
[self enumerateChildNodesWithName:@"spaceship" usingBlock:^(SKNode *node, BOOL *stop) {
[node removeFromParent];
}];
但请注意,这将从其父级中删除名为“spaceship”的每个节点。如果你想对删除过程更有选择性,你可以将SKSpriteNode子类化为保存一些可用于确定是否应该删除它们的值,或者你可以根据某些逻辑将精灵添加到数组中然后使用数组删除。
祝你好运!
答案 2 :(得分:0)
使用"名称"属性是有效的,但是如果你认为你只有一个该节点的实例,你应该创建一个属性。
@property (strong, nonatomic) SKSpriteNode *spaceship;
然后当你想要添加它时:
self.spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
[self addChild:self.spaceship];
然后在touchesBegan:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = touches.anyObject;
SKSpriteNode *node = [self nodeAtPoint:[touch locationInNode:self]];
if (node == self.spaceship) {
[self.spaceship removeFromParent];
}
}