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

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

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

终于效果:

Cocos2d-x版本号:3.4

project环境: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)-子弹无限发射的更多相关文章

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

    写在前面的话:这是笔者开发的第二个小游戏<雷电大战>,之前就过这个游戏和<赵云要格斗>一样,终于将会开源. 因为自己的一些个人原因. 这个游戏还没有完毕.可是很多网友都过来寻求 ...

  2. Javase-坦克大战小游戏,为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着

    //为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着 package TanKe.lbl;import java.awt.*;import java.awt.ev ...

  3. java飞机大战之子弹的自动生成

    import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing. ...

  4. HTML-坦克大战-完成子弹连发功能(三)

    如题,完成子弹连发功能,上一篇博客遗留的问题,不能够连发,且一直按J键则第一颗子弹会消失:那是因为定义的子弹变量只是一个变量,现在定义成一个数组:在之前的代码上修改如下: <!DOCTYPE h ...

  5. Html飞机大战(八):子弹的移动和管理

    好家伙,这应该是这个小游戏最难的几个点之一了 现在我们要做出子弹射击的效果我们应该如何处理? 1.首先我们要确定几个变量和方法的关系 变量: 子弹  bullet  弹夹(用来装子弹的东西)bulle ...

  6. iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计

    本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...

  7. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇03:子弹发射》

    3.子弹发射 子弹发射概述: 在打飞机游戏中,子弹是自动发射的.子弹与子弹之间间隔一定的时间,玩家通过上下左右控制游戏角色,来达到躲避敌人及击中敌人的操作. 发射原理: 抽象理解为有两个容器存放子弹, ...

  8. 逆向知识之CS1.6辅助/外挂专题.1.实现CS1.6主武器副武器无限子弹

    逆向知识之CS辅助/外挂专题.1.实现CS主武器副武器无限子弹 PS: 相信大家CS1.6这类的FPS应该玩过.现在我们通过外挂手法.讲解逆向的本质.以及应用. 关于CS1.6的下载.网络百度下载即可 ...

  9. Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

    同样是从网上看到的一个需求,需求描述都在代码中. 不多说了,直接贴代码了.相信大家都能够看得懂的! package cn.yw.bore; import java.util.ArrayList; im ...

随机推荐

  1. Java code List Map, HashMap, JSON parser snippet

    package com.newegg.ec.solr.eventsalestoreservice.tuple; import kafka.message.MessageAndMetadata; pub ...

  2. 搭建Hadoop所遇过的坑

    问题1: 报错信息如下: Container exited with a non-zero exit code 143 Killed by external signal 解决方案: 分配的资源不够, ...

  3. 【Oracle】append

    我们在生产环境中经常遇到需要往表中插入大量数据的情况,怎么样才能让插入数据的速度变快呢?Oracle中的append简直就是神器!!没图说个**,直接上图: 是不是看晕了?哈哈,莫慌,请看下面总结: ...

  4. ABP(http://www.aspnetboilerplate.com/)下载初始化

    官网:http://www.aspnetboilerplate.com/ 下载 下载完成后用vs2015打开,是2015,低版本打开可能会出现一些问题 生成项目,Nuget会自动下载需要的类库 ABP ...

  5. Unicode转换为UTF-8过程Demo

    碎碎念:这几天在学习Python对Unicode的支持 上学的时候,计算机基础课上总能听到老师讲什么字节,字符,Unicode,UTF-8吧啦吧啦一堆,反正我是只记住了名字,至于具体这些名字所表达的含 ...

  6. Python 集合 day3

    集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,集合用{},里面是一个一个元素,不同于key-value形式的字典: 注意:创建一个空集合必须用 s ...

  7. shell常用语法

    for.if条件: https://blog.51cto.com/qiufengsong/1252889 一.for循环: );do echo $i done ###第一行:seq是指1到10,第二行 ...

  8. 减小数据库Log文件大小 1MB 为自定义大小

    --减小数据库Log文件大小 1MB 为自定义大小USE [master]GOALTER DATABASE DataBaeName SET RECOVERY SIMPLE WITH NO_WAITGO ...

  9. [luogu4251 SCOI2015] 小凸玩矩阵 (二分图最大匹配)

    传送门 Description Input Output 输出包含一行,为选出的 n 个数中第 k 大数的最小值. Sample Input 输入样例1: 2 3 1 1 2 4 2 4 1 输入样例 ...

  10. open-ldap schema (2)

    schema介绍及用途 schema 是OpenLDAP 软件的重要组成部分,主要用于控制目录树中各种条目所拥有的对象类以及各种属性的定义,并通过自身内部规范机制限定目录树条目所遵循的逻辑结构以及定义 ...