0

スプライト タッチ メソッドを制御下に置こうとして、何日も困惑していました。私の目的は、タッチされたスプライトにオフセットされた別のスプライトをポップアップさせることです。

私は現在、このプロセスのための不完全なコードを持っています。そこでは、さまざまな種類のコードを試しました。以下のリンクを参照してください。どれも機能していません。私の質問:

  1. タッチが画面上のスプライトにヒットしたら、CCTouchBegan にメソッド towerPositionTapped を実行させます (CCTouchBegan の NSLog も機能していません)。
  2. タッチされたスプライトの位置を取得して、towerPositionTapped メソッドで使用できるようにする方法を確認してください。

これまでのメインレイヤーでの私のタッチ固有のコード:

-(void) registerWithTouchDispatcher{
[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 
    swallowsTouches:YES];
}


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

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


//_towersFromClass is an NSMutableArray with CCSprite objects
for(CCSprite *tb in _towersFromClass){
    if(CGRectContainsPoint(tb.boundingBox,location)){

        NSLog(@"sprite touched at %@", NSStringFromCGPoint(location));

        [self towerPositionTapped]

        return YES;
    }
}
return NO;
}

いずれかのスプライトをクリックしても、NSLog チェックが表示されません。

towerPositionTapped メソッドの場合、新しいスプライトを配置するためにタッチされた位置をキャプチャする (またはタッチされたスプライトを記録する) 方法がわかりません。

towerPositionTapped.m

-(void)towerPositionTapped{

CCMenuItem *towerOption1 = [CCMenuItemImage itemWithNormalImage:@"tower.png" selectedImage:@"tower.png"];
towerOption1.position = /* place touched sprite location here, with an offset*/;

CCMenu *_towerOptionsMenu = [CCMenu menuWithItems: nil];
_towerOptionsMenu.position = CGPointZero;
[self addChild:_towerOptionsMenu z:5];

}

建設的な批判は大歓迎です。お時間をいただきありがとうございます。

私がテストしているいくつかのサイト:

スプライト オフセット

タッチ1

タッチ 2

4

2 に答える 2

0

CCTouchBegin が機能しない場合 (for ループ内ではなく全体的に)、EnableTouch がない場合は、この行を試す必要があるかもしれません。

self.isTouchEnabled = YES;

registerWithTouchDispatcher ではなく、この行を使用しています。

于 2013-08-29T09:52:29.683 に答える
0

これを解決するのに数日かかりましたが、解決策を思いつくことができました.

基本的に、Ray Wenderlich の Tower Defense チュートリアル ( RWTDTutorial ) と同じコードを使用しました。CCTouchesBegan メソッドを使用します。

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

for(UITouch *touch in touches){
    CGPoint location = [touch locationInView:[touch view]];

    location = [[CCDirector sharedDirector] convertToGL:location];

    for(CCSprite *tb in _towersFromClass){

        if(CGRectContainsPoint([tb boundingBox],location)){

            selectedTowerPosition = tb;
            [self towerPositionTapped];

        }
    }
}
}

_towersFromClass 配列で CCSprites の 1 つを選択した後にポップアップしたい CCMenu アイテムを含む別のメソッドを作成し、それを CCTouchesBegan メソッドの「if」ステートメントの下に追加しました。

メニューの正しい位置を取得するために、CCSprite プロパティ '_selectedTowerPosition' を作成し、それを 'tb' CCSprite に設定しました。

CCMenu メソッドに戻り、次に示すように ccpAdd コードを使用してメニューを配置しました。

CCMenuItem *towerOption1 = [CCMenuItemImage itemWithNormalImage:@"tower.png" selectedImage:@"tower.png" target:self selector:@selector( towerSelectOption)];
towerOption1.position = ccpAdd(_selectedTowerPosition.position,ccp(40,0));

また、メニュー項目をわずかにオフセットしました。

少し時間がかかりましたが、この経験から多くのことを学びました。

于 2013-08-31T08:18:46.263 に答える