首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将SKPhysicsContact contactPoint转换为我的SKSpriteNode职位

如何将SKPhysicsContact contactPoint转换为我的SKSpriteNode职位
EN

Stack Overflow用户
提问于 2015-06-10 09:01:29
回答 2查看 774关注 0票数 1

我在这件事上花的时间太长了。已经有人解决了,请帮帮忙。

敌人向我的船开火。SKPhysicsContact接手我接手contactPoint我在世界坐标中引爆了发射到contactPoint的导弹。一切都很好。现在我想使用这个点,不是在contactPoint返回的场景坐标中,而是在我的船坐标中,开始从我被击中的船上发射烟雾。我以前使用过convertPoint函数,很成功,但我似乎不能正确地使用它。here...Docs说contactPoint是用场景坐标表示的,而myShip有它的坐标,作为world节点的子节点存在,而world节点是Scene节点的子节点。它们位于相同的节点层次结构中。我想...我有一个场景->世界->相机,其中myShip是世界的孩子。我想,我的代码是将contactPoint从场景坐标转换为myShip中的坐标。但这是行不通的。任何其他组合也不会。我遗漏了什么?我怀疑摄像头的层次结构,但不确定。返回到smoke.position中的数字是不正常的。

代码语言:javascript
复制
- (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;
}
EN

回答 2

Stack Overflow用户

发布于 2015-12-01 12:47:18

如果你还没有解决这个问题,答案是从节点的场景中转化:

代码语言:javascript
复制
smoke.position = [self convertPoint:contact.contactPoint fromNode:self.scene];

或者,在Swift中:

代码语言:javascript
复制
smoke.position = convertPoint(contact.contactPoint, fromNode: scene)
票数 2
EN

Stack Overflow用户

发布于 2015-06-10 20:10:21

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

代码语言:javascript
复制
CGPoint contact = [self convertPoint:contact.contactPoint toNode:self.world];
smoke.position = [self.world convertPoint:contact toNode:myShip];

我不认为你可以直接将点转换为船。您必须将其向下转换到层次结构中,直到到达所需的节点。

希望这能有所帮助。

编辑

为了验证实际的接触点是否在现场,我希望你可以尝试一下。

代码语言:javascript
复制
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(50, 50)];
sprite.position = contact.contactPoint;
[self addChild:sprite];

如果返回的点位于场景坐标系中,则应在接触点的确切位置添加精灵。如果它确实出现在正确的点上,那么归根结底就是正确地转换点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30745371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档