0

さて、私は今stackoverflowの周りにいくつかの質問がありましたが、それらのほとんどはこの1つの質問に関連しています. 私は自分でそれを取得しようとしてきましたが、数回ありますが、結果は決して期待したものではありません. スプライトが投げることができるチェーンを開発しようとしています。

これまでのところ、フックのリードをスプライトの中心から外側に投げました。スプライトの位置から 10 ピクセル移動すると、チェーン内に別のリンクが生成されます。次に、リード チェーンの回転に合わせてチェーンを回転させ、ジョイント ピンを使用してチェーンを取り付けます。実際にはかなりうまく機能します。唯一の問題は、物理世界の速度を 0.01 に設定した場合にのみ機能することです。通常の物理演算に戻すと、リード リンクがチェーンにスローされますが、基本的には他のすべてがスキップされます。この前に、リード リンクを物理ボディに含め、didEndContact を呼び出して他のリンクをアタッチしようとしましたが、ほとんどうまくいきませんでした。

どうすればこれを達成できるかについて誰かアイデアがありますか? チェーンがスプライトの位置から最大の長さまで伸び、その後収縮する必要があるだけです。こんなに大変だとは思いませんでした。私のコードを投稿してほしい場合は喜んで投稿しますが、うまくいくとは思わないので、まだ追加していません。何週間も前から頭を悩ませてきましたが、スタックオーバーフローコミュニティに深く感謝している多くの貴重な概念を学びましたが、どこにも行き着いていないようです。

4

1 に答える 1

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];
}

編集: このメソッドは、始点と終点で定義された線が 1 つ以上の物理体と交差するタイミングを検出します。

- (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]];
    }];
}
于 2014-10-13T08:30:58.760 に答える