1

下にレイヤーがあり、HelloWorldLayerどこでもタッチが機能しますが、下のレイヤーのスプライトにタッチしたときにのみ機能するようにしたいと思いturtleます。

レイヤーに追加しようとするself.isTouchEnabled = YES;と、CCTurtle

isTouchEnabledオブジェクトタイプCCTurtleにプロパティが見つかりません

私の出力は次のようになります

2013-01-08 20:30:14.767 FlashToCocosARC [6746:d503] cocos2d:割り当て解除

2013-01-08 20:30:15.245 FlashToCocosARC [6746:d503]ウォークアニメーションの再生2

これが私のHelloWorldLayerコードです:

#import "HelloWorldLayer.h"
#import "CCTurtle.h"

@implementation HelloWorldLayer

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];
    HelloWorldLayer *layer = [HelloWorldLayer node];
    [scene addChild: layer];
    return scene;
}

-(id) init
{
    if( (self=[super init])) {
        turtle= [[CCTurtle alloc] init];
        [turtle setPosition:ccp(300, 100)];
        [self addChild:turtle];
        ///addChild:child z:z tag:aTag;
        self.isTouchEnabled = YES;
        turtle. tag=4;
    //

    }
return self;
}



//- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    // Processing all touches for multi-touch support
//    UITouch *touch = [touches anyObject];
//    if ([[touch view] isKindOfClass:[turtle class]]) {
//        NSLog(@"[touch view].tag = %d", [touch view].tag);
//        [self toggleTurtle];
//    }
//}
-(BOOL)containsTouch:(UITouch *)touch {
    CGRect r=[turtle textureRect];
    CGPoint p=[turtle convertTouchToNodeSpace:touch];
    return CGRectContainsPoint(r, p );
}
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //////GENERAL TOUCH SCREEN
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:[touch view]];
        touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
        [self toggleTurtle];
        /////
    }

}
-(void) toggleTurtle
{
    NSLog(@"playing walk animation2");
   [turtle playAnimation:@"walk_in" loop:NO wait:YES];
}



@end

//こんにちはworld.h

    #import "cocos2d.h"
    #import "CCTurtle.h"

    @interface HelloWorldLayer : CCLayer 
    {
    CCTurtle                *turtle;
    }

    +(CCScene *) scene;

    @end

// CCturtle

    #import <Foundation/Foundation.h>
    #import "FTCCharacter.h"

    @interface CCTurtle : FTCCharacter <FTCCharacterDelegate, CCTargetedTouchDelegate>
    {

    }
    @end

私はCocos2Dcocos2dv1.0.1(arch対応)を使用しており、ipad4.3シミュレーターでテストしています。感謝を込めてナタリー

iveはタッチをccturtle.mに直接入れようとしたため、上記のようにCCTargetedTouchDelegateを使用して独自のタッチを処理できますが、

CCturtle ///ファイルをこれに変更して、タッチされた領域を見つける別の方法を試しました...

    - (CGRect)rect
   {
   CGSize s = [self.texture contentSize];
   return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
   }

   -(BOOL) didTouch: (UITouch*)touch {
   return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
   //return CGRectContainsPoint( [self rect], [self convertTouchToNodeSpaceAR: touch] );
   }

   -(BOOL) ccTouchBegan:(UITouch*)touch withEvent: (UIEvent*)event {
   NSLog(@"attempting touch.");
   if([self didTouch: touch]) {
   return [self tsTouchBegan:touch withEvent: event];
   }
   return NO;
   }

ただし、 「プロパティ」は「TouchEnabled」というエラーがオブジェクトタイプ「CCTurtle *」に見つからないため、コンパイルされません。

今それを実行するために私が何ができるか本当にわかりません...そして本当にこれを機能させる必要があります(私は目に見えないボタンを作ることができると思いますが、ccturtleを正しく見つけて何を理解することができればもっといいでしょう私は間違っています...誰かが助けることができることを願っています

4

3 に答える 3

1

まず、containsTouch:メソッドの呼び出しがどこにも見当たりません。そして、ここにいくつかのアドバイスがあります:

boundingBoxの代わりに使用textureRectして、ノード (この場合はタートル) のローカル rect を取得します。または、containsTouch:メソッドをタートル クラスに置き換えて、これをカプセル化します。たとえば、タートルのタッチ領域を大きく/小さくしたい場合に役立ちます。タートル クラスの小さなメソッドを 1 つ変更するだけです。

あなたのccTouchesBegan:withEvent:方法では、このタッチでヒットしたかどうかをすべてのタートルで確認してください。次に、たとえば、 touch をキーとして、対応するタートルの配列を値として辞書を作成できます。次に、メソッドで移動したタッチのすべてのタートルの位置を更新し、このタートルの配列をccTouchCancelled:withEvent: メソッドccTouchesMoved:withEvent:の辞書から削除するだけです。ccTouchesEnded:withEvent:

于 2013-01-08T13:28:05.740 に答える
0

Prototypicalのおかげで、問題は解決しました。CCTurtleは、ある種のスプライトを含むレイヤーでしたが、ネストされたスプライトでした。これは、cocos2dが「containstouchmethod」の正しいバウンディングボックスを作成する際に問題が発生したことを意味します。

そこで、少し魔法をかけて、彼の「get fullboundingbox」メソッドをcontainstouchメソッドに組み合わせて、スプライトの子を説明しました。コードは、衝突検出に依存してタッチを処理するようになりました。現在、私は喜んで彼のためにいくつかの素敵なアイコンに取り組んでいます

しかし、助けてくれたすべての人に感謝し、この方法が同じ問題を抱えている人に役立つことを願っています!

于 2013-01-10T08:25:42.860 に答える
0

CCTurtle オブジェクトが対象のタッチを受け入れるようにする場合は、CCTargetedTouchDelegate プロトコルに準拠するように指定することで実現できます。CCTurtle @interface で、次のように宣言します。

@interface CCTurtle : CCNode <CCTargetedTouchDelegate>

次に、実装で、タッチを受け入れて ccTouch メソッドを実装するように指示します。

@implementation CCTurtle

-(id) init {
.
.
    [[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES];
    return self;
}

-(void) onExit {
    [[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    if (CGRectContainsPoint([self boundingBox], location] {
        // some code here
    }
}


-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { // code here }
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { // code here}
-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event { // code here}
于 2013-01-08T20:29:00.117 に答える