如何建立一个延伸链

时间:2014-10-04 18:34:21

标签: objective-c xcode sprite-kit skphysicsbody skphysicsjoint

好的,我现在有一些关于stackoverflow的问题,其中大部分与这一个问题有关。我一直试图自己拿到它,而且我有几次,但结果从来都不是我的预期。我正在尝试开发一个我的精灵可以抛出的链。

到目前为止,我所做的是从精灵中心向外抛出钩子的引线。一旦它从精灵位置移动10个像素,它就会在链中产生另一个链接。然后旋转链条以匹配引线链旋转并使用连接销连接到链条。它实际上运作得相当好。唯一的问题是它只有在我将物理世界速度设置为0.01时才有效。如果我把它恢复到正常物理状态,它会抛出链中的主要链接,但基本上会跳过其他所有内容。在此之前,我尝试在物理主体中包含引导链接并调用didEndContact来附加其他链接,但这种方式几乎没有。

有没有人对如何做到这一点有任何想法?我只需要链条从精灵位置延伸到最大长度,然后再缩回。我不知道这会很困难。提前感谢您的所有帮助,如果您希望我发布我的代码,我会很高兴,但考虑到我不认为它会起作用我还没有添加它。再次非常感谢你,我已经把我的大脑震撼了几个星期,似乎我无处可去,虽然我已经学到了许多宝贵的概念,我非常感谢stackoverflow社区。

1 个答案:

答案 0 :(得分:1)

这是一个如何画一条连续更新的线的简单例子......

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

    startingPoint = positionInScene;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    // Remove temporary line if it exist
    [lineNode removeFromParent];

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

    lineNode = [SKShapeNode node];
    lineNode.path = pathToDraw;
    CGPathRelease(pathToDraw);
    lineNode.strokeColor = [SKColor whiteColor];
    lineNode.lineWidth = 1;
    [self addChild:lineNode];
}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    // Remove temporary line
    [lineNode removeFromParent];

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

    SKShapeNode *finalLineNode = [SKShapeNode node];
    finalLineNode.path = pathToDraw;
    CGPathRelease(pathToDraw);
    finalLineNode.strokeColor = [SKColor redColor];
    finalLineNode.lineWidth = 1;
    [self addChild:finalLineNode];
}

编辑:此方法检测由点开始和结束定义的线与一个或多个物理实体相交的时间。

- (void) rotateNodesAlongRayStart:(CGPoint)start end:(CGPoint)end
{
    [self.physicsWorld enumerateBodiesAlongRayStart:start end:end
                    usingBlock:^(SKPhysicsBody *body, CGPoint point,
                                    CGVector normal, BOOL *stop)
    {
        SKNode *node = body.node;
        [node runAction:[SKAction rotateByAngle:M_PI*2 duration:3]];
    }];
}