1

作成中のプレーヤー コントローラーのアルゴリズムに問題があります。Cocos2D を使用してプラットフォーマー スタイルのゲームを作成しています (スーパー マリオ ブラザーズを考えてください)。私のコントローラーには左右のボタンがあり、画面の右半分をタッチするとジャンプします。

私が抱えている問題は、右または左のボタンを押したまま画面を押してジャンプし、方向ボタンを放すと、ユーザーが画面から指を離すまでプレーヤーがその方向に進み続けることです。 .

もう 1 つの問題は、ユーザーが画面を保持してジャンプし、方向ボタンをタップしてから、画面を保持したまま方向ボタンを放すと、プレイヤーはその方向に進み続けることです。プレイヤーが画面を離すと停止する時間の半分は、画面が再びタップされるまで、残りの半分の時間は離し続けます。

これは、コントローラーのどの部分がタップされているかを登録するための私のコードです。

- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch* touch in touches)
    {
        CGPoint point = [self convertTouchToNodeSpace: touch];

        // Create a rect around right half of the window
        CGSize winSize = [CCDirector sharedDirector].winSize;
        CGRect jumpBox = CGRectMake(winSize.width / 2,
                                    0,
                                    winSize.width / 2,
                                    winSize.height);


        // left button
        if (CGRectContainsPoint(leftButtonSprite.boundingBox, point))
        {
            self.isPressingLeftButton = YES;
            self.isPressingRightButton = NO;
        }

        // right button
        else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point))
        {
            self.isPressingRightButton = YES;
            self.isPressingLeftButton = NO;
        }

        // player's trying to jump
        if (CGRectContainsPoint(jumpBox, point))
        {
            self.isTouchingScreen = YES;
        }
    }
}

- (void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch* touch in touches)
    {
        CGPoint point = [self convertTouchToNodeSpace: touch];

        // Create a rect around right half of the window
        CGSize winSize = [CCDirector sharedDirector].winSize;
        CGRect jumpBox = CGRectMake(winSize.width / 2,
                                    0,
                                    winSize.width / 2,
                                    winSize.height);


        // left button
        if (CGRectContainsPoint(leftButtonSprite.boundingBox, point))
        {
//            CCLOG(@"Pressing left");
            self.isPressingLeftButton = YES;
            self.isPressingRightButton = NO;
        }

        // right button
        else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point))
        {
//            CCLOG(@"Pressing right");
            self.isPressingRightButton = YES;
            self.isPressingLeftButton = NO;
        }

        // player's trying to jump
        if (CGRectContainsPoint(jumpBox, point))
        {
//            CCLOG(@"Jumping");
            self.isTouchingScreen = YES;
        }

    }
}

- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.isTouchingScreen)
    {
        CCLOG(@"Stop jumping");
        self.isTouchingScreen = NO;
    }
    else
    {
        CCLOG(@"Stop moving");
        self.isPressingLeftButton = NO;
        self.isPressingRightButton = NO;
    }
}

このコードは、 myHUDLayer.mの子である my にありGameplayLayer.mます。GameplayLayer はupdate:、HUDLayer のどのフラグが設定されているかを判断するために使用し、それに応じてプレイヤーを動かします

4

1 に答える 1

0

理解した。n00b の間違いのようなものです。ではccTouchesEnded:withEvent:convertTouchToNodeSpace方向ボタンの四角形と交差するかどうか、または で行ったように画面の半分にジャンプするかどうかを確認する必要がありましたccTouchesBegan:withEvent:

これがいつか誰かに役立つことを願っています。ハッピーコーディング:)

于 2013-08-08T18:37:21.923 に答える