Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理

前端之家收集整理的这篇文章主要介绍了Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

现在,对于游戏的基本准备都已经做好,之后需要考虑的,就是游戏逻辑的处理,主要考虑一下几个方面:

1判断方块是否已经落下停止,并下落新的方块;

2方块落下后,判断是否符合消行条件,进行消行;

3根据下落或者消行进行计分。

这些判断,需要定时处理,因此这里需要使用到默认更新的update

在初始化中,需要调用

  1. this->scheduleUpdate();

如果需要停止更新,可以调用

  1. this->unscheduleUpdate();

这样,就可以在voidupdate(floatdelaty)函数中进行默认更新的处理。另外,还可以使用:

  1. void schedule(cocos2d::SEL_SCHEDULE(my_update_func));
  2. void schedule(cocos2d::SEL_SCHEDULE(my_update_func),float interval);
  3. void schedule(cocos2d::SEL_SCHEDULE(my_update_func),float interval,unsigned int repeat,float delaty);

这三个重载函数可以调用自己定义的更新函数my_update_func,并且可以设置一些定时信息。

同样的,如果要取消可以使用:

  1. this->unschedule(cocos2d::SEL_SCHEDULE(my_update_func));

这里,还有仅在一定时间后调用一次的方法

  1. this->scheduleOnce(cocos2d::SEL_SCHEDULE(my_update_func),float delaty);



开启update后,我们就可以在函数中进行我们的逻辑处理。

首先,是关于如何判断方块已经落下,我这里是判断其在连续的几次update中,y轴变化很微小,即判断其已经落下:

  1. if(std::fabs(currentBlock->getPositionY() - lastPositionY) <= 0.5f && times >= 80)

同时,需要判断落下方块的位置,如果已经到达顶端,则gameover

  1. if(currentBlock->getPositionX() >= visibleSize.width/2 - 50 && currentBlock->getPositionX() <= visibleSize.width/2 + 50 && currentBlock->getPositionY() >=visibleSize.height/2 + 220)
  2. {
  3. auto newScene = GameOver::createScene(score);
  4. Director::getInstance()->replaceScene(CCTransitionFade::create(1.5,newScene));
  5. }

然后,是判断是否达到消行条件,如果达到消行条件,就应当进行消行处理:

  1. float yStart = visibleSize.height/2 - 250;
  2. for(int i=0; i<20; i++)
  3. {
  4. float area = 0;
  5. for(int j=0; j<blockSet->size(); j++)
  6. {
  7. BaseBlock * sprite = blockSet->at(j);
  8. area += sprite->calculaArea(yStart + 25*i,yStart + 25*(i+1));
  9. }
  10.  
  11. if(area >= 6000)
  12. {
  13. Vector<BaseBlock *> * tempBlock = new Vector<BaseBlock *>();
  14. for(int k=0; k<blockSet->size(); k++)
  15. {
  16. BaseBlock * sprite = blockSet->at(k);
  17. Vector<BaseBlock *> * vecShapes = sprite->doubleLineCutting(yStart + 25*i,yStart + 25*(i+1));
  18.  
  19. if(vecShapes != NULL)
  20. {
  21. if(vecShapes->size() == 1)
  22. {
  23. blockSet->erase(k);
  24. k--;
  25.  
  26. this->removeChild(sprite);
  27. }
  28. else
  29. {
  30. blockSet->erase(k);
  31. k--;
  32.  
  33. this->addChild(vecShapes->at(0),2);
  34. tempBlock->pushBack(vecShapes->at(0));
  35.  
  36. this->addChild(vecShapes->at(1),2);
  37. tempBlock->pushBack(vecShapes->at(1));
  38.  
  39. this->removeChild(sprite);
  40. }
  41. }
  42. }
  43.  
  44. for(int k=0; k<tempBlock->size(); k++)
  45. {
  46. blockSet->pushBack(tempBlock->at(k));
  47. }
  48.  
  49. if(scoreBase == 0) scoreBase = 1;
  50. else scoreBase *= 2;
  51. }
  52. }

最后,就是关于如何计分。我这里计分方式是,每次下落+10分,每次消行,根据一次性消除的多少,计100200400800...分。

因此,在判断方块落下时,添加代码

  1. score += 10;

在消行成功时:

  1. score = score + scoreBase * 100;

最终将更新的分数显示在得分栏:

  1. char * scoreStringTemp = new char[256];
  2. std::sprintf(&scoreStringTemp[0],"%d",score);
  3. std::string scoreString = scoreStringTemp;
  4. scoreLabel->setString(scoreString);

同时这里需要生成新的下落的方块:

  1. //产生下一个方块
  2. void GameView::buildNextBlock()
  3. {
  4. //TODO
  5. Size visibleSize = Director::getInstance()->getVisibleSize();
  6. Vec2 origin = Director::getInstance()->getVisibleOrigin();
  7.  
  8. if(nextBlock == NULL)
  9. {
  10. currentBlock = randomBuildBlock();
  11. }
  12. else
  13. {
  14. currentBlock = nextBlock;
  15. }
  16.  
  17. currentBlock->setPosition(origin.x + visibleSize.width/2,origin.y + visibleSize.height/2 + 220);
  18. currentBlock->getPhysicsBody()->setEnable(true);
  19. nextBlock = randomBuildBlock();
  20. nextBlock->setPosition(origin.x + 415,visibleSize.height/2 + 200);
  21. nextBlock->getPhysicsBody()->setEnable(false);
  22. }

关于制作游戏相关其他博客的目录,我放在 利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy Tetris)

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