SKPhysicsBody来自一条线(非闭合多边形)

时间:2014-11-29 22:10:38

标签: ios objective-c sprite-kit

我正在尝试从场景中绘制的线创建SKPhysicsBody。此行不是封闭的多边形,而是在touchesMoved中跟踪用户手指时创建的。我需要从这条线上创建一个物理体,这样一个球就像它是一个壁架一样反弹,但我似乎无法弄清楚如何做到这一点。

我发现的最接近的是bodyWithPolygonFromPath,但只有在线被关闭为多边形时才有效。

我对iOS编程很新(这是我的第一个项目)所以请放轻松!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [lineNode removeFromParent];
    CGPathRelease(pathToDraw);

    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    pathToDraw = CGPathCreateMutable();
    CGPathMoveToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);

    lineNode = [SKShapeNode node];
    lineNode.path = pathToDraw;
    lineNode.strokeColor = [SKColor redColor];
    [self addChild:lineNode];
}

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);

    lineNode.path = pathToDraw;

}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    lineNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:lineNode.path];
    lineNode.physicsBody.categoryBitMask = paddleCategory;
    lineNode.physicsBody.collisionBitMask = ballCategory | paddleCategory;
    lineNode.physicsBody.contactTestBitMask = ballCategory | paddleCategory;
}

1 个答案:

答案 0 :(得分:0)

线是否需要移动或对碰撞做出反应,或者只是造成碰撞?

如果是前者,你需要一个动态的身体 - 一个动态的身体必须有体积(井,面积),所以开放的道路不会起作用。在这种情况下,您可以将路径沿自身循环以关闭它(可能很容易编码但很难使工作正常)或使用一组窄矩形体近似路径。

如果是后者,静态的身体会做。您可以使用bodyWithEdgeFromPoint:toPoint:从两个点之间的线段创建一个,也可以使用bodyWithEdgeChainFromPath:从一系列线段创建一个。