cocos2dx3.X项目重写(四)添加地板,障碍物和碰撞检测

前端之家收集整理的这篇文章主要介绍了cocos2dx3.X项目重写(四)添加地板,障碍物和碰撞检测前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我暂时不想使用地图,我想如果用精灵直接制造成方块也是可以的。代码如下,这个是添加地板

  1. void Stage::addGround()
  2. {
  3. auto g=Sprite::create();
  4. g->setTextureRect(Rect(0,visible.width,15));
  5. g->setColor(Color3B(100,100,100));
  6. g->setPosition(visible.width/2,world_y-8.5);
  7. this->addChild(g);
  8. }
我并不知道Rect的前两个参数是干什么的,源代码写的是x和y,好像是坐标的意思,但是我设置了不同的值效果是一样的..

顺便提一句,血的教训,在继承自父类之后,在init()里要先执行一下父类的init。
写一个block类

  1. bool myblock::init()
  2. {
  3. Sprite::init();
  4. speed = 5;
  5. auto visible = Director::getInstance()->getVisibleSize();
  6. /*Size s =(Size(rand()%20+5,rand()%20+5));*/
  7. s =Size(rand()%25+10,rand()%35+5);
  8. this->setPhysicsBody(PhysicsBody::createBox(s));
  9. this->setTextureRect(Rect(0,s.width,s.height));
  10. this->setColor(Color3B(100,100));
  11. this->setPositionX(visible.width-s.width/2);
  12. this->schedule(schedule_selector(myblock::block_run));
  13. return true;
  14. }
  15.  
  16.  
  17. void myblock::block_run(float f)
  18. {
  19. this->setPositionX(this->getPosition().x-speed);
  20. if (this->getPositionX()<0)
  21. <span style="white-space:pre"> </span>{
  22. <span style="white-space:pre"> </span> removeFromParent();
  23. <span style="white-space:pre"> </span>}
  24. }
加了定时器,让方块一直往左走,当block离开屏幕就移除。

然后在Stage中加定时器,隔一段时间出现一个方块,但是又不能在计时器函数参数后面加一个rand()做时间,因为这是个伪随机数,后来在网上找到了一个很聪明的办法。

让数a=0,让b取一个制定范围的随机数,在updat里让a++,当a>b就生成一个障碍,并且让a=0,b再取一个随机数。如此循环。

  1. void Stage::restar()
  2. {
  3. a=0;
  4. b=rand()%120+60;
  5. }
  6. void Stage::addblock(float f)
  7. {
  8. a++;
  9. if(a>=b)
  10. {
  11. auto b=myblock::create();
  12. this->addChild(b);
  13. b->setPositionY(world_y+b->s.height/2);
  14. b->getPhysicsBody()->setDynamic(false);
  15. restar();
  16. }
  17. }
  1. </pre><pre name="code" class="cpp" style="Box-sizing: border-Box; font-family: Arial,245);">

由于block得添加两种,一种地上的,一种浮空的,只能趴着过的。两者必须随机添加。我的方法如下。

myblock.h

  1. static myblock* create(Size s);

myblock.cpp

  1. myblock* myblock::create(Size s)
  2. {
  3. myblock* bl = new myblock();
  4. //Sprite::init();
  5. bl->init();
  6. bl->speed = 10;
  7. auto visible = Director::getInstance()->getVisibleSize();
  8. /*Size s =(Size(rand()%20+5,rand()%20+5));*/
  9. /*i =Size(rand()%35+20,rand()%45+15);*/
  10. bl->setPhysicsBody(PhysicsBody::createBox(s));
  11. bl->setTextureRect(Rect(0,s.height));
  12. bl->setColor(Color3B(100,100));
  13. bl->setPositionX(visible.width-s.width/2+300);
  14. bl->schedule(schedule_selector(myblock::block_run));
  15. bl->getPhysicsBody()->setContactTestBitmask(1);
  16.  
  17.  
  18. return bl;
  19. }

Stage.cpp

  1. void Stage::addblock(float f)
  2. {
  3. a++;
  4. if(a>=b)
  5. {
  6. if (b>90)
  7. {
  8. Size s =Size(rand()%35+20,rand()%45+15);
  9. auto bl=myblock::create(s);
  10. this->addChild(bl);
  11. bl->setPositionY(world_y+s.height/2);
  12. bl->getPhysicsBody()->setDynamic(false);
  13. restar();
  14. }
  15. else
  16. {
  17. Size s =Size(rand()%75+35,rand()%25+10);
  18. auto bl=myblock::create(s);
  19. this->addChild(bl);
  20. bl->setPositionY(world_y+s.height/2+100);
  21. bl->getPhysicsBody()->setDynamic(false);
  22. restar();
  23. }
  24. }
  25. }

测试碰撞,先添加Listener,这个物理引擎有自己的碰撞监听。

  1. auto listen = EventListenerPhysicsContact::create();
  2. listen->onContactBegin=[&](PhysicsContact& contact)
  3. {
  4. log("<<<<<<<<<<<<<<");
  5. return true;
  6. };
  7. Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraPHPriority(listen,this);
然后给主角和block类各填一句话,打开碰撞检测开关,都设置成相同的数,两者就可以碰撞检测

  1. ->getPhysicsBody()->setContactTestBitmask(1);
然后就可以添加死掉的动作在拉姆达表达式中。

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