0

私のプロジェクトでは、ユーザーが画面をタッチできるようにしたいと考えています。ユーザーが移動すると線が描画されます。

また、ユーザーが以前に描いた既存の線 (同じ線自体を含む) と交差しないようにしたいと考えています。

ライン交差アルゴリズムまたは関数を検索しましたが、それらは複雑すぎてパフォーマンスも良くありません。そこで、別の方法を考えました。背景と線の色を別々に設定することで、現在のタッチポイントの色を読み取ることができれば、それを線の色と比較して、交差が発生するかどうかを調べることができます。

glReadPixel メソッドを使用してみましたが、背景にも線にも設定されていないすべてのタッチ ポイントに対して緑色が返されます。私の背景はデフォルトの色(黒)で、線はデフォルトの白です。すべての線は同じレイヤーに描画されます。背景を別レイヤーとして描いていません。デフォルトを使用するだけです。

    -(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CCLOG(@"touch moved");
    UITouch* touch = [touches anyObject];
    CGPoint currentTouchPoint = [touch locationInView:[touch view]];
    CGPoint lastTouchPoint = [touch previousLocationInView:[touch view]];

    currentTouchPoint = [[CCDirector sharedDirector] convertToGL:currentTouchPoint];
    lastTouchPoint = [[CCDirector sharedDirector] convertToGL:lastTouchPoint];

    CCRenderTexture* renderTexture = [CCRenderTexture renderTextureWithWidth:1 height:1];
    [renderTexture begin];
    [self visit];
    Byte pixelColors[4];
    glReadPixels(currentTouchPoint.x, currentTouchPoint.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixelColors[0]);
    [renderTexture end];
    CCLOG(@"pixel color: %u, %u, %u", pixelColors[0], pixelColors[1], pixelColors[2]); 


    CCLOG(@"last a=%.0f, b=%.0f", lastTouchPoint.x, lastTouchPoint.y);
    CCLOG(@"Current x=%.0f, y=%.0f",currentTouchPoint.x, currentTouchPoint.y);
    [touchPoints addObject:NSStringFromCGPoint(currentTouchPoint)];
    [touchPoints addObject:NSStringFromCGPoint(lastTouchPoint)];
}

-(void)draw{
    CGPoint start;
    CGPoint end;
    glLineWidth(4.0f);
    for (int i=0; i<[touchPoints count]; i=i+2) {
        start = CGPointFromString([touchPoints objectAtIndex:i]);
        end = CGPointFromString([touchPoints objectAtIndex:i+1]);
        ccDrawLine(start, end);
    }
}
4

1 に答える 1

1

OpenGLメソッド(ここではglReadPixels)は、drawメソッドまたはvisitメソッドのいずれかでのみ使用できます。それがあなたがいつも緑になる理由である可能性が最も高いです。

レンダーテクスチャのbegin/endメソッド内では、レンダーテクスチャにのみアクセスでき、フレームバッファにはアクセスできません。

于 2013-03-16T15:56:32.003 に答える