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

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

本文要实现雷电游戏中,游戏一開始,英雄飞机就无限发射子弹的功能。

这里的思想是单独给子弹弄一个层。在这个层不设置一个定时器,每隔一个时间,依据当前英雄飞机传入的位置,生成子弹,并设置子弹的移动事件,和移动后的事件(就是把子弹删除掉,节省内存)。

终于效果:

Cocos2d-x版本号:3.4

project环境:VS30213

一、英雄子弹层

1、HeroBulletLayer.h

/**
*功能 创建子弹并初始化子弹的运动
*作者 林炳文([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();

	//依据英雄飞机创建子弹
	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

/**
*功能 创建子弹并初始化子弹的运动
*作者 林炳文([email protected] 博客: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

时间: 2024-08-03 04:01:48

Cocos2d-x《雷电大战》(3)-子弹无限发射的相关文章

Cocos2d-x游戏《雷电大战》开源啦!要源码要资源快快来~~

写在前面的话:这是笔者开发的第二个小游戏<雷电大战>,之前就过这个游戏和<赵云要格斗>一样,最终将会开源.由于自己的一些个人原因.这个游戏还没有完成,但是许多网友都过来寻求代码或资源,本着开源的精神,笔者今天将它们共享给出大家. 注:目前游戏还没有完成,代码全是笔者原创,资源有一部分原创,有一部分网上搜集. 若是觉得本项目对你有用,那么请给辛苦的笔者的GitHub右上角Star一颗星星!不胜感激---- 下载地址 https://github.com/appleappleapple

Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文从设计模式中的策略模式入手,主讲了飞机大战中英雄飞机切换不同的子弹.这里分为三种子弹.第一种:每次发一个子弹,垂直发射;第二种:每次发两个子弹,两个都是垂直发射:第三种;每次发三个子弹,两边的子弹有一定的角度,而中间的子弹垂直发射;设计模式是游戏开发经常用到的思想,建议有兴趣的同学可以好好研究下!好了,下面开始吧. 效果如下: Cocos2d-x版本:3.4 工程环境:VS30213 一

Cocos2d-x《雷电大战》(5)-单例模式英雄飞机闪亮登场!

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将实现用单例模式实现一个英雄飞机类的设计,单例模式是游戏开发中最常用到的一种设计模式,原理也比较简单,仔细研究下就可以掌握好. 来看看效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.单例模式解析 单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功

飞机大战03之飞机发射子弹,添加敌人

飞机发射子弹: 弹幕,是雷电游戏的精华.这就需要对子弹的运动轨迹进行控制. 先做一个最简单的子弹发射,后面再添加各种弹幕(实际上主要是研究弹幕) 说是最简单,其实也是最普通的子弹发射,产生一个颗子弹移动就OK了. 方法:做一个子弹发射的计时器,产生子弹,子弹做MoveBy动作就OK了. 代码: GameLayer.cpp void GameLayer::fireSchedule(float dt) { Size screenSize = Director::getInstance()->getW

Cocos2d-x 《雷电大战》-双层地图无限滚动

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧 先来看看效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.实现思路 其实就是两张图片,然后同时一起向下(向上)滚动,当一张图片完全出视野后,就

Cocos2d-x《雷电大战》-双层地图无限滚动

本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧 先来看看效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.实现思路 其实就是两张图片,然后同时一起向下(向上)滚动,当一张图片完全出视野后,就把它调到最上面.形成两个图片交替出现,不过,一般为游戏中我们都感觉像是一张图片,那是因为两张图片的头尾连接

子弹的发射

实现思路: 1.获取tank的宽高 2.根据tank的方向更换子弹的图片 3.获取每个方向子弹图片的宽高 4.计算出子弹的坐标 5.为子弹加速 代码实现: 1.定义Element类,属性有坐标.宽高和图片路径,方法有draw()方法和getSize()方法 1 package Itheima.bean; 2 3 import java.io.IOException; 4 5 import org.itheima.game.utils.DrawUtils; 6 7 public class Ele

Cocos2d-x 《雷电大战》-精灵随手指移动,你点哪我走哪!

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现飞机游戏中,人的手指按着飞机,就能拖着飞机走动,这里实现了当你手指按在手机的图片上,手指一直按着屏幕,飞机就会跟着你走.同时,还加入了边界判断条件,让飞机在你的视野内移动,实现的效果完全和我们手机上的飞机游戏一样. 效果: Cocos2d-x版本:3.4 工程环境:VS30213 一.代码编写 1.头文件GameMain.h /** *@作者 林炳文(邮箱:[email prote

Cocos2d-x《雷电大战》(6) 智能敌机AI来袭--飞行路径算法设计与实现(上)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现飞机类游戏中的一连串飞机的跟随出和和并行出出.而网上找了一些Cocos2dx开发的飞行类游戏,都只找到一些简单的智能敌机.基本上没什么AI,这样游戏玩起来就太没意思了.然后又去找敌机飞行路径的相关资料,发现相关的也很少.想想还是自己来设计吧! 飞机类游戏设计中,智机的飞行路径设计和智能子弹的设计绝对一个飞行类游戏好坏是的核心.敌机智能也是分级别的.BOSS机就不说了,而飞行游戏由于