FPS游戏中用的最多的就是子弹了,这几天有不少人问我游戏中如何设计子弹?大量子弹显示的时候,游戏会不会卡?
今天有点时间,我针对这两个问题,简单的写了一个子弹的发射。
效果图:
首先我们来理下如何设计的思路。
一、首先一个简单的关系:子弹肯定是由武器发射的,武器是由人物操作的。
二、也就是说子弹Bullet类只负责创建一个新子弹、子弹的移动和子弹的消失、碰撞。
Bullet类提供给外界接口:增加一个新子弹(以及子弹的速度)。
三、武器weapon类给负责调用Bullet类创建一个新子弹。同时,weapon类也要负责计算发射子弹的速度,以及增加新子弹的时间间隔。
weapon类提供外界借口:开枪(发射子弹)。
四、人物类调用weap类的开枪接口。
OK,简单的整理了下(其实也挺简单的,是吧)。下面开始重要的实现,子弹的实现:
子弹bullet类的职能很单一,只负责创建一个新子弹、子弹的移动和子弹的消失、碰撞。
直接上代码吧:
Bullet.h
01 //
02 //  Bullet.h
03 //  FireDemo
04 //
05 //  Created by LiuYanghui on 13-2-4.
06 //
07 //
08  
09 #ifndef __FireDemo__Bullet__
10 #define __FireDemo__Bullet__
11  
12 #include "cocos2d.h"
13 USING_NS_CC;
14  
15 class Bullet : public CCLayer {
16 public:
17     Bullet();
18     ~Bullet();
19     CREATE_FUNC(Bullet);
20     virtual bool init();
21      
22     void addNewBullet();//增加一个新子弹
23      
24 private:
25     CCSize winSize;
26     CCArray* m_allBulletArray;//保存所有已存在的子弹对象
27      
28     CCSpriteBatchNode* m_bulletSprite;//使用BatchNode构建所有的子弹,减少gl绘画次数
29      
30     void initData();
31     void moveBullet(float dt);//移动子弹
32      
33 };
34  
35  
36 #endif /* defined(__FireDemo__Bullet__) */

Bullet.cpp
01 //
02 //  Bullet.cpp
03 //  FireDemo
04 //
05 //  Created by LiuYanghui on 13-2-4.
06 //
07 //
08  
09 #include "Bullet.h"
10  
11 #define MOVE_SPEED      100  //子弹的速度
12 #define REMOVE_POSY     -768 //子弹消失的位置,根据自己项目定
13  
14 Bullet::Bullet(){
15      
16 }
17  
18 Bullet::~Bullet(){
19     m_allBulletArray->release();
20 }
21  
22 bool Bullet::init(){
23     if (!CCLayer::init()) {
24         return false;
25     }
26     initData();
27     return true;
28 }
29  
30 void Bullet::initData(){
31     winSize = CCDirector::sharedDirector()->getWinSize();
32      
33     //创建对象数组,保存已存在的子弹
34     m_allBulletArray = CCArray::create();
35     m_allBulletArray->retain();
36      
37     //子弹贴图
38     m_bulletSprite = CCSpriteBatchNode::create("bullet.png");
39     m_bulletSprite->setPosition(CCPointZero);
40     addChild(m_bulletSprite);
41      
42     //更新子弹速度
43     schedule(schedule_selector(Bullet::moveBullet));
44 }
45  
46 //增加一个新子弹
47 void Bullet::addNewBullet(){
48     //构建一个子弹,添加到BatchNode中。
49     CCSprite* newBullet = CCSprite::createWithTexture(m_bulletSprite->getTexture());
50     newBullet->setPosition(CCPointZero);
51     m_bulletSprite->addChild(newBullet);
52      
53     //添加子弹到已存在子弹数组
54     m_allBulletArray->addObject(newBullet);
55 }
56  
57 //移动子弹
58 void Bullet::moveBullet(float dt){
59     //遍历更新每个子弹的位置
60     for (int i = 0; i < m_allBulletArray->count(); ++i) {
61         //获取一个子弹对象
62         CCSprite* bullet = (CCSprite*)m_allBulletArray->objectAtIndex(i);
63          
64         //更新位置
65         bullet->setPositionY(bullet->getPositionY()-MOVE_SPEED*dt);
66          
67         //如果已到达消失位置,就移除该子弹
68         if (bullet->getPositionY() <= REMOVE_POSY) {
69             m_allBulletArray->removeObjectAtIndex(i);
70             m_bulletSprite->removeChild(bullet, true);
71         }
72     }
73 }

