Cocos2d-x《雷电大战》(3)-子弹无限发射
2015-03-15 16:50
369 查看
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
本文要实现雷电游戏中,游戏一开始,英雄飞机就无限发射子弹的功能。这里的思想是单独给子弹弄一个层,在这个层不设置一个定时器,每隔一个时间,根据当前英雄飞机传入的位置,生成子弹,并设置子弹的移动事件,和移动后的事件(就是把子弹删除掉,节省内存)。
最终效果:
Cocos2d-x版本:3.4工程环境:VS30213
2、HeroBulletLayer.cpp
注意:1、
2、这里重写了create方法,让它带一个参数,用它来传入英雄飞机
要注意mHeroPlane是上一讲中跟随手指移动的英雄飞机,看这里Cocos2d-x《雷电大战》(2)-精灵随手指移动,你点哪我走哪!
2、 根据当前英雄飞机的位置,计算子弹移动的距离,然后速度是自己设定的,就可以计算子弹要移动的直线距离的时间。
3、 当子弹移动到视野外后,就删除掉这个子弹,vector中也要删除。
4、GetBullet();是用来得到当前的vector子弹集合,然后我们需要一个一个的取出来,判断是否和敌机相撞,如果是,就调用removeBullet(Node* pNode);就是这样了。比如:
效果如下:这里要注意下vector的遍历用法,不能[],cocos2dx没有重载这个,要用at.
这里只是示例了下怎么用,子弹碰到飞机后就把它删除掉,敌机还没有做处理
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
本文要实现雷电游戏中,游戏一开始,英雄飞机就无限发射子弹的功能。这里的思想是单独给子弹弄一个层,在这个层不设置一个定时器,每隔一个时间,根据当前英雄飞机传入的位置,生成子弹,并设置子弹的移动事件,和移动后的事件(就是把子弹删除掉,节省内存)。
最终效果:
Cocos2d-x版本:3.4工程环境:VS30213
一、英雄子弹层
1、HeroBulletLayer.h/** *功能 创建子弹并初始化子弹的运动 *作者 林炳文(ling20081005@126.com 博客: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(); //根据英雄飞机创建子弹 static HeroBulletLayer* create(Node* heroPlane); //移除超出屏幕可视范围的子弹或者碰撞后的子弹清除 void removeBullet(Node* pNode); //发射子弹,在其中进行子弹的渲染和子弹的飞行动作,默认为单子弹 void ShootBullet(float dt); //返回子弹列表 Vector <Sprite *>& GetBullet(); public: Vector <Sprite *>vecBullet;//子弹容器 SpriteBatchNode* bulletBatchNode;//批次渲染节点 Node* heroPlane;//传入的英雄飞机 };
2、HeroBulletLayer.cpp
/** *功能 创建子弹并初始化子弹的运动 *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka) *时间 2015.3.14 */ #include "HeroBulletLayer.h" HeroBulletLayer::HeroBulletLayer(Node* heroPlane) { this->heroPlane = heroPlane; } HeroBulletLayer::~HeroBulletLayer() { } /** *创建子弹的静态方法 *@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调用一次发射子弹函数 this->schedule(schedule_selector(HeroBulletLayer::ShootBullet), 0.2f); bRet = true; } while (0); return bRet; } /** *用缓存的方法创建子弹,并初始化子弹的运动和运动后的事件 */ void HeroBulletLayer::ShootBullet(float dt) { Size winSize = Director::getInstance()->getWinSize(); auto PlanePos = heroPlane->getPosition(); //从缓存中创建子弹 auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture()); //将创建好的子弹添加到BatchNode中进行批次渲染 bulletBatchNode->addChild(spritebullet); //将创建好的子弹添加到容器 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;//实际飞行的时间 //子弹运行的距离和时间,从飞机处开始运行到屏幕顶端 auto actionMove = MoveTo::create(realFlyDuration, Point(bulletPos.x, winSize.height)); //子弹执行完动作后进行函数回调,调用移除子弹函数 auto actionDone = CallFuncN::create( CC_CALLBACK_1(HeroBulletLayer::removeBullet, this)); //子弹开始跑动 Sequence* sequence = Sequence::create(actionMove, actionDone, NULL); spritebullet->runAction(sequence); } /** * 移除子弹,将子弹从容器中移除,同时也从SpriteBatchNode中移除 */ void HeroBulletLayer::removeBullet(Node* pNode) { if (NULL == pNode) { return; } Sprite* bullet = (Sprite*)pNode; this->bulletBatchNode->removeChild(bullet, true); vecBullet.eraseObject(bullet); } /** *返回子弹列表,用来与敌机做碰撞检测 */ Vector <Sprite *>& HeroBulletLayer::GetBullet(){ return vecBullet; }
注意:1、
//创建BatchNode节点 bulletBatchNode = SpriteBatchNode::create("bullet1.png");这里用了把子弹的图片加入到缓存中的方法,然后需要创建子弹时候调用
//从缓存中创建子弹 auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());如果不这样做的话,游戏会很耗内存,就会很卡!
2、这里重写了create方法,让它带一个参数,用它来传入英雄飞机
二、使用方法
//加子弹 HeroBulletLayer *mHeroBulletLayer = HeroBulletLayer::create(mHeroPlane); this->addChild(mHeroBulletLayer,1);效果:
要注意mHeroPlane是上一讲中跟随手指移动的英雄飞机,看这里Cocos2d-x《雷电大战》(2)-精灵随手指移动,你点哪我走哪!
三、思路说明
1、上面的英雄子弹类很好用,你只要传入一个英雄飞机的位置,它就会生成英雄子弹层不断调用定时器生成子弹,同时加入到当前层中和Vector中(用来保存所有的子弹)2、 根据当前英雄飞机的位置,计算子弹移动的距离,然后速度是自己设定的,就可以计算子弹要移动的直线距离的时间。
3、 当子弹移动到视野外后,就删除掉这个子弹,vector中也要删除。
4、GetBullet();是用来得到当前的vector子弹集合,然后我们需要一个一个的取出来,判断是否和敌机相撞,如果是,就调用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.
这里只是示例了下怎么用,子弹碰到飞机后就把它删除掉,敌机还没有做处理
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
相关文章推荐
- Cocos2d-x《雷电大战》(3)-子弹无限发射
- Cocos2d-x《雷电大战》(3)-子弹无限发射
- cocos2d-x发射子弹
- cocos2d-x SimpleGame(3)如何发射子弹
- Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!
- Cocos2d-x《雷电大战》(1)-双层地图无限滚动
- (6) cocos2d-x发射子弹
- cocos2d-x入门(4)-英雄发射子弹和碰撞检测
- Cocos2d-x--发射多发子弹
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&怪物受伤---所有源码和资源完结下载
- Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!
- Cocos2d-x《雷电大战》-双层地图无限滚动 推荐
- Cocos2d-x《雷电大战》(1)-双层地图无限滚动
- cocos2d-x学习笔记之发射子弹技能
- Unity2D - 5. 向鼠标点击处发射子弹
- 10-html5游戏坦克大战第六战(自己的坦克可以连续发射子弹)
- 我的Unity(7)一点一滴 从相机向砖墙发射子弹
- 发射子弹 发射射线判断方法
- 【Unity】关于发射子弹、导弹追踪的逻辑(笔记)
- html5学习--实现坦克可以连续发射子弹