请教魂斗罗归来雷电激光炮的激光子弹如何实现

cocos2d制作类似雷电游戏中飞机的激光子弹效果,Cocos2D-X,游戏源码,6m5m游戏素材
请求处理中...
cocos2d制作类似雷电游戏中飞机的激光子弹效果,可以弯曲。&
或 0 积分 ()
下载340浏览人数9980交付方式直接下载
注意:【1】本站只是个免费分享平台,并不敢保证所有源码人人都能编译,因素太多,旨在学习研究,如果您有顾虑或斤斤计较就请不要下载了,大家都不容易,互相理解,才能让更多的好资源出现!【2】本站资源仅限于学习研究,请在下载后24小时内删除,不要用于任何商业用途。【3】部分素材压缩包因体积过大而上传到百度等网盘上,如果发现在本站下载的压缩包只要有几K大小,说明该压缩包里只是网盘的下载链接,并非文件损坏,本站的所有素材都是经过了审核,大家可放心下载,欢迎监督反馈。【4】做个好平台真心不容易,我们一直在努力,因本站素材量大,难免会出现某网盘下载链接失效等问题,请大家及时反馈,我们会及时修正保证您可以拿到素材,请大家支持和理解!
免责声明:本网所展示的素材与服务信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。本网不提供任何保证,并不承担任何法律责任,如有不妥之处请及时反馈,本网将会妥善处理。
友情提醒:本站旨在游戏开发的学习,所分享的素材资源均来源于网络,仅适用于学习参考,尊重版权,禁止用于任何商业用途,否则后果自负,所展示的素材版权归原作者或公司所有,如果本站素材侵犯了您的权益,请联系我们,我们将及时处理。
猜您喜欢的游戏素材
5金币 / 个
1金币 / 个
2金币 / 个
0金币 / 个
1金币 / 个
1金币 / 个
0金币 / 个
1金币 / 个
2金币 / 个
0金币 / 个
好评率99.83%
发布素材10Cocos2d-x 3.4《雷电大战》-让你的子弹无限发射 - cocos2dx技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho机甲旋风,枪炮雷电打简单哈雷,中子弹激光超高伤害-游戏视频-搜狐视频
机甲旋风,枪炮雷电打简单哈雷,中子弹激光超高伤害
<span class="c-black" data-rss-fanscount=" 人订阅
视频介绍:
机甲旋风,枪炮雷电打简单哈雷,中子弹激光超高伤害 机甲旋风,枪炮转雷电,中子弹和激光的伤害打空boss四管血,装备为普通蓝装。
推荐出品人分享给朋友:通用代码: <input id="link4" type="text" class="form_input form_input_s" value="" />复 制机甲旋风,枪炮雷电打简单哈雷,中子弹激光超高伤害下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效机甲旋风,枪炮雷电打简单哈雷,中子弹激光超高伤害扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 请使用者仔细阅读优酷、、、Copyright(C)2017 优酷
版权所有不良信息举报电话:4308人阅读
Cocos2d-x游戏开发《雷电大战》(7)
&&&&& &原创作品。转载请注明出处&&& 本文从设计模式中的策略模式入手,主讲了飞机大战中英雄飞机切换不同的子弹。这里分为三种子弹。第一种:每次发一个子弹,垂直发射;第二种:每次发两个子弹,两个都是垂直发射:第三种;每次发三个子弹,两边的子弹有一定的角度,而中间的子弹垂直发射;设计模式是游戏开发经常用到的思想,建议有兴趣的同学可以好好研究下!好了,下面开始吧。效果如下:Cocos2d-x版本:3.4工程环境:VS30213一、策略模式(Stragegy Pattern)1、简介Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。2、意图定义一系列的算法,把它们一个个封装起来,并且它们可相互替换。使得算法可独立于使用它的客户而变化。3、适用性如果一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。一个系统需要动态的在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法的对象。一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的和复杂的只与算法有关的数据。如果一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移到它们各自的Strategy类中以代替这些条件语句。更多详细的策略模式看这里吧:二.子弹类与子弹管理类的代码编写首先来看下本文的类UML图:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 这里的思路是把子弹发射当成是一个函数,基类子弹中定义成虚函数,然后实现类子弹中HeroBulletOne、HeroBulletTwo、HeroBulletThree分别实现不同的发射功能。然后在子弹管理类中HeroBulletLayer中有一个私有的成员变量BulletStyle *mBulletStyle.当需要切换不同的子弹时,就将new不同的HeroBulletOne或HeroBulletTwo或HeroBulletThree,赋给mBulletStyle。下面我们来看看代码吧!!!2.1 首先是子弹的基类:BulletStyle.h,这里注意到virtual void shootBullet(float dt){}为虚函数,表示这里要根据的子类不同,发射不同的子弹数目;/**
*功能 创建子弹的基类
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#pragma once
#ifndef __BulletStyle_H__
#define __BulletStyle_H__
#include &cocos2d.h&
USING_NS_CC;
class BulletStyle : public cocos2d::Node{
~BulletStyle();
* 移除所有的东西
void removeAllObject();
*移除超出屏幕可视范围的子弹或者碰撞后的子弹清除
*@param pNode 要删除的子弹
void removeBullet(Node* pNode);
*根据传入的飞机,子弹跟随发射
*@param plane为传入飞机,可为英雄飞机或敌机
virtual void createBullet(Node* plane);
*发射子弹,在其中进行子弹的渲染和子弹的飞行动作,默认为单子弹
*@param dt子弹间隔发时间
virtual void shootBullet(float dt){}
protected:
//子弹容器
Vector &Sprite *& vecB
//批次渲染节点
SpriteBatchNode* bulletBatchN
//传入的飞机
#endif 实现文件BulletStyle.cpp/**
*功能 创建子弹的基类
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#include &BulletStyle.h&
BulletStyle::~BulletStyle(){
//removeAllObject();
* 移除所有的东西
void BulletStyle::removeAllObject(){
bulletBatchNode-&removeAllChildren();
vecBullet.clear();
this-&removeAllChildren();
* 移除子弹,将子弹从容器中移除,同时也从SpriteBatchNode中移除
void BulletStyle::removeBullet(Node* pNode) {
if (NULL == pNode) {
Sprite* bullet = (Sprite*)pN
bulletBatchNode-&removeChild(bullet, true);
vecBullet.eraseObject(bullet);
*根据传入的飞机,子弹跟随发射
*@param plane为传入飞机,可为英雄飞机或敌机
void BulletStyle::createBullet(Node* plane){
this-&plane =
//创建BatchNode节点
bulletBatchNode = SpriteBatchNode::create(&bullet1.png&);
this-&addChild(bulletBatchNode);
//每隔0.2S调用一次发射子弹函数
schedule(schedule_selector(BulletStyle::shootBullet), 0.2f);//注意,这里的发射方法留给子类来实现!!!
}2.2 只发射一个子弹的类HeroBulletOne.h,注意,直接继承/**
*功能 每次只发射一个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#pragma once
#ifndef __HeroBulletOne_H__
#define __HeroBulletOne_H__
#include &cocos2d.h&
#include &BulletStyle.h&
USING_NS_CC;
class HeroBulletOne : public BulletStyle {
void shootBullet(float dt);
#endif 实现文件:/**
*功能 每次只发射一个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#include &HeroBulletOne.h&
void HeroBulletOne::shootBullet(float dt) {
Size winSize = Director::getInstance()-&getWinSize();
auto PlanePos = plane-&getPosition();
//从缓存中创建子弹
auto spritebullet = Sprite::createWithTexture(bulletBatchNode-&getTexture());
//将创建好的子弹添加到BatchNode中进行批次渲染
bulletBatchNode-&addChild(spritebullet);
//将创建好的子弹添加到容器
vecBullet.pushBack(spritebullet);
Point bulletPos = (Point(PlanePos.x,
PlanePos.y + plane-&getContentSize().height / 2 + 20));
spritebullet-&setPosition(bulletPos);
spritebullet-&setScale(0.8f);
float flyVelocity = 500;//运行速度,可以自己控制,每秒所走的像素
float flyLen = winSize.height - PlanePos.y;
float realFlyDuration = flyLen / flyV//实际飞行的时间
//子弹运行的距离和时间,从飞机处开始运行到屏幕顶端
auto actionMove = MoveTo::create(realFlyDuration,
Point(bulletPos.x, winSize.height));
//子弹执行完动作后进行函数回调,调用移除子弹函数
auto actionDone = CallFuncN::create(
CC_CALLBACK_1(HeroBulletOne::removeBullet, this));
//子弹开始跑动
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
spritebullet-&runAction(sequence);
2.3 发射二个子弹的类HeroBulletTwo.h,注意,直接继承/**
*功能 每次发射二个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#pragma once
#ifndef __HeroBulletTwo_H__
#define __HeroBulletTwo_H__
#include &cocos2d.h&
#include &BulletStyle.h&
USING_NS_CC;
class HeroBulletTwo : public BulletStyle {
void shootBullet(float dt);
#endif 实现文件:/**
*功能 每次发射二个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#include &HeroBulletTwo.h&
void HeroBulletTwo::shootBullet(float dt) {
Size winSize = Director::getInstance()-&getWinSize();
auto PlanePos = plane-&getPosition();
//从缓存中创建子弹
auto spritebullet1 = Sprite::createWithTexture(bulletBatchNode-&getTexture());
auto spritebullet2 = Sprite::createWithTexture(bulletBatchNode-&getTexture());
//将创建好的子弹添加到BatchNode中进行批次渲染
bulletBatchNode-&addChild(spritebullet1);
bulletBatchNode-&addChild(spritebullet2);
//将创建好的子弹添加到容器
vecBullet.pushBack(spritebullet1);
vecBullet.pushBack(spritebullet2);
Point bulletPos1 = (Point(PlanePos.x - plane-&getContentSize().width / 4,
PlanePos.y + plane-&getContentSize().height / 2+10 ));
Point bulletPos2 = (Point(PlanePos.x + plane-&getContentSize().width / 4,
PlanePos.y + plane-&getContentSize().height / 2+10));
spritebullet1-&setPosition(bulletPos1);
spritebullet1-&setScale(0.8f);
spritebullet2-&setPosition(bulletPos2);
spritebullet2-&setScale(0.8f);
float flyVelocity = 500;//运行速度,可以自己控制,每秒所走的像素
float flyLen = winSize.height - PlanePos.y;
float realFlyDuration = flyLen / flyV//实际飞行的时间
//子弹运行的距离和时间,从飞机处开始运行到屏幕顶端
auto actionMove1 = MoveTo::create(realFlyDuration,
Point(bulletPos1.x, winSize.height));
auto actionMove2 = MoveTo::create(realFlyDuration,
Point(bulletPos2.x, winSize.height));
//子弹执行完动作后进行函数回调,调用移除子弹函数
auto actionDone = CallFuncN::create(
CC_CALLBACK_1(HeroBulletTwo::removeBullet, this));
//子弹开始跑动
Sequence* sequence1 = Sequence::create(actionMove1, actionDone, NULL);
spritebullet1-&runAction(sequence1);
Sequence* sequence2 = Sequence::create(actionMove2, actionDone, NULL);
spritebullet2-&runAction(sequence2);
2.4 发射三个子弹的类HeroBulletThree.h,注意,直接继承/**
*功能 每次发射三个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#pragma once
#ifndef __HeroBulletThree_H__
#define __HeroBulletThree_H__
#include &cocos2d.h&
#include &BulletStyle.h&
USING_NS_CC;
class HeroBulletThree : public BulletStyle {
virtual void shootBullet(float dt);
#endif 实现文件:/**
*功能 每次发射三个子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#include &HeroBulletThree.h&
void HeroBulletThree::shootBullet(float dt) {
Size winSize = Director::getInstance()-&getWinSize();
auto PlanePos = plane-&getPosition();
double angle = M_PI * 80 / 180;//旋轉的角度
//从缓存中创建子弹
auto spritebullet = Sprite::createWithTexture(bulletBatchNode-&getTexture());
auto spritebullet1 = Sprite::createWithTexture(bulletBatchNode-&getTexture());
spritebullet1-&setRotation(-angle);
auto spritebullet2 = Sprite::createWithTexture(bulletBatchNode-&getTexture());
spritebullet2-&setRotation(angle);
//将创建好的子弹添加到BatchNode中进行批次渲染
bulletBatchNode-&addChild(spritebullet);
bulletBatchNode-&addChild(spritebullet1);
bulletBatchNode-&addChild(spritebullet2);
//将创建好的子弹添加到容器
vecBullet.pushBack(spritebullet);
vecBullet.pushBack(spritebullet1);
vecBullet.pushBack(spritebullet2);
Point bulletPos = (Point(PlanePos.x,
PlanePos.y + plane-&getContentSize().height / 2 + 20));
Point bulletPos1 = (Point(PlanePos.x - plane-&getContentSize().width / 4-10,
PlanePos.y + plane-&getContentSize().height / 2+10 ));
Point bulletPos2 = (Point(PlanePos.x + plane-&getContentSize().width / 4+10,
PlanePos.y + plane-&getContentSize().height / 2+10));
spritebullet-&setPosition(bulletPos);
spritebullet-&setScale(0.8f);
spritebullet1-&setPosition(bulletPos1);
spritebullet1-&setScale(0.8f);
spritebullet2-&setPosition(bulletPos2);
spritebullet2-&setScale(0.8f);
float flyVelocity = 500;//运行速度,可以自己控制,每秒所走的像素
float flyLen = winSize.height - PlanePos.y;
float flyLen1 = PlanePos.x / cos(angle);//按照度來算
float flyLen2 = (winSize.width - PlanePos.x) / cos(angle);
float realFlyDuration = flyLen / flyV//实际飞行的时间
float realFlyDuration1 = flyLen1 / flyV//实际飞行的时间
float realFlyDuration2 = flyLen2 / flyV//实际飞行的时间
//子弹运行的距离和时间,从飞机处开始运行到屏幕顶端
auto actionMove = MoveTo::create(realFlyDuration,
Point(bulletPos.x, winSize.height));
auto actionMove1 = MoveTo::create(realFlyDuration1,
Point(0, PlanePos.x*tan(angle) + PlanePos.y));
auto actionMove2 = MoveTo::create(realFlyDuration2,
Point(winSize.width, (winSize.width - PlanePos.x)*tan(angle) + PlanePos.y));
//子弹执行完动作后进行函数回调,调用移除子弹函数
auto actionDone = CallFuncN::create(
CC_CALLBACK_1(HeroBulletThree::removeBullet, this));
//子弹开始跑动
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
spritebullet-&runAction(sequence);
Sequence* sequence1 = Sequence::create(actionMove1, actionDone, NULL);
spritebullet1-&runAction(sequence1);
Sequence* sequence2 = Sequence::create(actionMove2, actionDone, NULL);
spritebullet2-&runAction(sequence2);
2.5、子弹管理器编写/**
*功能 管理子弹、切换不同的子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#pragma once
#ifndef __HeroBulletLayer_H__
#define __HeroBulletLayer_H__
#include &cocos2d.h&
#include &BulletStyle.h&
#include &HeroBulletOne.h&
#include &HeroBulletTwo.h&
#include &HeroBulletThree.h&
class HeroBulletLayer : public cocos2d::Layer
HeroBulletLayer(Node* heroPlane);
virtual bool init();
//根据英雄飞机创建子弹
static HeroBulletLayer* create(Node* heroPlane);
//改变子弹
void changeBullet(int bulletNumber);
Node* heroP//传入的英雄飞机
BulletStyle *mBulletS//子弹类型
int bulletN//当前子弹编号
#endif 实现文件:/**
*功能 管理子弹、切换不同的子弹
*作者 林炳文( 博客:http://blog.csdn.net/evankaka)
#include &HeroBulletLayer.h&
HeroBulletLayer::HeroBulletLayer(Node* heroPlane) {
this-&heroPlane = heroP
mBulletStyle = NULL;
bulletNumber = 1;
*创建子弹的静态方法
*@param heroPlane为英雄飞机
HeroBulletLayer* HeroBulletLayer::create(Node* heroPlane){
HeroBulletLayer* pRet = new HeroBulletLayer(heroPlane);
if (pRet&&pRet-&init()){
pRet-&autorelease();
pRet = NULL;
return NULL;
bool HeroBulletLayer::init() {
bool bRet =
CC_BREAK_IF(!Layer::init());
mBulletStyle = new HeroBulletOne();
mBulletStyle-&autorelease();
mBulletStyle-&createBullet(heroPlane);
this-&addChild(mBulletStyle);
} while (0);
*切换不同的子弹
*@param number 表示子弹的数目
void HeroBulletLayer::changeBullet(int number){
switch (number)
if (bulletNumber != 1){
this-&removeChild(mBulletStyle, true);
mBulletStyle = new HeroBulletOne();
bulletNumber = 1;
mBulletStyle-&createBullet(heroPlane);
mBulletStyle-&autorelease();
this-&addChild(mBulletStyle);
if (bulletNumber != 2){
this-&removeChild(mBulletStyle, true);
mBulletStyle = new HeroBulletTwo();
bulletNumber = 2;
mBulletStyle-&createBullet(heroPlane);
mBulletStyle-&autorelease();
this-&addChild(mBulletStyle);
if (bulletNumber != 3){
this-&removeChild(mBulletStyle, true);
mBulletStyle = new HeroBulletThree();
bulletNumber = 3;
mBulletStyle-&createBullet(heroPlane);
mBulletStyle-&autorelease();
this-&addChild(mBulletStyle);
2.6、调用方法&&& 游戏入口主文件 GameMain.h添加头文件
#include &HeroBulletLayer.h&//这是子弹管理的层&&& 增加变量:
HeroBulletLayer *mHeroBulletL&&& 然后是实现方法中GameMain.cpp的init()函数中增加//加子弹
mHeroBulletLayer = HeroBulletLayer::create(mHeroPlane);
this-&addChild(mHeroBulletLayer,1);注意mHeroPlane是你的英雄飞机类,是上文中可以跟随手指运动的手机,不懂看这里,这里还没写成单例模式的,后头会再来改!然后就是切换子弹啦:你只需要在要切换子弹的地方:发射一个子弹mHeroBulletLayer-&changeBullet(1);发射二个子弹mHeroBulletLayer-&changeBullet(2);发射三个子弹mHeroBulletLayer-&changeBullet(3);这里我为了测试,设置成每个5秒自动切换子弹类型:GameMain.h加个变量//表示当前子弹的类型GameMain.cpp中init()函数中增加://每隔5S改變一次子子彈類型
number = 1;
schedule(schedule_selector(GameMain::changeBullet),5.0f);下面是定时器的方法void GameMain::changeBullet(float dt){
if (number == 1){
mHeroBulletLayer-&changeBullet(2);
number = 2;
else if (number == 2){
mHeroBulletLayer-&changeBullet(3);
number = 3;
else if (number == 3)
mHeroBulletLayer-&changeBullet(1);
number = 1;
CCLOG(&CHANGE&);
}效果:这里它会自动每隔5s切换不同的子弹,由于上传图片的限制。只能这样了。三、总结&&& 是不是很方便呢?当我需要增加一个子弹类型时,我只需要继承BulletStyle.然后重写函数shootBullet(float dt) 即可。然后在需要更改子弹的位置bool HeroBulletLayer::changeBullet(int number)增加每4种子弹。第5种子弹......这样就增加了代码的复用性,而且很容易懂。也省去了一大堆的if-else判断。&&&&&& 原创作品。转载请注明出处
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1748023次
积分:18195
积分:18195
排名:第551名
原创:275篇
评论:1346条
阅读:51502
阅读:80663
文章:13篇
阅读:92153
文章:18篇
阅读:160254
文章:23篇
阅读:227364
(10)(10)(10)(1)(10)(4)(10)(10)(1)(6)(4)(6)(3)(12)(10)(11)(12)(14)(21)(28)(13)(16)(15)(4)(2)(13)(16)(2)(1)}

我要回帖

更多关于 魂斗罗雷电激光炮 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信