Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建

Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建,第1张

概述一、背景与我机的创建 现在我们要创建新的一个场景了。选择开始游戏即从菜单场景跳到游戏场景。现在先完善HelloWorldScene的代码 找到我们开始游戏的回调方法,添加代码: //开始游戏void HelloWorld::menuStartCallback(Ref* pSender){ auto scene = GameScene::createScene();

一、背景与我机的创建
现在我们要创建新的一个场景了。选择开始游戏即从菜单场景跳到游戏场景。现在先完善HelloWorldScene的代码
找到我们开始游戏的回调方法,添加代码:

//开始游戏voID HelloWorld::menuStartCallback(Ref* pSender){     auto scene = GameScene::createScene();                //这个场景类理应先创建好的。为了线性介绍只能这样了。     auto gameScene = TransitionSlIDeInR::create(1.0f,scene);     Director::getInstance()->replaceScene(gameScene);}

然后创建新的一个场景GameScene相关的GameScene.h和GameScene.cpp,里面的代码参照HelloWorldScene的格式。注意:创建的代码文件一定要放到classes下面,否则会出错。
然后在GameScene的创建场景的方法中,添加如下代码

Scene* GameScene::createScene(){ auto scene = Scene::createWithPhysics();         //创建物理世界的场景 //PhysicsWorld* phyWorld = scene->getPhysicsWorld(); //测试专用,如果发布就注释掉就好了。 //phyWorld->setDeBUGDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = GameScene::create(); scene->addChild(layer); return scene;}

这样我们的物理世界场景就创建好了。下面就添加各种精灵。
上一节也讲过怎么设置滚动背景和飞机的创建了就不多说,只是这次添加的飞机的物理世界的实体。
在GameScene的Init方法中添加如下代码。

auto plane = Sprite::create("hero1.png"); plane->setposition(visibleSize.wIDth/2+origin.x,200); plane->setTag(103); //设置物理世界实体 //这里只有我机、敌机、子d,子d和敌机可以碰撞,敌机和我机可以碰撞,我机和子d不可以碰撞 auto planeBody = PhysicsBody::createBox(plane->getContentSize()); planeBody->setContactTestBitmask(0x0003);            //碰撞测试掩码 planeBody->setcategoryBitmask(0x0001);                //类别掩码 planeBody->setCollisionBitmask(0x0007);                 //碰撞掩码 planeBody->setGravityEnable(false);                          //设置重力无效,飞机是在天空中的,别让他掉下来。 plane->setPhysicsBody(planeBody); this->addChild(plane);//启动飞机动画 Animation * animation = Animation::create(); SpriteFrame * spriteFrame1 = SpriteFrame::create("hero1.png",Rect(0,0,102,126));                    //优化可以用 SpriteFrameCache用法查API SpriteFrame * spriteFrame2 = SpriteFrame::create("hero2.png",126)); animation->addSpriteFrame(spriteFrame1); animation->addSpriteFrame(spriteFrame2); animation->setDelayPerUnit(0.15f);                                        Animate * animate = Animate::create(animation); plane->runAction(RepeatForever::create(animate));        //执行动画

现在飞机还是静止的,那么根据我们的游戏逻辑,飞机应该是随着我们的手上下动而动(我听起来怎么这么黄这么暴力呢)。
那么我们给他添加一个触屏监听事件来控制飞机的移动。
首先在GameScene.h文件中的public下添加如下代码:

int status;         //游戏状态 1为正常、2为暂停、3为结束float fx,fy;        //用来记录手指点击的开始位置//触屏事件 ,由系统监听 virtual bool ontouchBegan(cocos2d::touch * touch,cocos2d::Event * event);             //手指首次点击 virtual voID ontouchmoved(cocos2d::touch * touch,cocos2d::Event * event);             //手指移动然后注册监听器,在GameScene的init方法中添加//触摸事件注册,要通过回调函数来控制飞机的坐标 settouchEnabled(true); //设置为单点触碰 settouchMode(touch::dispatchMode::ONE_BY_ONE);然后实现触屏反应函数//手指点击下时,记录该点的位置,该点为起点bool GameScene::ontouchBegan(touch * touch,Event * event){ if(status == 1) {  fx=touch->getLocation().x;  fy=touch->getLocation().y; } return true;}

//每次移动把移动的位置(终点)记录下来,并与之前记录下的位置相减,得到飞机该位移的相对量(x、y轴移动多少),并刷新起点位置

voID GameScene::ontouchmoved(touch * touch,Event * event){ if(status == 1) {  int mx=(touch->getLocation().x-fx);  int my=(touch->getLocation().y-fy);  auto spPlane=this->getChildByTag(103);  spPlane->runAction(MoveBy::create(0,Point(mx,my)));  fx=touch->getLocation().x;  fy=touch->getLocation().y; }}

现在你可以编译运行下,看看效果了。

看到飞机飞来飞去,好想射点什么。好,下面添加飞机发射子d的相关代码,激动的地方。
实现发射子d,只需要使用一个定时器,让他每隔一段时间,就调用一个函数,在飞机的位置创建一个子d精灵,并且声明个Vector存储所有的子d,然后再创建一个定时器让所有的子d每隔一段时间向上移动,所有的子d都存储在Vector中,形成飞机发射子d的现象。怎么做的,看代码。
先在GameScene.h中声明
//存储所有的子d

cocos2d::Vector<cocos2d::Sprite *> bulletList;//子d创建的定时器回调函数 voID bulletCreate(float f); //让子d飞和让敌机飞 因为敌机和子d移动的速度一样,不用创建多个定时器 voID objectMove(float f); 然后在GameScene的init方法中设置两个定时器。//我机发射子d this->schedule(schedule_selector(GameScene::bulletCreate),0.3);            //里面的参数就是为什么要创建多个定时器的原因。 //让子d飞 this->schedule(schedule_selector(GameScene::objectMove),0.01);            最后实现定时器的回调方法,看代码//创建子dvoID GameScene::bulletCreate(float f){ SimpleAudioEngine::getInstance()->playEffect("sounds/bullet.wav"); auto plane=this->getChildByTag(103); Sprite * bullet=Sprite::create("bullet.png"); bullet->setposition(plane->getposition().x,plane->getposition().y+60); bullet->setTag(106); auto bulletbody = PhysicsBody::createBox(bullet->getContentSize()); bulletbody->setContactTestBitmask(0x0002); bulletbody->setcategoryBitmask(0x0005); bulletbody->setCollisionBitmask(0x0002); bulletbody->setGravityEnable(false); bullet->setPhysicsBody(bulletbody); this->addChild(bullet); this->bulletList.pushBack(bullet);}//让子d飞voID GameScene::objectMove(float f){ //遍历vector取出所有的子d,让子d的位置往上移,水往低处流,子d向上飞嘛 for(int i = 0; i < bulletList.size() ; i++) {  auto bullet = bulletList.at(i);  bullet->setpositionY(bullet->getpositionY()+3);  //如果该子d已经超出屏幕范围,则移除它  if(bullet->getpositionY()>Director::getInstance()->getWinSize().height)  {   bullet->removeFromParent(); //从层中移除   bulletList.eraSEObject(bullet);//从记录所有子d的vector中移除   //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象   i--;  } } //取出所有的敌机,让敌机往下移动 for(int i = 0; i < enemyList.size() ; i++) {  auto enemy = enemyList.at(i);  enemy->setpositionY(enemy->getpositionY()-5);  //如果该子d已经超出屏幕范围,则移除它  if(enemy->getpositionY() < -enemy->getContentSize().height)  {   enemy->removeFromParent(); //从层中移除   enemyList.eraSEObject(enemy);//从记录所有子d的vector中移除   //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象   i--;  } }}

我们的飞机就可以可以发射子d了。

二、敌机的创建
敌机的创建也很简单,类似子d的做法,但是区别就在于敌机的位置是随机在屏幕最上方随机生成。看代码。
先在GameScene.h声明。函数和变量的声明都在头文件中,后面就不讲那么具体。

//用来存储所有的敌机cocos2d::Vector<cocos2d::Sprite *> enemyList;
//创建敌机 voID enemyCreate(float f);  在创建一个定时器//敌机创建 this->schedule(schedule_selector(GameScene::enemyCreate),0.5);实现我们的创建函数//敌机创建voID GameScene::enemyCreate(float f){ //随机出现敌机1或敌机2 int ranDom = rand()%2+1; auto string = cocos2d::__String::createWithFormat("enemy%d.png",ranDom); auto enemy = Sprite::create(string->getCString()); if(ranDom == 1) {  enemy->setTag(104);    //敌机的类型,由这个来判断,用于分数计算 } else {  enemy->setTag(105); } enemy->setposition(Vec2(rand()%(int)(Director::getInstance()->getVisibleSize().wIDth),Director::getInstance()->getVisibleSize().height+enemy->getContentSize().height));    //随机在屏幕最上方的出现敌机 auto enemyBody = PhysicsBody::createBox(enemy->getContentSize());        //创建物理实体 enemyBody->setContactTestBitmask(0x0003); enemyBody->setcategoryBitmask(0x0002); enemyBody->setCollisionBitmask(0x0001); enemyBody->setGravityEnable(false); enemy->setPhysicsBody(enemyBody); this->addChild(enemy); this->enemyList.pushBack(enemy);}创建好敌机后就是,嗨,敌机,走你。因为敌机的飞行速度跟子d的飞行速度是一样的,所以只要在voID GameScene::objectMove(float f)方法中添加以下代码就行了。 //取出所有的敌机,让敌机往下移动 for(int i = 0; i < enemyList.size() ; i++) {  auto enemy = enemyList.at(i);  enemy->setpositionY(enemy->getpositionY()-5);  //如果该子d已经超出屏幕范围,则移除它  if(enemy->getpositionY() < -enemy->getContentSize().height)  {   enemy->removeFromParent();    //从层中移除   enemyList.eraSEObject(enemy);    //从记录所有子d的vector中移除   //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象   i--;  } }

然后,然后就没然后了,这一节已经大功告成了。
看看运行效果,因为敌机我机是可以碰撞的,子d和敌机是可以碰撞的,所以~~~所以就是你看的效果了。

下一节我们将来充当爆破人员,爆爆爆,引爆一切碰撞。
源码下载:源码2

总结

以上是内存溢出为你收集整理的Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建全部内容,希望文章能够帮你解决Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存