0

それぞれが画像にリンクされた 2 つの ccMenuItems を持つ cocos2d を使用してプログラムを作成しています。この場合、1 つは左矢印、もう 1 つは右矢印です。ビューの中央には、押された矢印に応じて回転する画像もあります。

左または右の 2 つのメニュー項目のいずれかに指を置くと、指がボタン上にある限り、中央の画像が回転します。それが私が迷子になったところです。次のコードを使用してみました:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint p = [touch locationInView:[touch view]];

    if (CGRectContainsPoint(leftArrow, p) || CGRectContainsPoint(rightArrow, p)) {
        return YES;
    }
    return NO;
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint p = [touch locationInView:[touch view]];

    if (CGRectContainsPoint(leftArrow, p)) {
        [gun runAction:[CCRepeatForever actionWithAction:[CCRotateTo actionWithDuration:0.2 angle:180]]];
    }
    if (CGRectContainsPoint(rightArrow, p)) {
        [gun runAction:[CCRepeatForever actionWithAction:[CCRotateTo actionWithDuration:0.2 angle:0]]];

    }

}

このコードを使用すると、2 つのメニュー項目のいずれかを押しても、ccTouchBegan メソッドは呼び出されません。このメソッドは、他の場所に触れたときにのみ呼び出されます。

ccMenuItem を押したままにすると、連続したアクションをどのように処理するのですか?

ご協力ありがとうございました!

4

3 に答える 3

2

このような動作を得るには、CCMenuItem をサブクラス化する必要があります。

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

@interface RepeatMenuItem : CCMenuItemSprite 
{
    CGFloat speed;
}

@end

そして実装:

////////////////////////////////////////////////////////////////////
// RepeatMenuItem
////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark RepeatMenuItem

@implementation RepeatMenuItem


-(void) selected
{
    [super selected];
    block_(self);
    speed = 0.8;
    [self schedule:@selector(repeatEvent:) interval:speed];
}


-(void) unselected
{
    [self unschedule:@selector(repeatEvent:)];
    [super unselected];
}


-(void) activate
{
}


-(void) repeatEvent:(id)sender
{
    CGFloat minSpeed = 0.05;

    if (speed > minSpeed)
        speed = speed/3;
    if (speed < minSpeed)
        speed = minSpeed;

    [self unschedule:@selector(repeatEvent:)];
    block_(self);
    [self schedule:@selector(repeatEvent:) interval:speed];
}

@end
于 2012-10-27T20:36:06.153 に答える
1

私が理解しているように、投稿した 2 つのメソッドは CCLayer のサブクラスにあります。

まず、タッチを自分で処理したい場合は、メニュー項目を削除する必要があります。CCMenu はより多くのタッチ優先度を持ち、タッチがメニュー項目にヒットしたことを処理する場合、それを飲み込みます。そのため、タッチがメニュー項目の外にある場合にのみタッチを受け取ります。

二つ目、 と は何leftArrowですかrightArrow?あなたの矢の四角形?

そして、私に関しては、そのような場合、更新メソッドを実行し、rotationその中の中心の画像のプロパティをすべてのティックで変更することを提案できます。つまり、矢印が1つも触れられていない場合、その回転値は0になり、触れた矢印のために正または負の値になります。

于 2012-10-27T20:34:14.407 に答える
0

これらのメニュー項目に使用している CCMenuItemWhatever クラスを拡張し、'selected' および 'unselected' メソッドをオーバーライドできます。メニューがタッチを取得します (つまり、IT はそれ自体の ccTouchBegan 関数で YES と応答するため、タッチ ディスパッチャーはそれをユーザーに伝達しません)。

-(void) selected{
    [super selected];
    // start your animation here
}

-(void) unselected {
    [super unselected];
    // stop your animation here.
}
于 2012-10-27T20:34:48.993 に答える