12

私はそれを理解していません。iPhone/Pod での小さなゲームの開発に cocos2d を使用しています。フレームワークは素晴らしいですが、タッチ検出に失敗します。CocosNode をサブクラス化するクラスの実装で、適切な関数 (「touchesBegan」など) を上書きするだけでよいと読みました。しかし、うまくいきません。何が間違っている可能性がありますか?

関数:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{NSLog(@"tickle, hihi!");}

私はそれを完全に間違っていましたか?

4

7 に答える 7

11

レイヤーは、タッチを取得する唯一の cocos2d クラスです。

秘訣は、Layer のすべてのインスタンスが次々にタッチ イベントに渡されるため、コードでこれを処理する必要があることです。

私はこのようにしました:

-(BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
CGPoint cLoc = [[Director sharedDirector] convertCoordinate: location];

float labelX = self.position.x - HALF_WIDTH;
float labelY = self.position.y - HALF_WIDTH;
float labelXWidth = labelX + WIDTH;
float labelYHeight = labelY + WIDTH;

if( labelX < cLoc.x &&
    labelY < cLoc.y &&
    labelXWidth > cLoc.x &&
    labelYHeight > cLoc.y){
        NSLog(@"WE ARE TOUCHED AND I AM A %@", self.labelString);
        return kEventHandled;
    } else {
        return kEventIgnored;
    }

}

cocos2d ライブラリには、Apple 標準ではなく、「ccTouchesEnded」実装があることに注意してください。イベントを処理したかどうかを示す BOOL を返すことができます。

幸運を!

于 2008-12-19T01:42:42.007 に答える
5

これをレイヤーのinitメソッドに追加しましたか?

    // isTouchEnabled is an property of Layer (the super class).
    // When it is YES, then the touches will be enabled
    self.isTouchEnabled = YES;

    // isAccelerometerEnabled is property of Layer (the super class).
    // When it is YES, then the accelerometer will be enabled
    self.isAccelerometerEnabled = YES;
于 2009-09-12T22:01:27.350 に答える
3

タッチを検出するには、UIResponder(UIViewも同様)からサブクラス化する必要があります。私はcocos2Dに精通していませんが、ドキュメントをざっと見ると、CocosNodeがUIResponderから派生していないことがわかります。

さらに調査すると、Cocosの人々はCocosNodeから派生したLayerクラスを作成したようです。そして、そのクラスはタッチイベントハンドラーを実装します。ただし、接頭辞はccです。

http://code.google.com/p/cocos2d-iphone/source/browse/trunk/cocos2d/Layer.hを参照してください

詳細については、menu.mコードおよび以下のブログ投稿記事も参照してください。

http://blog.sapusmedia.com/2008/12/cocos2d-propagating-touch-events.html

于 2008-12-18T21:03:20.587 に答える
3

maw、CGPoint 構造体メンバー x、y は float です。@"% f " を使用して、printf/NSLog の float をフォーマットします。

于 2009-01-01T19:06:34.943 に答える
3

cocos2D の 0.9 ベータ版を使用すると、CocosNode のタッチ検出が非常にシンプルになります。この新しい検出の真の利点は、複数のタッチ トラッキングを非常にうまく処理できることです。

この例はここにあります

http://code.google.com/p/cocos2d-iphone/source/browse/#svn/trunk/tests/TouchesTest

于 2010-01-27T00:20:26.473 に答える
1
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

        //Add a new body/atlas sprite at the touched location
        CGPoint tapPosition;
        for( UITouch *touch in touches ) {
            CGPoint location = [touch locationInView: [touch view]];

            tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]];     // get the tapped position





    }
}

これはあなたを助けることができると思います....

于 2011-04-27T11:08:35.357 に答える
0

-シーンをプロトコルに準拠させます -CCTargetedTouchDelegate この行をシーンに追加しますinit:

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];

-これらの機能を実装します。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
 {
   return  YES;
 }
 -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
  {
    //here touch is ended
  }
于 2013-03-17T14:55:19.177 に答える