1

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

敌人向我的船开火。SKPhysicsContact 接手,我得到了contactPoint。我在世界坐标中的接触点引爆发射的导弹。都好。现在我想使用该点,而不是在contactPoint返回的场景坐标中,而是在我的船坐标中开始从我被击中的船上发射烟雾。我以前使用过 convertPoint 函数,成功了,但我似乎无法在这里得到它......文档说 contactPoint 用场景坐标表示,而 myShip 有它的坐标,作为世界节点的子节点,它是场景节点的子节点。它们位于相同的节点层次结构中。我想...我有一个场景->世界->相机,其中 myShip 是世界的一个孩子。我认为,我的代码是说将 contactPoint 从场景坐标转换为 myShip 中的坐标。但这不起作用。也没有任何其他组合。我错过了什么?我怀疑相机层次结构,但不确定。返回到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;
}
4

2 回答 2

2

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

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

或者,在 Swift 中:

smoke.position = convertPoint(contact.contactPoint, fromNode: scene)
于 2015-12-01T04:47:18.120 回答
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];

如果返回的点在场景坐标系中,这应该在接触点所在的位置添加一个精灵。如果它确实出现在正确的位置,那么它确实归结为正确转换点。

于 2015-06-10T12:10:21.057 回答