0

次のコードを使用してスプライト キット シーンで線を描画していますが、何も表示されません。しかし、ノード数は増えます。何が問題なのか誰でもわかりますか。私は永遠にこのコードと戦ってきました

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    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];
    //lineNode.lineWidth = 2;
    [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:pathToDraw];
  //  lineNode.physicsBody.dynamic = NO;
  //  lineNode.physicsBody.categoryBitMask = lines;
  //  lineNode.physicsBody.contactTestBitMask = 0;
  //  lineNode.physicsBody.collisionBitMask = blueParticles | redParticles| yellowParticles;

    CGPathRelease(pathToDraw);
}

編集 ------ バックグラウンド ノードが削除されたときにコードが機能します。ありがとう

SKSpriteNode *background;

        if(screenHeight == 480){
            background = [SKSpriteNode spriteNodeWithImageNamed:@"iPhone4BG.png"];
        }
        if(screenHeight == 568){
            background = [SKSpriteNode spriteNodeWithImageNamed:@"iPhone5BG.png"];
        }
        if(screenHeight == 667){
            background = [SKSpriteNode spriteNodeWithImageNamed:@"iPhone6BG.png"];
        }
        if(screenHeight == 736){
            background = [SKSpriteNode spriteNodeWithImageNamed:@"iPhone6PlusBG.png"];
        }

        background.position = CGPointMake(screenWidth/2, screenHeight/2);
        background.size = CGSizeMake(screenWidth, screenHeight);

       // [self addChild:background];
4

2 に答える 2

2

: コアの問題は、シミュレーターが閉じていないパスをレンダリングしないことでした。デバイスに問題はありません。また、元のポスターでは言及されておらず、コードで表現されていない背景要素も含まれていました。この回答は、シミュレータの問題を解決します。

問題を解決するには、コードを次のように変更します。

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);
    // add this line to fix your issue
    CGPathMoveToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);
    lineNode.path = pathToDraw;

}

中心的な問題は、パスをレンダリングするときに、完全なパスがないことです。あなたの現在のアプローチは、各 touchMove のパスを常に変更することです。

サブパスを閉じる方法は次のとおりです。

CGPathCloseSubpath(pathToDraw);

ただしCGPathMoveToPoint、パスにセグメントを追加するたびに使用することにしました。

の CGPath リファレンスからCGPathMoveToPoint:

この関数は、すでに進行中のサブパス (存在する場合) を終了し、新しいサブパスを開始し、オプションの変換後に開始点と現在の点を指定された場所 (x,y) に初期化します。

レンダリングする前に現在のサブパスを閉じ、次のセグメントの開始位置も設定しています。

ただし、長い行または多くの行を描画する場合は、コメントのリンクで定義されているように、パフォーマンスに大きな問題が発生します。非常に長い線を引くと、私の言いたいことがわかるでしょう。最小限の線画で、現在のアプローチを回避できる可能性があります。

悲しいことに、 でのこの性質の描画は、本来SKShapeNodeあるべきほど最適化されていません。

于 2014-09-25T19:23:39.013 に答える
2

これがあなたが実装しようとしているものだと思います。指を動かすと一時的な線 (白) が描画され、指を離すと最終的な線 (赤) が描画されます。startingPoint という名前の CGPoint インスタンス変数を宣言し、pathToDraw という名前の CGMutablePathRef ivar を削除する必要があります。コードを変更して、複数の接続された線分を描画することもできます。

- (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];
}
于 2014-09-25T18:35:48.523 に答える