1

私は 4 つの UIGestureSwipeRecognizers を登録しており (各方向に 1 つ)、iPhone 4/4S (iOS 4.3 および 5) および iPad 1/2 (iOS 4.NotSure および 5) で意図したとおりに動作します。これはゲームであるため、許可されるデバイスの向きは LandscapeRight と LandscapeLeft のみです。ただし、iOS 4.1 を搭載した iPhone 3G では、デバイスが縦向きに保持されているかのように、スワイプ認識機能が応答します。つまり、iPhone 3G では、LandscapeLeft で上スワイプであるべきものが、右スワイプとして登録されます。実際、4 つのスワイプ認識機能はすべて、デバイスが縦向きであるかのように動作します。ただし、確認[[UIDevice currentDevice] orientation]したところ、常に返されますUIDeviceOrientationLandscapeLeft

また、このアプリは cocos2d 1.0.1 テンプレートに基づいて構築されたゲームです。

私は何が間違っているのでしょうか?

4 つのスワイプ認識エンジンを登録するコードは次のとおりです。

_swipeRecognizer_right = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightDetected)];
_swipeRecognizer_right.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:_swipeRecognizer_right];
_swipeRecognizer_right.delegate = self;

_swipeRecognizer_left = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftDetected)];
_swipeRecognizer_left.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:_swipeRecognizer_left];
_swipeRecognizer_left.delegate = self;

_swipeRecognizer_up = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUpDetected)];
_swipeRecognizer_up.direction = UISwipeGestureRecognizerDirectionUp;
[self.view addGestureRecognizer:_swipeRecognizer_up];
_swipeRecognizer_up.delegate = self;

_swipeRecognizer_down = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDownDetected)];
_swipeRecognizer_down.direction = UISwipeGestureRecognizerDirectionDown;
[self.view addGestureRecognizer:_swipeRecognizer_down];
_swipeRecognizer_down.delegate = self;
4

2 に答える 2

1

方向を変換する以外に回避方法はありません。この内部メソッドを使用してKobold2Dのスワイプ ジェスチャ レコグナイザでこれを実行しました。簡単に適応できるはずです。

-(KKSwipeGestureDirection) convertSwipeDirection:(UISwipeGestureRecognizerDirection)uiDirection
{
    // portrait mode direction remains unchanged
    KKSwipeGestureDirection direction = (KKSwipeGestureDirection)uiDirection;

    switch (uiDirection)
    {
        case UISwipeGestureRecognizerDirectionRight:
        {
            switch (director.deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = KKSwipeGestureDirectionLeft;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = KKSwipeGestureDirectionUp;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = KKSwipeGestureDirectionDown;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionLeft:
        {
            switch (director.deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = KKSwipeGestureDirectionRight;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = KKSwipeGestureDirectionDown;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = KKSwipeGestureDirectionUp;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionUp:
        {
            switch (director.deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = KKSwipeGestureDirectionDown;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = KKSwipeGestureDirectionLeft;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = KKSwipeGestureDirectionRight;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionDown:
        {
            switch (director.deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = KKSwipeGestureDirectionUp;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = KKSwipeGestureDirectionRight;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = KKSwipeGestureDirectionLeft;
                    break;
                default:
                    break;
            }
            break;
        }
    }

    return direction;
}

Cocos2D 2.xを使用している場合は、CCDirector に deviceOrientation プロパティがなくなったことを知っておく必要があります。代わりに、UIDevice から方向を取得するだけです。

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

次に、 CCUIプレフィックスに置き換えて、すべてのケース ラベルを変更します。たとえば、

case CCDeviceOrientationPortraitUpsideDown:

次のように変更する必要があります。

case UIDeviceOrientationPortraitUpsideDown:
于 2011-12-26T11:15:59.070 に答える
1

@LearnCocos2D が提供する関数を Cocos2d-iphone のみのコード (つまり、Kobold2D とは無関係) に変換しました。

- (UISwipeGestureRecognizerDirection) convertSwipeDirection:(UISwipeGestureRecognizerDirection)uiDirection
{
    // portrait mode direction remains unchanged
    UISwipeGestureRecognizerDirection direction = (UISwipeGestureRecognizerDirection)uiDirection;

    // Get cocod2d device orientation
    ccDeviceOrientation deviceOrientation = [[CCDirector sharedDirector] deviceOrientation];

    switch (uiDirection)
    {
        case UISwipeGestureRecognizerDirectionRight:
        {
            switch (deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = UISwipeGestureRecognizerDirectionLeft;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = UISwipeGestureRecognizerDirectionUp;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = UISwipeGestureRecognizerDirectionDown;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionLeft:
        {
            switch (deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = UISwipeGestureRecognizerDirectionRight;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = UISwipeGestureRecognizerDirectionDown;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = UISwipeGestureRecognizerDirectionUp;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionUp:
        {
            switch (deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = UISwipeGestureRecognizerDirectionDown;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = UISwipeGestureRecognizerDirectionLeft;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = UISwipeGestureRecognizerDirectionRight;
                    break;
                default:
                    break;
            }
            break;
        }

        case UISwipeGestureRecognizerDirectionDown:
        {
            switch (deviceOrientation)
            {
                case CCDeviceOrientationPortraitUpsideDown:
                    direction = UISwipeGestureRecognizerDirectionUp;
                    break;
                case CCDeviceOrientationLandscapeLeft:
                    direction = UISwipeGestureRecognizerDirectionRight;
                    break;
                case CCDeviceOrientationLandscapeRight:
                    direction = UISwipeGestureRecognizerDirectionLeft;
                    break;
                default:
                    break;
            }
            break;
        }
    }

    return direction;
}
于 2012-01-07T23:37:54.963 に答える