在第一讲里,我们创建了一副牌,最初它们是有顺序的,现在我们需要把它们打乱,游戏里俗称“洗牌”。
请看代码:
bool GameScene::xiPai(){
bool isRet = false;
do
{
for(int i=0; irandomObject();
Poker* pk2 = (Poker*)m_arrPokers->randomObject();
m_arrPokers->exchangeObject(pk1,pk2);
}
isRet = true;
} while (0);
return isRet;
}
是不是很简单呢,上面意思是随机取两张牌并使之交换,进行54次,这样就把原先顺序打乱了。 牌洗完之后,下面就该一个一个向玩家发牌了,请看下面代码:
void GameScene::SendPk(){
Poker* pk;
if(m_iSendPkobjectAtIndex(m_iSendPk);
if(m_iSendPk%3 == 0)//给玩家发牌
MovePk(m_player,pk);
else if(m_iSendPk%3 == 1)//给电脑1发牌
MovePk(m_npcOne,pk);
else if(m_iSendPk%3 == 2)//给电脑2发牌
MovePk(m_npcTwo,pk);
++m_iSendPk;
m_isSend = false;
}else if (m_iSendPk>50 && m_iSendPkobjectAtIndex(m_iSendPk);
pk->showFront();
MovePk(m_Three,pk);
++m_iSendPk;
m_isSend = false;
}
else if(m_iSendPk>53)//牌发完分析电脑玩家的牌型
{
FenChaiNpcPai(m_npcOne);
FenChaiNpcPai(m_npcTwo);
m_iSendPk = 0;
m_iState = 1;
}
}
大家一定注意到上面的m_isSend的变量了,这个变量就是指发给某一个玩家的牌动画是否完成。我们再来看一下MovePk()的代码就有些明白了:
void GameScene::MovePk(Player* play,Poker* pk)
{
CCMoveTo* move;
CCCallFuncND* func;
float time = 0.05;
play->getArrPk()->addObject(pk);//从一副牌中选择pk这张牌
move = CCMoveTo::create(time,play->getPoint());
func = CCCallFuncND::create(this,callfuncND_selector(GameScene::func),play);
CCSequence* sequence = CCSequence::create(move,func,NULL);
pk->runAction(sequence);
}
void GameScene::func(CCNode* pSender, void* pData){
Player* play = (Player*)pData;
play->updatePkWeiZhi();//整理一个玩家手中的牌
m_isSend = true;
}
大家一定也注意到了play->updatePkWeiZhi()这个函数了,它的意义正如注释据所说的。这个我们在下一篇文章来解释。
