初学 cocos2dx,在写一个卡牌游戏的时候,遇到下面这个问题,
游戏有两个层,GameLayer 和 pokerLayer,其中 pokerLayer 作为成员变量,添加到 gameLayer 层里,pokerLayer里通过游戏逻辑,生成 poker 对象,然后通过 this->addChild(poker),添加到 pokerLayer 层上,poker 对象继承 CCNode,有点数,花色,名称,精灵图片等变量,
现在问题是,在 pokerLayer 里生成 poker 对象的时候,名称变量有值,但在 GameLayer 的触摸方法 CCTouchEnded 里,取到这个对象的时候,名称变量就没值了,对象不为空,而且通过控制台打印,其他变量,如点数有值,
GameLayer触摸代码如下:
void GameLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
//Poker* poker = (Poker*)this->pokerLayer->getChildByTag(100000);
CCLog("桌面牌数量: %d",this->pokerLayer->deskPokerPool->count());
CCObject* poker;
CCARRAY_FOREACH(this->pokerLayer->deskPokerPool, poker){
CCRect pokerRect = ((Poker*)poker)->boundingBox();
pokerRect.origin.x -= 15;
pokerRect.origin.y -= 15;
pokerRect.size.width += 30;
pokerRect.size.height += 30;
//=====================这个时候 poker 就没有值
CCLog("Game层触摸捕捉时扑克名称: %s",((Poker*)poker)->pokerName->getCString());
CCLog("Game层触摸捕捉时扑克点: %d",((Poker*)poker)->pokerPoint);
if (pokerRect.containsPoint(this->convertTouchToNodeSpace(pTouch))){
CCLog("点中扑克");
this->pokerLayer->pokerRotate(((Poker*)poker));
}else{
CCLog("没点中扑克");
}
}
}
```
pokerLayer 层的部分代码如下:
//游戏开始时,发牌初始化
void PokerLayer::dealStartPokers(int peopleQuantity){
//用于保存桌面最上层上的扑克牌
deskPokerPool = CCArray::createWithCapacity(peopleQuantity);
deskPokerPool->retain();
Poker* poker = this->dealPoker();
//CCSize winSize = CCDirector::sharedDirector()->getWinSize();
poker->setPosition(ccp(750,550));
poker->setScale(1.5); //缩放扑克精灵图片
this->addChild(poker,0,100000);
//====================这个时候poker 的名称属性有值
CCLog("发牌时扑克名称: %s",((Poker*)poker)->pokerName->getCString());
pokerPool->removeObject(poker); //每发一张牌,要从牌池中去掉
deskPokerPool->addObject(poker);//将发出的牌添加进桌面牌池
CCObject* pokeTemp;
CCARRAY_FOREACH(deskPokerPool, pokeTemp){
CCRect pokerRect = ((Poker*)pokeTemp)->boundingBox();
pokerRect.origin.x -= 15;
pokerRect.origin.y -= 15;
pokerRect.size.width += 30;
pokerRect.size.height += 30;
if(NULL != pokeTemp){
CCLog("发牌循环扑克不为空");
CCLog("发牌循环时扑克名称: %s",((Poker*)pokeTemp)->pokerName->getCString());
CCLog("发牌循环时扑克点: %d",((Poker*)pokeTemp)->pokerPoint);
}else{
CCLog("发牌循环扑克为空");
}
}
}
```