Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建
来源:互联网 发布:为知笔记 手写 编辑:程序博客网 时间:2024/04/29 10:25
一、背景与我机的创建
现在我们要创建新的一个场景了。选择开始游戏即从菜单场景跳到游戏场景。现在先完善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); //设置物理世界实体 //这里只有我机、敌机、子弹,子弹和敌机可以碰撞,敌机和我机可以碰撞,我机和子弹不可以碰撞 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",Rect(0,0,102,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; }}
现在你可以编译运行下,看看效果了。
看到飞机飞来飞去,好想射点什么。好,下面添加飞机发射子弹的相关代码,激动的地方。
实现发射子弹,只需要使用一个定时器,让他每隔一段时间,就调用一个函数,在飞机的位置创建一个子弹精灵,并且声明个Vector存储所有的子弹,然后再创建一个定时器让所有的子弹每隔一段时间向上移动,所有的子弹都存储在Vector中,形成飞机发射子弹的现象。怎么做的,看代码。
先在GameScene.h中声明
//存储所有的子弹
cocos2d::Vector<cocos2d::Sprite *> bulletList;//子弹创建的定时器回调函数 void bulletCreate(float f); //让子弹飞和让敌机飞 因为敌机和子弹移动的速度一样,不用创建多个定时器 void objectMove(float f); 然后在GameScene的init方法中设置两个定时器。//我机发射子弹 this->schedule(schedule_selector(GameScene::bulletCreate),0.3); //里面的参数就是为什么要创建多个定时器的原因。 //让子弹飞 this->schedule(schedule_selector(GameScene::objectMove),0.01); 最后实现定时器的回调方法,看代码//创建子弹void 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);}//让子弹飞void GameScene::objectMove(float f){ //遍历vector取出所有的子弹,让子弹的位置往上移,水往低处流,子弹向上飞嘛 for(int i = 0; i < bulletList.size() ; i++) { auto bullet = bulletList.at(i); bullet->setPositionY(bullet->getPositionY()+3); //如果该子弹已经超出屏幕范围,则移除它 if(bullet->getPositionY()>Director::getInstance()->getWinSize().height) { bullet->removeFromParent(); //从层中移除 bulletList.eraseObject(bullet);//从记录所有子弹的vector中移除 //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象 i--; } } //取出所有的敌机,让敌机往下移动 for(int i = 0; i < enemyList.size() ; i++) { auto enemy = enemyList.at(i); enemy->setPositionY(enemy->getPositionY()-5); //如果该子弹已经超出屏幕范围,则移除它 if(enemy->getPositionY() < -enemy->getContentSize().height) { enemy->removeFromParent(); //从层中移除 enemyList.eraseObject(enemy);//从记录所有子弹的vector中移除 //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象 i--; } }}
我们的飞机就可以可以发射子弹了。
二、敌机的创建
敌机的创建也很简单,类似子弹的做法,但是区别就在于敌机的位置是随机在屏幕最上方随机生成。看代码。
先在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);}创建好敌机后就是,嗨,敌机,走你。因为敌机的飞行速度跟子弹的飞行速度是一样的,所以只要在void GameScene::objectMove(float f)方法中添加以下代码就行了。 //取出所有的敌机,让敌机往下移动 for(int i = 0; i < enemyList.size() ; i++) { auto enemy = enemyList.at(i); enemy->setPositionY(enemy->getPositionY()-5); //如果该子弹已经超出屏幕范围,则移除它 if(enemy->getPositionY() < -enemy->getContentSize().height) { enemy->removeFromParent(); //从层中移除 enemyList.eraseObject(enemy); //从记录所有子弹的vector中移除 //移除后上一个对象会移到当前这个对象的位置,实际还是当前这个i,所以要i--才能访问到下一个对象 i--; } }
然后,然后就没然后了,这一节已经大功告成了。
看看运行效果,因为敌机我机是可以碰撞的,子弹和敌机是可以碰撞的,所以~~~所以就是你看的效果了。
下一节我们将来充当爆破人员,爆爆爆,引爆一切碰撞。
源码下载:源码2
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(六)游戏结束场景
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(二)素材准备与游戏菜单场景
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(一)环境与创建项目
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(三)物理引擎的使用
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(五)敌我碰撞处理、分数计算、音乐播放
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战 07.游戏界面 敌机的产生与移动
- cocos2d-x学习笔记【一】创建自己的场景类
- Cocos2d-x-3.10 创建没有重力的物理世界
- cocos2d-x 3.2|创建游戏中的场景:背景
- Cocos2d-x学习笔记一 创建场景
- [cocos2d-x] 打飞机子弹敌机碰撞检测
- cocos2d-x 3.0学习-使用Physicals创建物理世界
- Cocos2d-x 捕鱼达人游戏学习教程(3)--创建游戏的场景
- cocos2d-x lua 场景的创建
- Cocos2D-X学习3:创建一个新的场景
- Cocos2d-x学习之---模仿微信打飞机游戏敌机层设计初想
- cocos2d-x 菜鸟学习笔记四(游戏场景与场景切换)
- 文章标题
- 二叉树的和
- LeetCode: Repeated DNA Sequences
- 在菜单中Fragment中嵌套viewpager
- 笔记66--消息推送之个推
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建
- poj 1220 NUMBER BASE CONVERSION 高精度进制转换
- 蓝桥杯 - 算法训练 - ALGO-2 最大最小公倍数(数论+贪心)
- Linux Kernel Programming–Linked List
- 半夜又回荡起那一句半不知出处的英语
- ASP.NET MVC table 样式
- 通过xib和代码自定义cell
- 直接Stream Video到GPU Texture 内存
- C语言进阶_笔记 第三章 选择结构和循环结构的程序设计