0

CCNode userData プロパティを使用して、タッチされたスプライトにノードが構築されているかどうかを定義しています ( Ray Wenderlich の - Tower Defense Tutorialを使用)。

私が抱えている問題は、私が触れて構築する新しいスプライトの位置ごとに、以前の位置が保持されず、その上に構築された建物を販売方法を使用して販売できないことです。

タッチで選択され、for ループを介してプロパティによって定義された個々の CCSprite にデータを保存する最良の方法は何ですか?

CCSprite のサブクラス化がオプションである、または userData の構造体を作成するなどの方法があることを読みました。これらの戦略を実装しようとしましたが、機能させることができませんでした。

スプライト プロパティを使用した touch メソッド:

-(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 self.BuildPositions){
//BuildPositions contains CCSprites from a class defining build positions and contained in a mutable array.
        if(CGRectContainsPoint([tb textureRect],[tb convertToNodeSpace:location ])){

            _selectedBuildPosition = tb;
            [self buildMenuTapped];
      }
    }
  }
}

ビルド メニュー メソッド:

-(void)buildMenuTapped{

[self removeChild:_buildSelectMenu cleanup:YES];
[self removeChild:_sellBuildingMenu cleanup:YES];

if (_selectedBuildPosition.userData == nil) {

    CCMenuItem *buildOption = [CCMenuItemImage itemWithNormalImage:@"building.png" selectedImage:@"building.png" target:self selector:   @selector(buildOption)];
    buildOption.position = ccpAdd(_selectedBuildPosition.position,ccp(0,40));

    _buildSelectMenu = [CCMenu menuWithItems:BuildOption, nil];
    _buildSelectMenu.position = CGPointZero;
    [self addChild:_buildSelectMenu z:100];

}else{

    [self sellBuildingMenu];
}
}

メソッドに基づくビルド:

-(void)buildOption{

if([self canBuyBuilding] && !_selectedBuildPosition.userData){

    _playerEssence -= kBUILD_COST;

    _lvl1BuildNodeInstance = [lvl1BuildNode nodeWithTheGame:self location:_selectedBuildPosition.position];
//method as seen in RW tutorial. Generates a lvl1BuildNode class node within the HelloWorldLayer.

    _selectedBuildPosition.userData = (__bridge void*)(_lvl1BuildNodeInstance);

  }
}

販売メニュー方法:

-(void)sellBuildingMenu{
[self removeChild:_buildSelectMenu cleanup:YES];
[self removeChild:_sellBuildingMenu cleanup:YES];

CCMenuItem *buildingSell = [CCMenuItemImage itemWithNormalImage:@"sell.png" selectedImage:@"sell.png" target:self selector:@selector(sellBuilding)];
buildingSell.position =  ccpAdd(_selectedBuildPosition.position,ccp(40,0));

_sellBuildingMenu = [CCMenu menuWithItems:buildingSell, nil];
_sellBuildingMenu.position = CGPointZero;
[self addChild:_sellBuildingMenu z:100];
}

販売方法:

-(void)sellBuilding{
    if (_selectedBuildPosition.userData == (__bridge void*)(_lvl1BuildNodeInstance)){

        [self removeChild:_lvl1GemNodeInstance cleanup:YES];

        [_buildings removeObject:_lvl1BuildNodeInstance];

        _playerEssence += kBUILD_COST;

        _selectedBuildPosition.userData = nil;

    }else{
    }
}

お時間をいただきありがとうございます。

4

0 に答える 0