Cocos2d - CCNode userData的替代品

时间:2013-09-17 13:05:14

标签: cocos2d-iphone user-data

我正在使用CCNode userData属性来定义触摸的精灵是否已在其上构建了一个节点(使用Ray Wenderlich's - Tower Defence Tutorial)。

我遇到的问题是,对于我触摸和构建的每个新的精灵位置,以前的那些不会保留,因为我无法使用我的销售方法销售构建在它上面的建筑物。

将数据保存到通过触摸选择并由属性通过for循环定义的单个CCSprite的最佳方法是什么?

我已经读过,子类化CCSprite是一个选项,或者为userData等创建一个结构。我试图实现这些策略,但是没有成功让它们工作。

使用精灵属性的触摸方法:

-(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{
    }
}

感谢您的时间。

0 个答案:

没有答案