如何将SKPhysicsContact contactPoint翻译成我的SKSpriteNode位置

时间:2015-06-10 01:01:29

标签: sprite-kit position sknode skphysicscontact

我花了太长时间。有人已经解决了这个问题,请帮忙。

敌人在我的船上开火。 SKPhysicsContact接管并获得contactPoint。我在世界坐标系中以contactPoint爆炸发射的导弹。都好。现在我想使用这个点,而不是在contactPoint返回的场景坐标中,而是在我的船舶坐标中开始从船上发出烟雾,我已经被击中了。我之前使用过convertPoint功能,但是成功了,但是我似乎无法在这里得到它... Docs说contactPoint以场景坐标表示,而myShip有它的坐标,就像一个孩子一样生活世界节点,它是场景节点的子节点。它们位于相同的Node层次结构中。我想......我有一个Scene-> World->相机,其中myShip是World的孩子。我认为,我的代码是将contact contactPoint从Scene坐标转换为myShip中的坐标。但这不起作用。也没有任何其他组合。我错过了什么?我怀疑Camera层次结构,但不确定。返回到smoke.position的数字远远不够......

- (SKEmitterNode *) newSmokeEmitter: (SKPhysicsContact *) contact
{
    NSString *smokePath = [[NSBundle mainBundle] pathForResource:@"ShipSmoke" ofType:@"sks"];
    SKEmitterNode *smoke = [NSKeyedUnarchiver unarchiveObjectWithFile:smokePath];

    smoke.targetNode = myShip;
    smoke.name = @"shipSmoke";
    smoke.position = [self convertPoint:contact.contactPoint toNode:myShip];

    //my temporary kludge that places the smoke on the ship, randomly

    //smoke.position = CGPointMake(skRand(-25,25), skRand(-25,+25));

    NSLog(@"Ship at world pos: %f,%f", myShip.position.x, myShip.position.y);
    NSLog(@"Contact at scene pos: %f,%f", contact.contactPoint.x, contact.contactPoint.y);
    NSLog(@"Smoke position at ship pos: %f,%f", smoke.position.x, smoke.position.y);
    [myShip addChild:smoke];
    return smoke;
}

2 个答案:

答案 0 :(得分:2)

如果你还没有解决它,答案是从节点的场景转换:

smoke.position = [self convertPoint:contact.contactPoint fromNode:self.scene];

或者,在Swift中:

smoke.position = convertPoint(contact.contactPoint, fromNode: scene)

答案 1 :(得分:1)

如果我正确理解您的节点层次结构,这可以解决问题。

CGPoint contact = [self convertPoint:contact.contactPoint toNode:self.world];
smoke.position = [self.world convertPoint:contact toNode:myShip];

我认为你不能将这一点直接转换为发货。您必须将其转换为层次结构,直到到达所需的节点。

希望这有帮助。

修改

要验证实际的联系点是否在我希望您可以尝试的场景上。

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(50, 50)];
sprite.position = contact.contactPoint;
[self addChild:sprite];

如果返回的点位于场景坐标系中,则应该在接触点的精确位置添加精灵。如果它确实显示在正确的位置,而不是真正实现转换点正确。