在上一篇中,我们实现了游戏的开始界面,接下来要实现游戏的主界面,主界面包含地图、我方飞机、敌机等
先来实现我方飞机
我方飞机具有哪些属性呢? 飞机要具有生命值、要有动画效果(尾部喷气),飞机不能够飞出边界,所以要进行边界检测,当飞机生命值为0时,飞机会爆炸,然后被移除。
.h文件
//飞机动画 Animate* planeFly(); //边界检测 voID borderCheck(float dt); //飞机爆炸 voID blowUp(); //移除飞机 voID removePlane(); //获取生命值 int getAlive(); //设定生命值 voID loseAlive(); // 更新生命值 voID updatealive(int alive);@H_502_27@
这个变量在create()函数中初始化,方便其他层调用我方飞机的相关数据
static MyPlane* instancePlane; //飞机实例@H_502_27@
我方飞机的生命值直接在这里显示、更新,不受控制器的控制
private: int m_alive; Label* aliveItem1; Label* aliveItem2;@H_502_27@
.cpp文件
/*************************************************************************** MyPlane.cpp* 杜星飞 2015年8月13日* 描述: 包含飞机的属性、功能等**************************************************************************/#include "MyPlane.h"#include "SimpleAudioEngine.h"MyPlane::MyPlane() :m_alive(5){}MyPlane::~MyPlane(){}MyPlane* MyPlane::instancePlane = NulL;MyPlane* MyPlane::create(){ MyPlane* m_plane = NulL; do { m_plane = new MyPlane(); CC_BREAK_IF(!m_plane); if (m_plane && m_plane->init()) { m_plane->autorelease(); instancePlane = m_plane; } else CC_SAFE_DELETE(m_plane); } while (0); return m_plane;}//飞机动画Animate* MyPlane::planeFly(){ Vector<SpriteFrame *> vector; for (int i = 0; i < 2; i++) { auto framename = __String::createWithFormat("chinaFly%d.png",i + 1); auto temSpriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByname(framename->getCString()); vector.pushBack(temSpriteFrame); } //设置不断播放飞机的动画 auto animation = Animation::createWithSpriteFrames(vector,0.2f,-1); auto animate = Animate::create(animation); return animate;}bool MyPlane::init(){ if(!Layer::init()) return false; Size winSize = Director::getInstance()->getWinSize(); //添加飞机 auto m_planesprite = Sprite::createWithSpriteFramename("chinaFly1.png"); m_planesprite->setposition(Point(winSize.wIDth / 2,m_planesprite->getContentSize().height / 2)); m_planesprite->setTag(AIRPLANE); this->addChild(m_planesprite); m_planesprite->runAction(this->planeFly()); // 飞机触摸 auto Listener = EventListenertouchOneByOne::create(); Listener->setSwallowtouches(true); //吞噬触摸事件 //对触摸事件的监听过程直接写在这里 Listener->ontouchBegan = [](touch* touch,Event *event) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); Point locationInNode = target->convertToNodeSpace(touch->getLocation()); Size s = target->getContentSize(); Rect rect = Rect(0,s.wIDth,s.height); if (rect.containsPoint(locationInNode)) return true; else return false; }; Listener->ontouchmoved = [](touch* touch,Event *event) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); target->setposition(target->getposition() + touch->getDelta()); }; Listener->ontouchended = [](touch* touch,Event* event) { }; //将触摸监听添加到eventdispacher中去 _eventdispatcher->addEventListenerWithSceneGraPHPriority(Listener,m_planesprite); //初始化生命值 //设置标签 并 获取中文文本 auto dictionary = Dictionary::createWithContentsOffile("Fonts/AboutMe.xml"); aliveItem1 = Label::createWithTTF( (((__String*)(dictionary->objectForKey("alive"))))->getCString(),"Fonts/DFPShaoNvW5-GB.ttf",25); aliveItem1->setposition(Point(winSize.wIDth/8,winSize.height-aliveItem1->getContentSize().height)); aliveItem1->setcolor(color3B(255,0)); this->addChild(aliveItem1); aliveItem2 = Label::createWithTTF( "5",25); aliveItem2->setposition(Point(aliveItem1->getpositionX()*2,winSize.height - aliveItem1->getContentSize().height)); aliveItem2->setcolor(color3B(255,0)); this->addChild(aliveItem2); // 开启边界检测 this->schedule(schedule_selector(MyPlane::borderCheck)); return true;}//边界检测voID MyPlane::borderCheck(float dt){ //进行边界判断,不可超出屏幕 Point location = this->getChildByTag(AIRPLANE)->getposition(); Size winSize = Director::getInstance()->getWinSize(); // 返回的就是这个矩形的大小 Size planesize = this->getChildByTag(AIRPLANE)->getContentSize(); if (location.x<planesize.wIDth / 2) location.x = planesize.wIDth / 2; if (location.x>winSize.wIDth - planesize.wIDth / 2) location.x = winSize.wIDth - planesize.wIDth / 2; if (location.y<planesize.height / 2) location.y = planesize.height / 2; if (location.y>winSize.height - planesize.height / 2) location.y = winSize.height - planesize.height / 2; this->getChildByTag(AIRPLANE)->setposition(location);}//飞机爆炸voID MyPlane::blowUp(){ this->unscheduleAllSelectors(); // 停止飞机的所有行动 //加载飞机爆炸动画 音效 if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) { CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/chinaDown.mp3"); } Vector<SpriteFrame*> planeBlowUp; for (int i = 0; i < 4; i++) { auto planename = __String::createWithFormat("china1_down%d.png",i + 1); auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByname( planename->getCString()); planeBlowUp.pushBack(tempBlowUp); } Animation* animation = Animation::createWithSpriteFrames(planeBlowUp,0.2f); Animate* animate = Animate::create(animation); CallFunc* m_removePlane = CallFunc::create(this,callfunc_selector(MyPlane::removePlane)); Sequence* sequence = Sequence::create(animate,m_removePlane,NulL); // 停止一切的飞机动作 this->getChildByTag(AIRPLANE)->stopAllActions(); this->getChildByTag(AIRPLANE)->runAction(sequence);}//移除飞机voID MyPlane::removePlane(){ // 移除飞机精灵 true子节点上的所有运行行为和回调将清理 this->removeChildByTag(AIRPLANE,true); }//获取生命值int MyPlane::getAlive(){ return m_alive;}//设定生命值voID MyPlane::loseAlive(){ --m_alive; updatealive(m_alive);}// 更新生命值voID MyPlane::updatealive(int alive){ if (alive >= 0) { CCString* strAlive = CCString::createWithFormat("%d",alive); aliveItem2->setString(strAlive->getCString()); aliveItem2->setcolor(color3B(rand_0_1() * 255,rand_0_1() * 255,rand_0_1() * 255)); }}@H_502_27@
更新生命值的函数只用在我方飞机生命值减少是调用。
还有就是对于中文字符的处理
//设置标签 并 获取中文文本 auto dictionary = Dictionary::createWithContentsOffile("Fonts/AboutMe.xml");@H_502_27@
可以在项目中添加一个XML文件
<?xml version="1.0" enCoding="UTF-8"?><dict><key>play</key><string>开始游戏</string><key>score</key><string>得分:</string><key>alive</key><string>生命:</string>@H_502_27@
通过相应的key来显示显示相应的中文。还有就是,有些字体不支持中文的显示,比如系统自带的arial.ttf就不行,而DFPShaoNvW5-GB.ttf可以。
总结以上是内存溢出为你收集整理的【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现全部内容,希望文章能够帮你解决【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)