`
252190908
  • 浏览: 228340 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

猴子原创,欢迎转载。转载请注明:转载自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引擎的介绍 1 1.1 何为游戏引擎 1 1.1.1 游戏的核心—引擎 1 1.1.2 引擎的特点 2 1.1.3 知名的引擎介绍 4 1.1.4 引擎的分类 5 1.2 Cocos2D-X引擎的来历 8 1.3 引擎的版本 9 1.4 下载与安装 10 1.5 ...

    项目实战_游戏编程超级玛丽(基于Cocos2d-x技术实现)60讲(视频+代码+课件全套)

    原价值1280元的项目实战_游戏编程超级玛丽(基于Cocos2d-x技术实现)课程,本系列课程分为四个实战项目: 1、&lt;打飞机&gt;:在还原微信《打飞机》的基础上,增加了道具,选择飞机,敌人射击等等更丰富的玩法。 2、&lt;宝石...

    cocos2d-x 自学文档

    一、运动中的加速度 二、拖动间隐效果(比如子弹的运动轨迹) 三、图形绘制 ...cocos2d-x中的CCArray使用注意 十一、屏幕旋转,schedule 和系统语言(后面再看) 十二、音乐音效 十三、CCRenderTexture

    Star Fighter源码(cocos2d x 2.0.4+VS2010)

    SimpleGame是官方下载的cocos2d-2.0-x-2.0.4安装软件解压缩后可以看到的该例子,即在根目录下的Samples示例文件夹里面的SimpleGame。 我这里只是把他们横版的游戏,变成竖版,取消白色游戏背景改为用图片背景,而...

    cocos2d-xna 写的一个小游戏demo坦克大战

    最近看到网上介绍cocos2d的资料很多,看了看cocos2d也支持wp7,下载了个 Cocos2d-XNA 安装包,写个小例子玩玩,熟悉下cocos2d 程序很简单,就一个入门级的小游戏,写完后放手机里运行了下效果还可以 开发环境 vs2010,...

    cocos2d制作类似雷电游戏中飞机的激光子弹效果源码

    cocos2d制作类似雷电游戏中飞机的激光子弹效果,可以弯曲。

    毕业设计飞机大战源码下载-plane:使用Cocos2d-x引擎c++语言制作的飞行射击类游戏。shootinggame!

    本游戏主要是以Cocos2d-x为游戏引擎,以C++高级程序语言为编程语言,在Windows 8.1操作系统下使用Microsoft Visual Studio 2013、Eclipse等工具开发并最终移植到Android手机平台上。 下面是本游戏的游戏画面(动态图)...

    OPhone平台2D游戏引擎实现——物理引擎

    碰撞检测通常是游戏开发的难点,作为引擎必然少不了碰撞检测部分,这里我们还是按照cocos2d的构架,使用Box2d作为物理引擎,下面我们将通过在Ophone平台实现一个小游戏,来对Box2d物理引擎进行学习。  Box2d  ...

    html5 小游戏 demo

    html5 挺火,写个html5游戏玩玩吧,想起cocos2d 貌似各个平台都有,网上找了找,下载了个Cocos2d-html5引擎包。 貌似另一个开源引擎lufylegend.js也很好,下次用用lufylegend.js试试。 开发环境 chrome Cocos2d-...

    基于Cocos creator 实现坦克大战小游戏【100010131】

    (3)音乐音效设置:玩家可以在游戏启动后,进行音乐音效的设置,游戏过程中,例如射击子弹或者移动,使用道具等都有相对应的音效。 (4)排行榜积分:游戏过程结束后有排行榜显示,可以展示玩家的积分和排名情况。 ...

    雷电游戏的激光子弹(iPhone源代码)

     利用cocos2d制作出雷电游戏中飞机的激光子弹效果。 作者说:希望有更好的想法的童鞋给点建议 多谢多谢。邮件联系:backjy@ 小编注:感谢作者@backjy_370892 分享代码于Code4App。 Code4App编译测试,适用环境:...

    游戏音效编辑器

    该工具可以制作游戏中使用的跳跃、子弹发射、爆炸等音效

Global site tag (gtag.js) - Google Analytics