1

私の前の質問からの教祖のアドバイスに従って、スプライトの透明な領域でのタッチイベントを防ぐために、init メソッドにこのコードを追加しました。

    path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, endTouch.x, endTouch.y);
    //250(y) is the height of the path, 50(x) is the width
    //set your width and height to be the same size as the non-transparent part of your sprite
    CGPathAddLineToPoint(path, NULL, 0, 250);
    CGPathAddLineToPoint(path, NULL, 50, 0);
    CGPathCloseSubpath(path);

次に、タッチ イベントを次のように変更しました。

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if(gameStat == TRUE)
{
    UITouch *touch=[touches anyObject];
    CGPoint loc=[touch locationInView:[touch view]];
    loc=[[CCDirector sharedDirector] convertToGL:loc];
    beginTouch = loc;

    for(int i = 0; i < [sprArray count]; i++)
    {
        CCSprite *sprite = (CCSprite *)[sprArray objectAtIndex:i];
        if(CGRectContainsPoint([sprite boundingBox], loc))
        {
            selectedSprite = sprite;
            //test the path
            loc = [selectedSprite convertToNodeSpace:loc];
            if (CGPathContainsPoint(path, NULL, loc, NO) ) {
                NSLog(@"inside");
            }
            else {
                NSLog(@"outside");
            }
            break;
        }
    }
}}

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint loc1 = [touch previousLocationInView:[touch view]];
CGPoint loc2 = [touch locationInView:[touch view]];
loc2 = [[CCDirector sharedDirector]convertToGL:loc2];
endTouch = location;

int goUp = loc2.y - loc1.y;
if(goUp > 0){
CGPoint locationPath  = [selectedSprite convertToNodeSpace:location];
        if (CGPathContainsPoint(path, NULL, locationPath, NO) ) {
            [selectedSprite setPosition:location];
            _spriteTouch = TRUE;
        }
}}

さて、これはうまく機能しますが、私の問題は、スプライトが間違った方向に動く傾向があることです. 上向きのタッチスワイプに従うはずですが、どのように上向きにスワイプしても、代わりに右に進み続けます。ここで何が間違っていますか?私を助けてください。

更新:コードを修正する方法を見つけたので、これは既に解決されています。他の誰かが同じ問題に遭遇した場合に備えて、コードを更新しました。

4

2 に答える 2

2

これを変更してみましたか

 loc = [selectedSprite convertToNodeSpace:loc];

次へ

 loc = [selectedSprite convertToWorldSpace:loc];

[編集:更新されたサンプル]
convertToGLの呼び出し以降:ポイントベースはOpenGLベースにフォーマットされます。ここで:

コーディネート

y+           (0,0)                  |y+
|            +------ y+      x-     |      x+
|            |               ---- (0,0) ----
|            |                      |
+ ---- x+    |                      |
(0,0)        x+                     y-
OpenGl       Cocoa Touch         Cartesian

画面からの原点(Cocoa Touch)はOpenGL座標を認識していないため、Cocos2dCCDirectorで変換する必要があります。

  • (CGPoint)convertToGL:(CGPoint)p
    はUIKit座標をOpenGL座標に変換します(マルチ)タッチ座標を現在のレイアウト(縦向きまたは横向き)に変換するのに便利です

同じことが逆になります

  • (CGPoint)convertToUI:(CGPoint)p
    はOpenGL座標をUIKit座標に変換しますglScissorなどの呼び出しのためにノードポイントをウィンドウポイントに変換するのに便利です

時々、(ブレークポイントの代わりに)混乱してログに記録することがあり、ポイントが有効な座標を決定するので、ロジックを理解できます。

NSLog(@"%@", NSStringFromCGPoint(touchPoint.position));
于 2013-02-19T03:13:54.467 に答える
0

touchesMoved メソッドでは、これを行っています:-

loc2 = [[CCDirector sharedDirector]convertToGL:loc2];

ただし、それに応じて loc1 を GL 座標に変換しません。これを試してみるべきだと思います:-

loc1 = [[CCDirector sharedDirector]convertToGL:loc1];

それは役立つかもしれません。

于 2013-02-19T04:49:45.153 に答える