ios - 使用 SKNode 的寻路不工作

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

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

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

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

        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";

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

方法一

    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.
    }
}

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

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

最佳答案

很多时候我发现 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
}

关于ios - 使用 SKNode 的寻路不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35692977/

相关文章:

ios - 核心数据撤消/重做 - 操作取决于撤消的内容

ios - 如何从 json 捕获 iOS 中的 NULL 异常

ios - 将图像和颜色相乘

ios - block 快速移动时的意外碰撞行为 - Sprite 通过

ios - 关闭 Sprite Kit 游戏时如何保持单例?

android - React Native 广播并发现附近的设备

ios - 在 iOS 中获取按钮的颜色

ios - xcode 中.strings 文件中的pragma 标记替代是什么?

objective-c - 如何为 MKPlacemark 创建 addressDictionary?

ios - GADInterstitialAd 导致内存问题