0

すべての夕方、私は古き良きSOとより広い世界での検索を行ったと言って、昔ながらの伝統でこの質問を始めますが、私はこれについて頭を悩ませていません...私は見事に機能する卑劣なジョイスティックを実装しました(それは私のスプライトを非常にうまく動かします)が、私は今、その配置について考えていたずらをしました。私がやりたいことは、その位置をタッチ位置に変更してスプライトを移動させることですが、これは私の知識プールから外れているようです。私はばかかもしれませんが、それを解決することはできません。

タッチ イベントは、sneakyjoystick クラス (github https://github.com/0xPr0xy/sneaky-joystick-cocos2dで入手可能) で既にソートされています。現時点では、controlsLayer というクラスの init メソッドでジョイスティックを作成すると、すべて正常に動作します。ジョイスティックが表示され、スプライトに移動できます

-(id) init
{

if( (self=[super init]) ) {

    myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
    myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
    myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
    myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
    myJoystickBase.position = ccp(64, 64);
    myJoystickBase.backgroundSprite.opacity = 100;
    myJoystickBase.thumbSprite.opacity = 100;
    [self addChild:myJoystickBase];
    myJoystick = [myJoystickBase.joystick retain];


    [self scheduleUpdate];


    }
return self;
}

それで、まず、それ自体を表示および非表示にし、その場所を設定する方法を検討することを考えました. これを行うために、以前の init メソッドとほぼ同じコードを含む ccTouchesbegan メソッドを作成しました。これはある程度までは正常に機能します (ジョイスティックはどこに触れても中央に表示されます) が、現在の問題は、それを操作できないことです。ジョイスティックは必要な場所に表示されますが、私の動きを認識しません (ジョイスティックのスティックが動かないということは、スプライトにも移動するように指示されていないことを意味します)

if( (self=[super init]) ) {

    self.isTouchEnabled = YES;
    [self scheduleUpdate];

}
return self;
}

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    location = [self convertToNodeSpace:location];
    myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
    myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
    myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
    myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
    myJoystickBase.position = location;
    myJoystickBase.backgroundSprite.opacity = 100;
    myJoystickBase.thumbSprite.opacity = 100;
    [self addChild:myJoystickBase];
    myJoystick = [myJoystickBase.joystick retain];
}

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [self removeChild:myJoystickBase cleanup:YES];
}

したがって、私の初心者の脳にとって、これは、controlsLayer クラスに触れると、私が要求したことを喜んで実行しますが、このタッチを他のクラスに渡さないと言っています。

一言で言えば、タッチ イベントを同時に複数のクラスに渡すことはできますか? こっそりジョイスティック クラスは CCTargetedTouchDelegate を使用します。これは、タッチを探す唯一のものであったときに問題なく動作しました。ただし、 -(void)ccTouchesBegan: を別のクラスに追加したので、満足できません。

問題がタッチの処理方法にあるのか、それともタッチメソッドでジョイスティックを割り当てる方法に問題があるのか​​ 誰か教えてもらえますか? init メソッドでジョイスティックを割り当て、touchesBegan メソッドで何か他のことを行う必要がありますか? 試行錯誤の結果、今のところ役に立ちません。レンガの壁に頭をぶつけているような気がします。必要に応じて、完全なクラス ファイルを投稿します。これは理にかなっていますか?

4

1 に答える 1

0

問題は、タッチの開始時にジョイスティックを作成し、タッチの終了時にジョイスティックを削除することです。これは、ジョイスティックが作成された時点でイベントがすでに処理されているため、ジョイスティックがタッチ開始イベントを受け取ることを許可しません。

不必要な保持のためにジョイスティックもリークしています(ARCを使用してください!)。

初期化でジョイスティックを作成し、タッチ開始イベントが受信されるまで無効にして非表示にします。これは、タッチするたびにジョイスティックを再作成するよりも高速です。

また、複数のタッチを有効にしている場合は、間にタッチが終了することなく、最大 5 つのタッチ開始イベント (5 本の指) を受け取ることができることに注意してください。これによりジョイスティックが 5 つ作成されますが、削除されるのは 1 つだけです。毎回!

于 2013-03-19T01:09:31.640 に答える