【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d

【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d,第1张

概述        我方飞机的子d和敌机子d都在这个类中产生。将子d专门设计成一个类,主要是为了方便扩展。之后如果想更换我方飞机子d或者是敌机子d,都会很方便。 类的功能很直观,就是添加子d、移除子d void bindEnemyManager(EnemyManager* enemyManager); void BeginBulletShoot(float dt = 0.0f); // 开启子d射

我方飞机的子d和敌机子d都在这个类中产生。将子d专门设计成一个类,主要是为了方便扩展。之后如果想更换我方飞机子d或者是敌机子d,都会很方便。


类的功能很直观,就是添加子d、移除子d


	voID bindEnemyManager(EnemyManager* enemyManager);	voID BeginBulletShoot(float dt = 0.0f);	// 开启子d射击	voID StopBulletShoot();					// 停止子d射击	voID addBullet(float dt);				// 添加子d	voID removeBullet(Node* pNode);			// 移除子d	voID addEnemyBullet(float dt);				// 添加敌机子d	voID removeEnemyBullet(Node* pNode);			// 移除敌机子d


添加的子d像敌机一样,存储在容器中
Vector<Sprite*> vecBullet; Vector<Sprite*> vecEnemyBullet;EnemyManager* m_enemyManager;


想给敌机添加子d,要将子d类和敌机管理类绑定,通过敌机管理类中的容器,来获取敌机对象。


我们通过对比敌机类和我方飞机类,可以发现,我方飞机精灵直接嵌入在飞机层中,并通过setTag()设置标识,可以通过标识来调用,也可以通过调用飞机层的实例instancePlane来间接调用。而敌机虽然也设置了标识,但是可以通过getSprite()函数来获取精灵实体。



接下来实现添加子d的功能

bool Bullet::init(){	if (!Layer::init())	{		return false;	}	BeginBulletShoot();	return true;}voID Bullet::bindEnemyManager(EnemyManager* enemyManager){	this->m_enemyManager = enemyManager;	m_enemyManager->retain();}voID Bullet::BeginBulletShoot(float dt){	this->schedule(schedule_selector(Bullet::addBullet),0.2f,kRepeatForever,dt);	this->schedule(schedule_selector(Bullet::addEnemyBullet),1.0f,dt);}voID Bullet::StopBulletShoot(){	this->unschedule(schedule_selector(Bullet::addBullet));	this->unschedule(schedule_selector(Bullet::addEnemyBullet));}voID Bullet::addBullet(float dt){	// 子d	auto bullet = Sprite::createWithSpriteFramename("bullet1.png");	if (NulL == bullet)	{		return;	}	this->addChild(bullet);		// 加到Layer中去	vecBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞检测等	// 获得飞机的位置	Point planePos = MyPlane::instancePlane->getChildByTag(AIRPLANE)->getposition();	Point bulletPos = Point(planePos.x,planePos.y + MyPlane::instancePlane->getChildByTag(AIRPLANE)->getContentSize().height / 2);	bullet->setposition(bulletPos);	// 飞行长度 飞行就是超出窗体	float flyLen = Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2 - bulletPos.y;	float flyVeLocity = 320 / 1; //飞行速度	float realFlyDuration = flyLen / flyVeLocity; // 飞行时间	auto actionMove = Moveto::create(realFlyDuration,Point(bulletPos.x,Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2));	auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeBullet,this));	Sequence* sequence = Sequence::create(actionMove,actionDone,NulL);	bullet->runAction(sequence);	if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())	{		CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/bullet.wav");	}	}voID Bullet::removeBullet(Node* pNode){	if (NulL == pNode)	{		return;	}	Sprite* bullet = (Sprite*)pNode;	this->removeChild(bullet,true);	vecBullet.eraSEObject(bullet);}// 添加敌机子dvoID Bullet::addEnemyBullet(float dt){	for (auto& eEnemy : m_enemyManager->vecEnemy)	{		Enemy* pEnemySprite = (Enemy*)eEnemy;		// 子d		auto bullet = Sprite::createWithSpriteFramename("enemyBullet.png");		if (NulL == bullet)		{			return;		}		this->addChild(bullet);		// 加到Layer中去		vecEnemyBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞检测等		// 获得敌方飞机的位置		Point enemyPos = pEnemySprite->getposition();		Point bulletPos = Point(enemyPos.x,enemyPos.y - pEnemySprite->getContentSize().height / 2);		bullet->setposition(bulletPos);		// 飞行长度 飞行就是超出窗体		float flyLen = bulletPos.y - bullet->getContentSize().height / 2;		float flyVeLocity = 320 / 1; //飞行速度		float realFlyDuration = flyLen / flyVeLocity; // 飞行时间		auto actionMove = Moveto::create(realFlyDuration,Director::getInstance()->getVisibleOrigin().y - bullet->getContentSize().height / 2));		auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeEnemyBullet,this));		Sequence* sequence = Sequence::create(actionMove,NulL);		bullet->runAction(sequence);		if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())		{			CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemyBullet.wav");		}	}}// 移除敌机子dvoID Bullet::removeEnemyBullet(Node* pNode){	if (NulL == pNode)	{		return;	}	Sprite* bullet = (Sprite*)pNode;	this->removeChild(bullet,true);	vecEnemyBullet.eraSEObject(bullet);}
注意不要将添加我方飞机子d和添加敌机子d放在一个函数中,那样不仅使代码混乱,而且不利于扩展。 总结

以上是内存溢出为你收集整理的【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d全部内容,希望文章能够帮你解决【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存