猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=379

FPS游戏中用的最多的就是子弹了,这几天有不少人问我游戏中如何设计子弹?大量子弹显示的时候,游戏会不会卡?

今天有点时间,我针对这两个问题,简单的写了一个子弹的发射。

效果图:

首先我们来理下如何设计的思路。

一、首先一个简单的关系:子弹肯定是由武器发射的,武器是由人物操作的。

二、也就是说子弹Bullet类只负责创建一个新子弹、子弹的移动和子弹的消失、碰撞。

Bullet类提供给外界接口:增加一个新子弹(以及子弹的速度)。

三、武器weapon类给负责调用Bullet类创建一个新子弹。同时,weapon类也要负责计算发射子弹的速度,以及增加新子弹的时间间隔。

weapon类提供外界借口:开枪(发射子弹)。

四、人物类调用weap类的开枪接口。

OK,简单的整理了下(其实也挺简单的,是吧)。下面开始重要的实现,子弹的实现:

子弹bullet类的职能很单一,只负责创建一个新子弹、子弹的移动和子弹的消失、碰撞。

直接上代码吧:

Bullet.h//
//  Bullet.h
//  FireDemo
//
//  Created by LiuYanghui on 13-2-4.
//
//#ifndef __FireDemo__Bullet__
#define __FireDemo__Bullet__#include "cocos2d.h"
USING_NS_CC;class Bullet : public CCLayer {
public:Bullet();~Bullet();CREATE_FUNC(Bullet);virtual bool init();void addNewBullet();//增加一个新子弹private:CCSize winSize;CCArray* m_allBulletArray;//保存所有已存在的子弹对象CCSpriteBatchNode* m_bulletSprite;//使用BatchNode构建所有的子弹,减少gl绘画次数void initData();void moveBullet(float dt);//移动子弹};#endif /* defined(__FireDemo__Bullet__) */

Bullet.cpp

//
//  Bullet.cpp
//  FireDemo
//
//  Created by LiuYanghui on 13-2-4.
//
//#include "Bullet.h"#define MOVE_SPEED      100  //子弹的速度
#define REMOVE_POSY     -768 //子弹消失的位置,根据自己项目定Bullet::Bullet(){}Bullet::~Bullet(){m_allBulletArray->release();
}bool Bullet::init(){if (!CCLayer::init()) {return false;}initData();return true;
}void Bullet::initData(){winSize = CCDirector::sharedDirector()->getWinSize();//创建对象数组,保存已存在的子弹m_allBulletArray = CCArray::create();m_allBulletArray->retain();//子弹贴图m_bulletSprite = CCSpriteBatchNode::create("bullet.png");m_bulletSprite->setPosition(CCPointZero);addChild(m_bulletSprite);//更新子弹速度schedule(schedule_selector(Bullet::moveBullet));
}//增加一个新子弹
void Bullet::addNewBullet(){//构建一个子弹,添加到BatchNode中。CCSprite* newBullet = CCSprite::createWithTexture(m_bulletSprite->getTexture());newBullet->setPosition(CCPointZero);m_bulletSprite->addChild(newBullet);//添加子弹到已存在子弹数组m_allBulletArray->addObject(newBullet);
}//移动子弹
void Bullet::moveBullet(float dt){//遍历更新每个子弹的位置for (int i = 0; i < m_allBulletArray->count(); ++i) {//获取一个子弹对象CCSprite* bullet = (CCSprite*)m_allBulletArray->objectAtIndex(i);//更新位置bullet->setPositionY(bullet->getPositionY()-MOVE_SPEED*dt);//如果已到达消失位置,就移除该子弹if (bullet->getPositionY() <= REMOVE_POSY) {m_allBulletArray->removeObjectAtIndex(i);m_bulletSprite->removeChild(bullet, true);}}
}

子弹生成了,现在写个简单的调用场景吧。

GameScene.h

//
//  GameScene.h
//  FireDemo
//
//  Created by LiuYanghui on 13-2-4.
//
//#ifndef __FireDemo__GameScene__
#define __FireDemo__GameScene__#include "cocos2d.h"
USING_NS_CC;class Bullet;
class GameScene : public CCLayer {
public:GameScene();~GameScene();CREATE_FUNC(GameScene);static CCScene* scene();virtual bool init();virtual void registerWithTouchDispatcher(void);virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);private:CCSize winSize;Bullet* m_bullet;void initData();};#endif /* defined(__FireDemo__GameScene__) */

GameScene.cpp

