0

誰かが私を助けてくれませんか。CCSprite をドラッグ (左/右) してプレイヤー キャラクターを移動できる移動コントローラーとして使用しようとしています。問題は、CCSprite の外側に触れると、まだ Active として検出されることです。これは、ccTouchBegan で ACTIVE を設定し、ccTouchEnded メソッドで IDLE を設定した列挙型です。デフォルトでは IDLE 状態です。CCSprite の外でタッチを開始したときにアクティブになる理由がわかりません。

お知らせ下さい。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL touched = NO;

    CGPoint loc = [touch locationInView: touch.view];
    loc = [[CCDirector sharedDirector] convertToGL: loc];

    //avatar is a CCSprite...
    //inside of IF statement should not execute if I touch anywhere on screen 
    //outside of self.avatar sprite, but it still executes....
    if ( CGRectContainsPoint( [self.avatar boundingBox], loc) );
    {
        self.state = ACTIVE;
        self.action = MOVE_STOPPED; //player decides which direction to move, based on action state
        self.currPoint = self.prevPoint = self.avatar.position;
        touched = YES;
    }
    return touched;
}
4

2 に答える 2

0

それが誰かを助けるなら、私は問題を解決することができました. CCLayer をサブクラス化する代わりに、CCNode をサブクラス化しました。私の ccTouchBegan メソッドでは、convertToNodeSpace 内のタッチの位置がスプライトの boundingBox 内にあるかどうかを確認するために、明示的な境界チェックを行いました。SneakyInput ボタン クラスから明示的な境界チェックを借用しました。

これが ccTouchBegan メソッドです。CCLayer のサブクラスでこれを行う方法について何か考えがある場合は、私に知らせてください。自分自身の CCTouchOneByOneDelegate を実装する必要はありません。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL touched = NO;

    CGPoint loc = [touch locationInView: touch.view];
    loc = [[CCDirector sharedDirector] convertToGL: loc];
    loc = [self.avatar convertToNodeSpace: loc]; //YvesLeBorg's feedback

    float width = [self.avatar boundingBox].size.width;
    float height = [self.avatar boundingBox].size.height;
    //if ( CGRectContainsPoint( [self.avatar boundingBox], loc) );
    if ( loc.x < -width || loc.x > width || loc.y < -height || loc.y > height ) return touched;
    else
    {
        self.state = ACTIVE;
        self.action = MOVE_STOPPED;
        self.currPoint = self.prevPoint = self.avatar.position;
        touched = YES;
    }

//    CCLabelTTF *lbl = (CCLabelTTF *)[[[[CCDirector sharedDirector] runningScene] getChildByTag: -10] getChildByTag: 100];
//    NSString *str = [NSString stringWithFormat: @"Touch Pos: (%.2f, %.2f)", [self.avatar boundingBox].size.width, [self.avatar boundingBox].size.height ];
//    [lbl setString: str];

    return touched;
}
于 2013-05-13T02:46:23.467 に答える
0

これで100%ではありませんが、GLに変換した後にこれを追加してみてください:

loc = [self.avatar convertToNodeSpace:loc];
于 2013-05-12T11:35:06.960 に答える