Cocos2d-x《雷电大战》(3)-子d无限发射

Cocos2d-x《雷电大战》(3)-子d无限发射,第1张

概述    林炳文Evankaka原创作品。转载请注明出处http://www.voidcn.com/tag/http://blog.csdn.net/evankaka    本文要实现雷电游戏中,游戏一开始,英雄飞机就无限发射子d的功能。这里的思想是单独给子d弄一个层,在这个层不设置一个定时器,每隔一个时间,根据当前英雄飞机传入的位置,生成子d,并设置子d的移动事件,和移动后的事件(就是把子d删除掉

林炳文Evankaka原创作品。转载请注明出处http://www.jb51.cc/tag/http://blog.csdn.net/evankaka

本文要实现雷电游戏中,游戏一开始,英雄飞机就无限发射子d的功能。这里的思想是单独给子d弄一个层,在这个层不设置一个定时器,每隔一个时间,根据当前英雄飞机传入的位置,生成子d,并设置子d的移动事件,和移动后的事件(就是把子d删除掉,节省内存)。

最终效果:


Cocos2d-x版本:3.4

工程环境:VS30213


一、英雄子d层

1、HeroBulletLayer.h

/***功能 创建子d并初始化子d的运动*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)*时间 2015.3.14*/#include "cocos2d.h"USING_NS_CC;const float FlYVELociTY = 500;//运行速度,可以自己控制,每秒所走的像素class HeroBulletLayer : public cocos2d::Layer{public:	HeroBulletLayer(Node* heroPlane);	~HeroBulletLayer();	virtual bool init();	//根据英雄飞机创建子d	static HeroBulletLayer* create(Node* heroPlane);	//移除超出屏幕可视范围的子d或者碰撞后的子d清除	voID removeBullet(Node* pNode);	//发射子d,在其中进行子d的渲染和子d的飞行动作,默认为单子d	voID ShootBullet(float dt);	//返回子d列表	Vector <Sprite *>& GetBullet();public:	Vector <Sprite *>vecBullet;//子d容器	SpriteBatchNode* bulletBatchNode;//批次渲染节点	Node* heroPlane;//传入的英雄飞机};


2、HeroBulletLayer.cpp

/***功能 创建子d并初始化子d的运动*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)*时间 2015.3.14*/#include "HeroBulletLayer.h"HeroBulletLayer::HeroBulletLayer(Node* heroPlane) {	this->heroPlane = heroPlane;}HeroBulletLayer::~HeroBulletLayer() {}/***创建子d的静态方法*@param heroPlane为英雄飞机*/HeroBulletLayer* HeroBulletLayer::create(Node* heroPlane){	HeroBulletLayer* pRet = new HeroBulletLayer(heroPlane);	if (pRet&&pRet->init()){		pRet->autorelease();		return pRet;	}	else{		delete pRet;		pRet = NulL;		return NulL;	}}bool HeroBulletLayer::init() {	bool bRet = false;	do {		CC_BREAK_IF(!Layer::init());		//创建BatchNode节点		bulletBatchNode = SpriteBatchNode::create("bullet1.png");		this->addChild(bulletBatchNode);		//每隔0.2S调用一次发射子d函数		this->schedule(schedule_selector(HeroBulletLayer::ShootBullet),0.2f);		bRet = true;	} while (0);	return bRet;}/***用缓存的方法创建子d,并初始化子d的运动和运动后的事件*/voID HeroBulletLayer::ShootBullet(float dt) {	Size winSize = Director::getInstance()->getWinSize();	auto PlanePos = heroPlane->getposition();	//从缓存中创建子d	auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());	//将创建好的子d添加到BatchNode中进行批次渲染	bulletBatchNode->addChild(spritebullet);	//将创建好的子d添加到容器	vecBullet.pushBack(spritebullet);	Point bulletPos = (Point(PlanePos.x,PlanePos.y + heroPlane->getContentSize().height / 2 + 20));	spritebullet->setposition(bulletPos);	spritebullet->setScale(0.8f);	float flyLen = winSize.height - PlanePos.y;	float realFlyDuration = flyLen / FlYVELociTY;//实际飞行的时间	//子d运行的距离和时间,从飞机处开始运行到屏幕顶端	auto actionMove = Moveto::create(realFlyDuration,Point(bulletPos.x,winSize.height));	//子d执行完动作后进行函数回调,调用移除子d函数	auto actionDone = CallFuncN::create(		CC_CALLBACK_1(HeroBulletLayer::removeBullet,this));	//子d开始跑动	Sequence* sequence = Sequence::create(actionMove,actionDone,NulL);	spritebullet->runAction(sequence);}/** * 移除子d,将子d从容器中移除,同时也从SpriteBatchNode中移除 */voID HeroBulletLayer::removeBullet(Node* pNode) {	if (NulL == pNode) {		return;	}	Sprite* bullet = (Sprite*)pNode;	this->bulletBatchNode->removeChild(bullet,true);	vecBullet.eraSEObject(bullet);}/***返回子d列表,用来与敌机做碰撞检测*/Vector <Sprite *>& HeroBulletLayer::GetBullet(){	return vecBullet;}

注意:

1、

//创建BatchNode节点bulletBatchNode = SpriteBatchNode::create("bullet1.png");
这里用了把子d的图片加入到缓存中的方法,然后需要创建子d时候调用
 //从缓存中创建子d    auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());
如果不这样做的话,游戏会很耗内存,就会很卡!

2、这里重写了create方法,让它带一个参数,用它来传入英雄飞机

二、使用方法
	//加子d	HeroBulletLayer *mHeroBulletLayer = HeroBulletLayer::create(mHeroPlane);	this->addChild(mHeroBulletLayer,1);

效果:


要注意mHeroPlane是上一讲中跟随手指移动的英雄飞机,看这里Cocos2d-x《雷电大战》(2)-精灵随手指移动,你点哪我走哪!

三、思路说明

1、上面的英雄子d类很好用,你只要传入一个英雄飞机的位置,它就会生成英雄子d层不断调用定时器生成子d,同时加入到当前层中和Vector中(用来保存所有的子d)

2、 根据当前英雄飞机的位置,计算子d移动的距离,然后速度是自己设定的,就可以计算子d要移动的直线距离的时间。

3、 当子d移动到视野外后,就删除掉这个子d,vector中也要删除。

4、GetBullet();是用来得到当前的vector子d集合,然后我们需要一个一个的取出来,判断是否和敌机相撞,如果是,就调用removeBullet(Node* pNode);就是这样了。比如:

voID GameMain::update(float dt){	auto *mEnemyPlane = getChildByTag(200);	Vector <Sprite *> mVecHeroBullet = mHeroBulletLayer->GetBullet();	for (int i = 0; i<mVecHeroBullet.size();i++){		if (mEnemyPlane->boundingBox().intersectsRect(mVecHeroBullet.at(i)->boundingBox())){			mHeroBulletLayer->removeBullet(mVecHeroBullet.at(i));		}	}}

效果如下:这里要注意下vector的遍历用法,不能[],cocos2dx没有重载这个,要用at.

这里只是示例了下怎么用,子d碰到飞机后就把它删除掉,敌机还没有做处理

林炳文Evankaka原创作品。转载请注明出处http://www.jb51.cc/tag/http://blog.csdn.net/evankaka

总结

以上是内存溢出为你收集整理的Cocos2d-x《雷电大战》(3)-子d无限发射全部内容,希望文章能够帮你解决Cocos2d-x《雷电大战》(3)-子d无限发射所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存