子弹生成了,现在写个简单的调用场景吧。
GameScene.h
01 //
02 //  GameScene.h
03 //  FireDemo
04 //
05 //  Created by LiuYanghui on 13-2-4.
06 //
07 //
08  
09 #ifndef __FireDemo__GameScene__
10 #define __FireDemo__GameScene__
11  
12 #include "cocos2d.h"
13 USING_NS_CC;
14  
15 class Bullet;
16 class GameScene : public CCLayer {
17 public:
18     GameScene();
19     ~GameScene();
20     CREATE_FUNC(GameScene);
21     static CCScene* scene();
22     virtual bool init();
23     virtual void registerWithTouchDispatcher(void);
24     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
25     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
26     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
27     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
28      
29 private:
30     CCSize winSize;
31     Bullet* m_bullet;
32     void initData();
33      
34 };
35  
36 #endif /* defined(__FireDemo__GameScene__) */

GameScene.cpp
view sourceprint?
01 //
02 //  GameScene.cpp
03 //  FireDemo
04 //
05 //  Created by LiuYanghui on 13-2-4.
06 //
07 //
08  
09 #include "GameScene.h"
10 #include "Bullet.h"
11  
12 GameScene::GameScene(){
13      
14 }
15  
16 GameScene::~GameScene(){
17      
18 }
19  
20 CCScene* GameScene::scene(){
21     CCScene* scene = CCScene::create();
22     GameScene* layer = GameScene::create();
23     scene->addChild(layer);
24     return scene;
25 }
26  
27 bool GameScene::init(){
28     if (!CCLayer::init()) {
29         return false;
30     }
31     initData();
32     return true;
33 }
34  
35 void GameScene::initData(){
36     winSize = CCDirector::sharedDirector()->getWinSize();
37      
38     CCSprite* mainBg = CCSprite::create("bg.jpg");
39     mainBg->setPosition(ccp(winSize.width*.5,winSize.height*.5));
40     addChild(mainBg);
41      
42     CCSprite* tank = CCSprite::create("tank.png");
43     tank->setPosition(ccp(winSize.width*.5,winSize.height*.8));
44     addChild(tank);
45      
46     //创建子弹对象
47     m_bullet = Bullet::create();
48     m_bullet->setPosition(winSize.width*.5,winSize.height*.8);
49     addChild(m_bullet);
50      
51     setTouchEnabled(true);
52 }
53  
54  
55  
56 void GameScene::registerWithTouchDispatcher(void){
57     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
58 }
59  
60 bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
61 {
62     //每次点击添加一个新子弹
63     m_bullet->addNewBullet();
64     return true;
65 }
66  
67 void GameScene::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
68 {
69  
70 }
71  
72 void GameScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
73 {
74  
75 }
76  
77 void GameScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
78 {
79  
80 }

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

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

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

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=379 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. linux 结构体 struct addrinfo 简介
  2. 初等数论--原根--阶的计算
  3. linux下使用c进行线程操作
  4. windows php apc 安装,php-apc 安装
  5. 运行Java应用必须通过main()方法吗?
  6. 小巧的KML文件生成工具KML Generator
  7. gradle下载很慢的解决方式
  8. 浏览器上网的一些原理
  9. T400换风扇解决开机fan error问题
  10. C#用NPOI控件把MySQL数据库中查询符合条件的数据导出到EXCEL
  11. 统计|(可/无)重复双因素方差分析一般步骤及分析表
  12. Ch6 深度前馈神经网络
  13. 用ps制作android日历步骤,绘制一枚日历图标【PS教程】
  14. 抽丝剥茧,C#面向对象快速上手
  15. 【机房】软件需求说明书
  16. echarts 主副标题不换行
  17. 一款基于flask框架的音乐网站
  18. “互联网 +”在智慧环保上的深度应用
  19. 计算机专业的校本教材,计算机专业校本教材编方案(新)
  20. 七年级上册计算机工作总结,新人教版七年级上教学工作总结

热门文章

  1. 阵列信号DOA估计系列(一).概述
  2. 老毛桃winpe官网
  3. innodb buffer pool管理--free list
  4. 如何理解类与对象、继承
  5. 债市下跌是股票的错?
  6. luoguP3799 妖梦拼木棒
  7. python总结(全面讲解)
  8. B站兄弟连Linux视频笔记
  9. MyBatis报Invalid bound statement (not found)错误
  10. LS1021A 调试问题记录