【问题标题】:Pathfinding With SKNode's Not Working使用 SKNode 的寻路不起作用
【发布时间】:2016-02-29 06:09:25
【问题描述】:

我一直在开发一种跟踪算法,如果 sprite kit 没有用这个来打击我,它会很好地工作......

我正在尝试确定CGPoint 是否位于我的场景中给定SKNodeSKPhysicsBody 内。我遇到的问题是我似乎无法让 SpriteKit 准确地告诉我物理体是否确实包含该点。

这是可能包含该点的主体之一的样本,以及我如何测试以查看它是否包含:

        SKSpriteNode *innerMap1 = [SKSpriteNode spriteNodeWithImageNamed:@"test"];
        // FYI - "test" is exactly 363x452. Did that to make sure scaling was not an issue
        innerMap1.physicsBody = [SKPhysicsBody bodyWithTexture:[SKTexture textureWithImageNamed:@"test"] size:CGSizeMake(363, 452)];
        innerMap1.position = CGPointMake(200, 100);
        innerMap1.physicsBody.dynamic = NO;
        innerMap1.name = @"testNode";

然后我尝试了 2 种不同的方法来查看节点是否包含以下点:

方法一

    CGPoint controlPoint = CGPointMake(<xf>, <yf>);
    if ([innerMap1 containsPoint:controlPoint]) . . .

方法二

    SKPhysicsBody *body = [self.physicsWorld bodyAtPoint:controlPoint];
    if ([body.node.name isEqualTo:@"testNode"]) . . .

无论出于何种原因,这两种方法都没有帮助。方法 1 只会告诉我该点是否在节点的框架框内,这违背了从纹理创建唯一节点形状的目的......并且由于某些奇怪的原因,方法 2 往往会非常故障和不准确。我读到大约有 15.5 像素的超标,但我得到的结果远不及这个最小值。

我也可以手动创建一个CGMutablePathRef 并使用以下内容:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self.scene];

    if (CGPathContainsPoint(pathRef, nil, touchLocation, NO)) {
        // If we are here it means user did touche physic body.
    }
}

但同样,我想要不需要单独的路径边界构建的自定义形状。

所以,我的问题是我做错了什么?我很确定 方法 2 会是最好的解决方案,或者至少可以工作,但我似乎无法理解为什么它的行为如此奇怪。也许我错过了可以解决我的问题的两种方法之一。我希望有一种方法可以为位于SKTexture 内的点返回BOOL,但当然没有。这就是为什么使用物理体应该是关键——因为它代表了精确的图像尺寸和点。任何建议将不胜感激。谢谢!

【问题讨论】:

  • 也许可以尝试在您要检测的物理体中创建一个 1px 的物理体。然后尝试每个方向移动一个像素,看看是否检测到任何碰撞。
  • 我想我可以试试——这可能行得通。我想出了问题是什么,如果你可以请看这里stackoverflow.com/questions/35705597/…
  • 我很难理解正在发生的事情。我已经完成了gameplaykit寻路,但仅限于网格地图。还没有用物理对象做过。对不起
  • 不用担心。它所做的就是拿一个物体并找到(在我的情况下)球的路径。如果在那条路径中有物理物体,它会找到它周围的最短距离,因此是那个小红点。由于某种原因,相机 centerOnNode 极大地影响了物理身体的位置。好像他们没有随着相机移动

标签: ios objective-c sprite-kit path-finding skphysicsbody


【解决方案1】:

很多时候我都发现了 CGPathContainsPoint 输出的奇怪问题。 所以,我决定编写这个解决方法:

附: (此解决方案适用于 Swift 2.x

let path: UIBezierPath = UIBezierPath.init(CGPath: myPath)
let copyPath = CGPathCreateCopyByStrokingPath(myPath, nil, path.lineWidth, path.lineCapStyle, path.lineJoinStyle, path.miterLimit )
if CGPathContainsPoint(copyPath, nil, myPoint, false) { 
   // ok path contain this point
}

【讨论】:

  • 我喜欢这个。我已经在自己周围找到了一份工作,但这很有趣。感谢朋友的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多