//
//  GameScene.cpp
//  FireDemo
//
//  Created by LiuYanghui on 13-2-4.
//
//#include "GameScene.h"
#include "Bullet.h"GameScene::GameScene(){}GameScene::~GameScene(){}CCScene* GameScene::scene(){CCScene* scene = CCScene::create();GameScene* layer = GameScene::create();scene->addChild(layer);return scene;
}bool GameScene::init(){if (!CCLayer::init()) {return false;}initData();return true;
}void GameScene::initData(){winSize = CCDirector::sharedDirector()->getWinSize();CCSprite* mainBg = CCSprite::create("bg.jpg");mainBg->setPosition(ccp(winSize.width*.5,winSize.height*.5));addChild(mainBg);CCSprite* tank = CCSprite::create("tank.png");tank->setPosition(ccp(winSize.width*.5,winSize.height*.8));addChild(tank);//创建子弹对象m_bullet = Bullet::create();m_bullet->setPosition(winSize.width*.5,winSize.height*.8);addChild(m_bullet);setTouchEnabled(true);
}void GameScene::registerWithTouchDispatcher(void){CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{//每次点击添加一个新子弹m_bullet->addNewBullet();return true;
}void GameScene::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{}void GameScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{}void GameScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
{}

好了,一个简单的点击屏幕发射子弹就出来了。这里只是提供了一个思路,具体的开发就自己去做了。

Cocos2d-x 游戏中子弹的设计(一)相关推荐

  1. Cocos2d-x 游戏中子弹的设计 (一)

    FPS游戏中用的最多的就是子弹了,这几天有不少人问我游戏中如何设计子弹?大量子弹显示的时候,游戏会不会卡? 今天有点时间,我针对这两个问题,简单的写了一个子弹的发射. 效果图: 首先我们来理下如何设计 ...

  2. Cocos2d-x 游戏中子弹的设计

    FPS游戏中用的最多的就是子弹了,这几天有不少人问我游戏中如何设计子弹?大量子弹显示的时候,游戏会不会卡? 今天有点时间,我针对这两个问题,简单的写了一个子弹的发射. 效果图: 首先我们来理下如何设计 ...

  3. iOS cocos2d 2游戏开发实战(第3版)---你的第一个游戏!

    2019独角兽企业重金招聘Python工程师标准>>> 随着苹果公司不断地创新与发展,新的iPhone 5.iPad 4以及iPad mini产品相继问世,包括iOS与Xcode在内 ...

  4. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比(一家之言)

    初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 发布于:2013-07-18 11:00阅读数:1984 ...

  5. iOS cocos2d 2游戏开发实战(第3版)

    <iOS cocos2d 2游戏开发实战(第3版)> 基本信息 原书名:Learn cocos2d 2: Game Development for iOS 作者: (美)Steffen I ...

  6. 网络斗地主游戏的完整设计与实现(二)系统的核心技术路线

    引言 在前面的文章<网络斗地主游戏的完整设计与实现(一)项目的基本结构>介绍了项目的整体结构.接下来说明一下系统中用到的核心技术路线 项目的源码可在CSDN资源中下载 游戏界面的呈现 斗地 ...

  7. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比

    前言 iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上.一直负责硬件工业设计的Jony Ive首次全面负责苹果的软件和硬件设计工作,自然要把他自己的设计 ...

  8. 【3D游戏编程与设计】四 游戏对象与图形基础 : 构建游戏场景+牧师与魔鬼 动作分离版

    [3D游戏编程与设计]四 游戏对象与图形基础 : 构建游戏场景+牧师与魔鬼 动作分离版 基本操作演练 下载 Fantasy Skybox FREE, 构建自己的游戏场景 下载 Fantasy Skyb ...

  9. 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版)

    3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 文章目录 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 1.作业要求 2.游戏制作 ① 设计思路 ② 设计代码 一.Actio ...

最新文章

  1. mysql 主主同步失败_Mysql主主同步失败后的恢复
  2. 读《大型网站技术架构:核心原理与案例分析》第一章:大型网站架构演化
  3. 如何用python“优雅的”调用有道翻译
  4. JQuery $作用
  5. java合并list_java合并list方法代码实例
  6. mysql semi sync_MySQL Semisync
  7. svn提示没有设置冲突_svn代码冲突,不能提交的解决方法
  8. mysql 字典表设计_字典表设计
  9. Windows10 查看电脑关机时间(提交忘记打卡申请必备)
  10. android烧写固定MAC,小系统SN号和MAC地址快速烧录的方法与流程
  11. (ONENET+阿里云+datav+node+js+MYSQL+STM32)基于ONENET的大数据可视化平台搭建
  12. 2022吴恩达机器学习课程学习笔记(第二课第一周)
  13. 【汇正财经】股票开盘价收盘价是什么?最高价和最低价呢?
  14. vue电商后台管理系统--订单管理篇
  15. 如何让novnc/websockify支持tls1.2 (by quqi99)
  16. 协同办公OA项目:搭建“自定义”OA办公系统,原来就这么简单!
  17. Java程序初始化启动自动执行的三种方法
  18. AHB-SRAM简单设计之 顶层模块sram_top.v
  19. IEEE39+比利时20天然气节点+热网6节点的电气热综合能源系统,包含了CHP、EB、燃气轮机等
  20. 3GPP TS 23501-g51 中英文对照 | 5.3.2 Registration Management

热门文章

  1. python 创建画板_OpenCV +Python 制作画板
  2. 大学综评自招面试 计算机专业,【荔枝高校大会】自招综评面试6月16日扎堆举行,这些准备工作要做好!...
  3. 【学习笔记】《深入浅出Pandas》第17章:Pandas实战案例
  4. 使用HttpParser类解析网页
  5. java获取拼音_java获取中文拼音
  6. html输入日期算出星座,通过日期计算星座
  7. Unity中初步使用Navmesh寻路系统
  8. 一个二维码通吃 android , ios 下载
  9. python出现warning_Python warning警告出现的原因及忽略方法
  10. 形式逻辑(05)假言判断 和 推理