cocos2dx《单机斗地主》源码解剖之四 玩家类的解剖

前端之家收集整理的这篇文章主要介绍了cocos2dx《单机斗地主》源码解剖之四 玩家类的解剖前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

废话不说,直接上代码

文件

  1. class Player : public CCObject
  2. {
  3. public:
  4. Player();
  5. ~Player();
  6. void updatePkWeiZhi();//设置牌的位置
  7. private:
  8. CC_SYNTHESIZE(bool,m_isDiZhu,IsDiZhu);//是否为地主
  9. CC_SYNTHESIZE(bool,m_isCall,Call);//是否已叫地主
  10. CC_SYNTHESIZE(int,m_iCallNum,CallNum);//叫地主的分数
  11. CC_SYNTHESIZE(CCArray*,m_arrPk,ArrPk);//手里拥有的扑克牌
  12. CC_SYNTHESIZE(CCPoint,m_point,Point);//牌在桌面的初始位置
  13. CC_SYNTHESIZE(int,m_iPlayerClass,PlayerClass);//玩家种类:0为玩家,1为电脑,2为显示的三张牌,3为玩家要出的牌,4为电脑1要出的牌,5为电脑2要出的牌
  14. std::vector<PaiXing> m_vecPX;//保存牌型
  15. CC_SYNTHESIZE(bool,m_isOutPk,IsOutPk);//玩家是否出牌true:出 false:不出
  16. };

文件
  1. void Player::updatePkWeiZhi(){
  2. CCSize size = CCDirector::sharedDirector()->getVisibleSize();
  3. int x,y;
  1. <span style="white-space:pre"> </span>//计算玩家牌和出的牌的初始位置
  2. if(m_iPlayerClass == 0 || m_iPlayerClass == 3)
  3. {
  4. x = size.width/2-((m_arrPk->count()-1)*pkJianJu+pkWidth)/2;
  5. y = m_point.y;
  6. }
  7. else if(m_iPlayerClass == 1 || m_iPlayerClass == 4 || m_iPlayerClass == 5)
  8. {
  9. x = m_point.x;
  10. y = m_point.y;
  11. }
  12. else if(m_iPlayerClass == 2)
  13. {
  14. x = size.width/2-(m_arrPk->count()*pkWidth+(m_arrPk->count()-1)*pkJianJu)/2;
  15. y = m_point.y;
  16. }
  17. int num = 0;
  18. CCObject* object;
  19. //对牌进行排序
  20. if(m_iPlayerClass != 3 && m_iPlayerClass != 4 && m_iPlayerClass != 5)
  21. for(int i=0; m_arrPk->count()!=0 && i<m_arrPk->count()-1; ++i)
  22. {
  23. for(int j=0; j<m_arrPk->count()-1-i; ++j)
  24. {
  25. Poker* pk1 = (Poker*)m_arrPk->objectAtIndex(j);
  26. Poker* pk2 = (Poker*)m_arrPk->objectAtIndex(j+1);
  27. if(pk1->getNum() < pk2->getNum())
  28. m_arrPk->exchangeObject(pk1,pk2);
  29. }
  30. }
  31. //更新位置
  32. CCARRAY_FOREACH(m_arrPk,object){
  33. Poker* pk = (Poker*)object;
  34. if (m_iPlayerClass == 0 || m_iPlayerClass == 3)
  35. {
  36. pk->showFront();
  37. pk->setPosition(ccp(x+num*pkJianJu+pkWidth/2,y));
  38. }
  39. else if(m_iPlayerClass == 1 || m_iPlayerClass == 4 || m_iPlayerClass == 5)
  40. {
  41. pk->showFront();
  42. if(m_iPlayerClass == 1)
  43. pk->showLast();
  44. pk->setPosition(ccp(x,y-num*pkJianJu));
  45. }
  46. else if(m_iPlayerClass == 2)
  47. {
  48. pk->setPosition(ccp(x+num*pkJianJu+num*pkWidth+pkWidth/2,y));
  49. }
  50. ++num;
  51. }
  52. //改变牌的z值或牌的触摸优先
  53. int i=m_arrPk->count()-1;
  54. CCARRAY_FOREACH(m_arrPk,object){
  55. Poker* pk = (Poker*)object;
  56. //改变z值
  57. if (m_iPlayerClass == 1 || m_iPlayerClass == 4 || m_iPlayerClass == 5)
  58. pk->setZOrder(size.height - pk->getPositionY());
  59. if (m_iPlayerClass == 0 || m_iPlayerClass == 3)
  60. pk->setZOrder(pk->getPositionX());
  61. //改变优先级
  62. /* Poker* pk1 = (Poker *)m_arrPk->objectAtIndex(i--);
  63. pk->setTouchPriority(pk1->getPositionX());*/
  64. }
  65. }

这个类最主要的是 updatePkWeiZhi(),它是为了把玩家手中的牌从大到小排序并居中显示。请注意最后一块代码“改变牌的z值或牌的触摸优先级”,为什么要这么做呢?这是因为牌的顺序换了之后,底下的牌有的会覆盖到另一个牌之上,改变触摸优先级也是同理。

源码请前往前三章下载!

猜你在找的Cocos2d-x相关文章