我有一个Cat节点和一个Bird节点。鸟节点嵌套在一个名为birdBlock的容器节点中。一切都包含在WorldNode中。如果我在WorldNode中添加一只鸟,那么Cat可以适当地与它进行交互,但当鸟类在鸟类中时,猫只会将它们推开并且它们会飞行。
我正在使用以下方法找到我的鸟类:
[worldNode enumerateChildNodesWithName:kBirdName usingBlock:^(SKNode *node, BOOL *stop)
{
SKSpriteNode *newBird = (SKSpriteNode *)node;
if (CGRectIntersectsRect(newBird.frame,cat.frame))
{
//Do Something
//This is never reached when the birds are in the SKSpriteNode birdBlock.
//They just get shoved all over the screen.
}
}];
街区中的鸟类名称正确。
它们现在被枚举,但除了在屏幕上飞行外,仍然不会与猫互动。
现在我这样做:
[[worldNode children] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
SKSpriteNode *blockNode = (SKSpriteNode *)obj;
if ([blockNode.name isEqualToString:kBirdBlockName])
{
[blockNode enumerateChildNodesWithName:kBirdName usingBlock:^(SKNode *node, BOOL *stop)
{
SKSpriteNode *nbird = (SKSpriteNode *)node;
NSLog(@"FOUND BIRDS HERE");
//THIS IS FOUND! But below still does not work
if (CGRectIntersectsRect(nbird.frame, cat.frame))
{
NSLog(@"Hit BIRD");
[nbird removeFromParent];
}
}
}
}];
所以这也不起作用。你如何改变精灵的坐标系?
答案 0 :(得分:1)
您可以通过多种方式搜索节点树。 SKNode documentation在搜索节点树部分中清楚地解释了这一点。
如果您有一个名为 @“node”的节点,那么您可以通过在名称前添加 // 来搜索所有后代。因此,您将搜索 @“// node”。
尝试将常量 kBirdName 更改为等于 @“// my_bird_name”
使用字符串文字的示例是 -
[worldNode enumerateChildNodesWithName:@"//nodeName" usingBlock:^(SKNode *node, BOOL *stop)
{ // Do stuff here... }
答案 1 :(得分:0)
我无法让这个工作,所以我只给了所有的鸟类物理身体,并将检测结果移到didBeginContact
现在他们的父母是什么并不重要,我不需要担心改变坐标。
- (void)didBeginContact:(SKPhysicsContact *)contact
{
SKSpriteNode *firstNode = (SKSpriteNode *)contact.bodyA.node;
SKSpriteNode *secondNode = (SKSpriteNode *) contact.bodyB.node;
if ((firstNode.physicsBody.categoryBitMask == catCategory && secondNode.physicsBody.categoryBitMask == birdCategory) || (firstNode.physicsBody.categoryBitMask == birdCategory && secondNode.physicsBody.categoryBitMask == catCategory))
{
NSLog(@"DID HIT BIRD");
if (firstNode.physicsBody.categoryBitMask == catCategory) {
//do something to secondNode.
}
if (firstNode.physicsBody.categoryBitMask == birdCategory) {
//do something to firstNode.
}
}
}