我在这件事上花的时间太长了。已经有人解决了,请帮帮忙。
敌人向我的船开火。SKPhysicsContact接手我接手contactPoint我在世界坐标中引爆了发射到contactPoint的导弹。一切都很好。现在我想使用这个点,不是在contactPoint返回的场景坐标中,而是在我的船坐标中,开始从我被击中的船上发射烟雾。我以前使用过convertPoint函数,很成功,但我似乎不能正确地使用它。here...Docs说contactPoint是用场景坐标表示的,而myShip有它的坐标,作为world节点的子节点存在,而world节点是Scene节点的子节点。它们位于相同的节点层次结构中。我想...我有一个场景->世界->相机,其中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;
}发布于 2015-12-01 12:47:18
如果你还没有解决这个问题,答案是从节点的场景中转化:
smoke.position = [self convertPoint:contact.contactPoint fromNode:self.scene];或者,在Swift中:
smoke.position = convertPoint(contact.contactPoint, fromNode: scene)发布于 2015-06-10 20:10:21
如果我正确理解了您的节点层次结构,这可以解决这个问题。
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];如果返回的点位于场景坐标系中,则应在接触点的确切位置添加精灵。如果它确实出现在正确的点上,那么归根结底就是正确地转换点。
https://stackoverflow.com/questions/30745371
复制相似问题