【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现

【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现,第1张

概述        在上一篇中,我们实现了游戏的开始界面,接下来要实现游戏的主界面,主界面包含地图、我方飞机、敌机等         先来实现我方飞机 我方飞机具有哪些属性呢? 飞机要具有生命值、要有动画效果(尾部喷气),飞机不能够飞出边界,所以要进行边界检测,当飞机生命值为0时,飞机会爆炸,然后被移除。 .h文件 //飞机动画 Animate* planeFly(); //边界检测 void

在上一篇中,我们实现了游戏的开始界面,接下来要实现游戏的主界面,主界面包含地图、我方飞机、敌机等

先来实现我方飞机


我方飞机具有哪些属性呢? 飞机要具有生命值、要有动画效果(尾部喷气),飞机不能够飞出边界,所以要进行边界检测,当飞机生命值为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 (二) 我方飞机的实现所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1069111.html

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

发表评论

登录后才能评论

评论列表(0条)

保存