1

ユニットの移動方向を変えるゲームコントロールを実装しようとしています。したがって、右にスワイプすると右に回転し、下にスワイプすると下方向に回転します。

それはcocos2dゲームで、私CCNode+SFGestureRecognizersUISwipeGestureRecognizer.

現在、次の実装があります

UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
        [self addGestureRecognizer:rightSwipeGestureRecognizer];
        rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
        rightSwipeGestureRecognizer.delegate = self;
        [rightSwipeGestureRecognizer release];
        
        UISwipeGestureRecognizer *upSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleUpSwipe:)];
        [self addGestureRecognizer:upSwipeGestureRecognizer];
        upSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
        upSwipeGestureRecognizer.delegate = self;
        [upSwipeGestureRecognizer release];
        
        UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipe:)];
        [self addGestureRecognizer:leftSwipeGestureRecognizer];
        leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
        leftSwipeGestureRecognizer.delegate = self;
        [leftSwipeGestureRecognizer release];
        
        UISwipeGestureRecognizer *downSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleDownSwipe:)];
        [self addGestureRecognizer:downSwipeGestureRecognizer];
        downSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
        downSwipeGestureRecognizer.delegate = self;
        [downSwipeGestureRecognizer release];

しかし問題は、次のジェスチャを認識するために画面から指を離す必要があることです。最初のスワイプの後に指を離さないと、最初のスワイプだけが認識されます。

現在:

ここに画像の説明を入力

それがどうあるべきか:

ここに画像の説明を入力

それを行う最善の方法は何ですか?ありがとう!

4

2 に答える 2

1

cancelsTouchesInViewが役立つはずです。ジェスチャ認識エンジンがジェスチャを認識したときに、タッチ イベントがキャンセルされるのを防ぎます。これにより、他のジェスチャ レコグナイザーが引き続きジェスチャをチェックできるようになります。

  rightSwipeGestureRecognizer.cancelsTouchesInView = NO;
  upSwipeGestureRecognizer.cancelsTouchesInView = NO;
  leftSwipeGestureRecognizer.cancelsTouchesInView = NO;
  downSwipeGestureRecognizer.cancelsTouchesInView = NO;
于 2013-01-18T14:46:00.533 に答える
1

わかりました、私の解決策があります。それは本当に良い解決策だとは思いませんが、私の場合は、時間間隔ごとに方向を取得する必要があるため、うまくいきます。

したがって、私のCCLayerサブクラスでは:

#define SWIPE_LENGTH        60
#define SWIPE_TANGENT       2

...

@property(nonatomic, assign) CGPoint latestLocation;

...

-(id) init
{
    if( (self=[super init]) )
        {
            self.isTouchEnabled = YES;
        }
    return self;
}

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];
    self.latestLocation = location;
}

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];
    CGPoint delataLocation = CGPointMake(location.x - self.latestLocation.x, location.y - self.latestLocation.y);
    if ( sqrt(pow((delataLocation.x), 2) + pow((delataLocation.y), 2) ) > SWIPE_LENGTH ) {
        if (delataLocation.y > 0 && delataLocation.y > SWIPE_TANGENT * ABS(delataLocation.x))
        {
            [self handleSwipeWithDirestion:SDirectionTypeUp];
        } else if (delataLocation.y < 0 && ABS(delataLocation.y) > SWIPE_TANGENT * ABS(delataLocation.x))
        {
            [self handleSwipeWithDirestion:SDirectionTypeDown];
        } else if (delataLocation.x > 0 && delataLocation.x > SWIPE_TANGENT * ABS(delataLocation.y))
        {
            [self handleSwipeWithDirestion:SDirectionTypeRight];
        } else if (delataLocation.x < 0 && ABS(delataLocation.x) > SWIPE_TANGENT * ABS(delataLocation.y))
        {
            [self handleSwipeWithDirestion:SDirectionTypeLeft];
        }
        self.latestLocation = location;
    }
}
于 2013-01-20T20:20:24.307 に答える