转自:http://www.cnblogs.com/hll2008/p/4266776.html

一、前提:

完成前一篇的内容。

具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇

二、本篇目标:

l 说说游戏中各种角色的动作、属性以及重构思路

l 进行代码重构让色狼大叔和女主角生动鲜活起来

三、内容:

l说说游戏中各种角色的动作、属性以及重构思路

通过前两篇我们建立的一个简陋的游戏原型,但是游戏中的人物比如色狼大叔、女主角都看去来很呆板不够鲜活,比如色狼会沿着道路移动,那这个只能说是移动根本不像是在走路,没有走的动作感觉就是沿着道路在漂移,女主角也是一动不动的站那里。这样的游戏很没有乐趣,所以需要给这些游戏角色加入动作和表情,让人看去来他们是鲜活的,对这些角色进行一下简单的动画以及属性分析如下:

色狼大叔的动画:

1、 静止动画:游戏刚开始处于静止状态

2、 走路动画:沿着道路走

3、 死亡动画:当子弹击中血量消耗完时死亡消失

色狼大叔的属性:

1、 是否运动:色狼是否处于激活沿着道路行走

2、 是否死亡:是否被炮塔打死

3、 行走速度:不同色狼的行走速度不同

4、 色狼血量:不同色狼血量不同

5、 行走:沿着道路行走

女主角的动画:

2、 卖萌动画:不能像木头似的,就加点表情动作

3、 死亡动画:当纯洁值被色狼玷污光了就死亡了

女主角的属性:

1、 女主角贞洁值:相当于生命值

根据上面的分析我们把每个角色拆分成动画显示和业务属性逻辑两个部分,对色狼和女主角进行代码重构。

重构后大概结构如上图:

Actionsprite:属于CCSprite类,负责游戏角色精灵的动画显示,Luoli(萝莉)、DaShu(大叔)、JiaoShou(叫兽)等角色精灵均继承自Actionsprite,都属于动画显示类。

Luoli(萝莉):属Actionsprite的子类,负责女主角的动画效果展示。

DaShu(大叔):属Actionsprite的子类,负责大叔色狼的动画效果展示。

JiaoShou (叫兽):属Actionsprite的子类,负责叫兽色狼的动画效果展示。

Selang(色狼):属于CCNode类,负责色狼的行走、血量、速度、攻击等具体的业务,每个Selang都包含一个DaShu(大叔)或JiaoShou(叫兽)类的游戏精灵。并且具备最重要的行为实现沿着道路行走。

Girl(女孩):属于CCNode类,负责女主角的血量等具体的业务,每个Girl都包含一个Luoli类的游戏精灵。

l进行代码重构让色狼大叔和女主角生动鲜活起来

打开项目工程按照上面的思路重点对色狼和女主角的代码实现进行重构。

色狼大叔代码重构

第一步:

新建Actionsprite.h、Actionsprite.cpp类(角色动画类),这个类继承自CCSprite负责游戏角色的动画效果显示,色狼和女孩都会是这个类的子类。

Actionsprite.h代码:

//声明一个动作状态的枚举类型
typedef enum _ActionState{
    kActionStateNone = 0,无状态
    kActionStateIdle,0); line-height:1.5!important">静止状态
    kActionStateWalk,0); line-height:1.5!important">行走状态
    kActionStateDeath 死亡状态
}ActionState;

class Actionsprite: public cocos2d::CCSprite
{
public:
    Actionsprite(void);
    ~Actionsprite(void);
    静止
    void idle();
    死亡
    void death();
    行走
    void walk();
    价格
    CC_SYNTHESIZE(int,_price,Price);
    生命值
    CC_SYNTHESIZE(float,_hp,HP);
    静止状态动作
    CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_idleAction,IdleAction);
    死亡状态动作
    CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_deathAction,DeathAction);
    行走状态动作
    CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_walkAction,WalkAction);
    当前动作状态
    CC_SYNTHESIZE(ActionState,_actionState,ActionState);
    行走速度
    CC_SYNTHESIZE(伤害值
    CC_SYNTHESIZE(damage,damage);
    金钱
    CC_SYNTHESIZE(是否有光环
    CC_SYNTHESIZE(bool,_halo,Halo);
    
};

Actionsprite.cpp代码:

Actionsprite::Actionsprite(void)
{
    _price=0;
    _idleAction=NULL;
    _walkAction=NULL;
    _deathAction=NULL;
}

Actionsprite::~Actionsprite(void)
{
    释放内存
    CC_SAFE_RELEASE_NULL(_idleAction);
    CC_SAFE_RELEASE_NULL(_deathAction);
    CC_SAFE_RELEASE_NULL(_walkAction);
}

设置精灵为静止状态
void Actionsprite::idle()
{
    if (_actionState != kActionStateIdle)
    {
        先停止所有动作
        this->stopAllActions();
        运行静止动作
        this->runAction(_idleAction);
        _actionState=kActionStateIdle;
    }
}

设置精灵为行走状态
void Actionsprite::walk()
{
    if (_actionState != kActionStateWalk)
    {
        运行行走动作
        this->runAction(_walkAction);
        _actionState=kActionStateWalk;
    }

}

设置精灵为死亡状态
void Actionsprite::death()
{
    先停止所有动作
    this->stopAllActions();
    this->runAction(_deathAction);
    _actionState=kActionStateDeath;
}

第二步:

素材准备,设计2张大叔不同动作的图片,交替显示模拟色狼行走动画,完成后把图片拷贝到Resources的iphonehd文件夹中,为了适应小分辨率的手机把这个2张图片按比例缩小一半并且拷贝到Resources的iphone文件夹中。

第三步:

新建DaShu.h、DaShu.cpp类(色狼大叔动画类),这个类继承自上面的Actionsprite负责游戏色狼大叔的动画效果显示。

DaShu.h:

class DaShu : public Actionsprite { public: DaShu(void); ~DaShu(void); CREATE_FUNC(DaShu); 初始化方法 bool init(); 设置光环,拥有光环的色狼生命值加倍 void setHalo(bool halo); };

DaShu.cpp:

bool DaShu::init() { bool bRet=false; do { CC_BREAK_IF(!Actionsprite::initWithFile("dashu_2.png")); 设置静止状态动作 Vector<SpriteFrame *> idleFrames(1); SpriteFrame *frame1=SpriteFrame::create(",Rect(60,128); line-height:1.5!important">83)); idleFrames.pushBack(frame1); Animation *idleAnimation=Animation::createWithSpriteFrames(idleFrames,255); line-height:1.5!important">float(6.0 / 12.0)); this->setIdleAction(CCRepeatForever::create(CCAnimate::create(idleAnimation))); int i=0; 设置行走状态动作 Vector<SpriteFrame *> walkFrames(2); for (i=0;i<2;i++) { SpriteFrame *frame2=SpriteFrame::create(CCString::createWithFormat(dashu_%d.png1)->getCString(),128); line-height:1.5!important">83)); walkFrames.pushBack(frame2); } Animation *walkAnimation=Animation::createWithSpriteFrames(walkFrames,255); line-height:1.5!important">this->setWalkAction(CCRepeatForever::create(CCAnimate::create(walkAnimation))); 设置死亡状态动作 Vector<SpriteFrame *> deathFrames(1); SpriteFrame *frame3=SpriteFrame::create(83)); deathFrames.pushBack(frame3); Animation *deathAnimation=Animation::createWithSpriteFrames(deathFrames,255); line-height:1.5!important">this->setDeathAction(Animate::create(deathAnimation)); 设置攻击值 this->setdamage(1); 设置行走速度 this->setWalkSpeed(0.4f); 设置生命值 this->setHP(18); 设置金钱数 this->setMoney(1.0f/10.0f); bRet=true; } while (0); return bRet; } 设置光环 void DaShu::setHalo(bool halo) { if (halo) { 拥有光环后生命值加4倍 float h=this->getHP()*4.0f; this->setHP(h); } }

第四步:

新建Selang.h、Selang.cpp类(色狼类),这个类继承自CCNode游戏场景中的每一个色狼都有这个类产生,它肯定包含一个Actionsprite的色狼动画类,并且之前在MainScene.cpp的update方法中实现的色狼沿路行走代码也将转移到这个类的update方法中。

Selang.h:

#include cocos2d.h"
#include Waypoint.hGameMediator.hActionsprite.h"
class Selang : public cocos2d::CCNode
{
public:
    Selang(void);
    ~Selang(根据提供的spriteIndex实例化成不同的色狼
    static Selang* nodeWithType(int spriteIndex);
    bool initWithType(int spriteIndex,255); line-height:1.5!important">bool halo);
    激活色狼
    void doActivate(float dt);
    获取精灵Rect
    virtual cocos2d::Rect getRect();
    设置精灵是否激活
    void setActive(bool active);
    是否死亡
    bool isDie;
    void update(float delta);
    色狼精灵
    CC_SYNTHESIZE_RETAIN(Actionsprite*,_mySprite,MySprite);

private:
    精灵序号,为每种精灵编一个序号
    int _spriteIndex;
    GameMediator* m;
    当前精灵的位置
    cocos2d::Point myPosition;
    走路速度
    float walkingSpeed;
    开始路点
    Waypoint *beginningWaypoint;
    结束路点
    Waypoint *destinationWaypoint;
    是否激活
    bool active; 
    色狼高度
    float myHeight;
    两个点的碰撞检测
    bool collisionWithCircle(cocos2d::Point circlePoint,255); line-height:1.5!important">float radius,cocos2d::Point circlePointTwo,255); line-height:1.5!important">float radiusTwo);
};

Selang.cpp:

根据提供的spriteIndex实例化成不同的色狼 Selang* Selang::nodeWithType(int spriteIndex) { Selang* pRet=new Selang(); bool b=if (pRet && pRet->initWithType(spriteIndex,b)) { pRet->autorelease(); return pRet; } else { delete pRet; pRet=NULL; return NULL; } } 初始化方法 bool Selang::initWithType(do { 色狼类型index _spriteIndex=spriteIndex; // m = GameMediator::sharedMediator(); 不激活 active=false; 行走速度 walkingSpeed=0.2f; Actionsprite* sprite=NULL; if (spriteIndex==1)如果类型是1初始化成大叔色狼 { sprite=DaShu::create(); sprite->setHalo(halo); 设置速度 walkingSpeed=sprite->getWalkSpeed(); } this->setMySprite(sprite); 添加精灵到当前Selang中 this->addChild(_mySprite); 计算当前色狼精灵1/2高 myHeight=sprite->getTextureRect().size.height/2.0f; 获得路点集合中的最后一个点 Waypoint *waypoint=(Waypoint*)m->getWayPoints().back(); 设置为色狼出发点 beginningWaypoint=waypoint; 获取出发点的下个点为色狼目标点 destinationWaypoint=waypoint->getNextWaypoint(); 获得出发点坐标 Point pos=waypoint->getMyPosition(); 对坐标进行校正提供半个身位高度 pos.add(Vec2(0,myHeight)); 记录位置坐标 myPosition=pos; 设置精灵的初始坐标 _mySprite->setPosition(pos); 设置初始不可见 this->setVisible(false); 把当前色狼添加到游戏的MainScene场景中显示 m->getNowScene()->addChild(this); 启动定时器 this->scheduleUpdate(); bRet=0); void Selang::doActivate(float dt) { 激活色狼 active=true; 设置色狼可见 true); } 获取精灵Rect Rect Selang::getRect() { Rect rect =Rect(_mySprite->getPosition().x - _mySprite->getContentSize().width * 0.5f,_mySprite->getPosition().y - _mySprite->getContentSize().height* getContentSize().width,_mySprite->getContentSize().height); return rect; } 设置精灵是否激活 void Selang::setActive(bool aactive) { active=aactive; void Selang::update(float delta) { if (!active) { return; } Point destinationPos=destinationWaypoint->getMyPosition(); 提升色狼半个身位 destinationPos.add(Vec2(是否拐弯 if (this->collisionWithCircle(myPosition,128); line-height:1.5!important">1,destinationPos,128); line-height:1.5!important">1)) { if (destinationWaypoint->getNextWaypoint()) { 设置新的出发点和目标点 beginningWaypoint=destinationWaypoint; destinationWaypoint=destinationWaypoint->getNextWaypoint(); } } Point targetPoint=destinationWaypoint->getMyPosition(); 提升色狼半个身位 targetPoint.add(Vec2(float movementSpeed=walkingSpeed; 计算目标点的向量 Point normalized=Point(targetPoint.x-myPosition.x,targetPoint.y-myPosition.y).getnormalized(); 根据速度和向量分别计算x,y方式上的偏移值 float ox=normalized.x * walkingSpeed; float oy=normalized.y *walkingSpeed; 更新色狼移动后的位置 myPosition = Point(myPosition.x + ox,myPosition.y +oy); _mySprite->setPosition(myPosition); } 两个点的碰撞检测 bool Selang::collisionWithCircle(cocos2d::Point circlePoint,255); line-height:1.5!important">float radiusTwo) { float xdif = circlePoint.x - circlePointTwo.x; float ydif = circlePoint.y - circlePointTwo.y; 计算两点间的距离 float distance = sqrt(xdif * xdif + ydif * ydif); if(distance <= radius + radiusTwo) { return true; } false; }

第五步:

如果运行一下那么上面的代码中Waypoint *waypoint=(Waypoint*)m->getWayPoints().back();这行应该会报错,因为GameMediator中没有提供getWayPoints()这个方法,所以我们要对GameMediator类进行修改加上这个方法,代码如下:

void GameMediator::setWayPoints(cocos2d::Vector<Waypoint*> wayPoints) { _wayPoints=wayPoints; } Vector<Waypoint*> GameMediator::getWayPoints() { return _wayPoints; }

第六步:

在MainScene的init方法中把路点集合通过setWayPoints方法赋值给GameMediator,这样在Selang.cpp中就可以取到路点集合了:

……
this->wayPositions.pushBack(waypoint12);
GameMediator::sharedMediator()->setWayPoints(wayPositions);
……

第七步:

测试这个Selang类具体效果,先给MainScene添加一个void startGame(float delta)的方法,用这个方法开始游戏。

开始游戏 void MainScene::startGame(实例化一个大叔类型的色狼 Selang* selang=Selang::nodeWithType(1); 激活这个色狼 selang->setActive(true); 设置色狼动画为行走动画 selang->getMySprite()->walk(); 取消定时器方法,保证startGame只执行一次 this->unschedule(schedule_selector(MainScene::startGame)); }

第八步:

我们在MainScene的init方法末尾处调用这个startGame的方法:

0.5秒后调用startGame方法
this->schedule(schedule_selector(MainScene::startGame),128); line-height:1.5!important">0.5f);

到这里,把第一篇中临时添加色狼的代码删除,就可以运行测试游戏了,会看到色狼大叔一扭一扭的沿着道路靠近女主角。效果非常好,我们成功的对色狼的代码进行了重构。

女主角代码重构

素材准备,设计4张萝莉不同动作的图片,交替显示模拟萝莉卖萌动画,完成后把图片拷贝到Resources的iphonehd文件夹中,为了适应小分辨率的手机把这个4张图片按比例缩小一半并且拷贝到Resources的iphone文件夹中。

新建Luoli.h、Luoli.cpp类(女主角动画类),这个类继承自上面的Actionsprite负责游戏女主角的动画效果显示。

Luoli.h:

class Luoli : public: Luoli(void); ~Luoli(void); CREATE_FUNC(Luoli); bool init(); };

Luoli.cpp:

bool Luoli::init() { girl1_1.png")); 100,128); line-height:1.5!important">126)); idleFrames.pushBack(frame1); Animation *idleAnimation=Animation::createWithSpriteFrames(idleFrames,0); line-height:1.5!important">设置行走状态动作 int i; Vector<SpriteFrame *> walkFrames(4); 4;i++) { SpriteFrame *frame1=SpriteFrame::create(CCString::createWithFormat(girl1_%d.png126)); walkFrames.pushBack(frame1); } Animation *walkAnimation=Animation::createWithSpriteFrames(walkFrames,255); line-height:1.5!important">this->setWalkAction(CCRepeatForever::create(CCAnimate::create(walkAnimation))); bRet=true; } return bRet; }

新建Girl.h、Girl.cpp类(女孩类),这个类继承自CCNode游戏场景中的女主角由这个类产生,它肯定包含一个Actionsprite的萝莉动画类。

Girl.h:

class Girl : public: Girl(void); ~Girl(void); 根据提供的type实例化成不同的女主角 static Girl* nodeWithType(int type); bool initWithLocation(cocos2d::Point location); 获取精灵Rect cocos2d::Rect getRect(); 萝莉精灵 CC_SYNTHESIZE_RETAIN(Actionsprite*,MySprite); };

Girl.cpp:

根据提供的type实例化成不同的女主角 Girl* Girl::nodeWithType(int type) { Girl* pRet=new Girl(); GameMediator* m = GameMediator::sharedMediator(); Waypoint *waypoint=(Waypoint*)m->getWayPoints().front(); Point pos=waypoint->getMyPosition(); if (pRet && pRet->initWithLocation(pos)) { pRet->autorelease(); false; } } bool Girl::initWithLocation(cocos2d::Point location) { 实例化一个萝莉 Actionsprite *sprite= Luoli::create(); 添加精灵到当前Gril中 this->addChild(sprite); 设置为静止 sprite->idle(); 计算当前萝莉精灵1/2高 int myHeight=sprite->getTextureRect().size.height/对坐标进行校正提供半个身位高度 location.add(Vec2(setPosition(location); 把当前女主角添加到游戏的MainScene场景中显示 GameMediator* m = GameMediator::sharedMediator(); m->getNowScene()->addChild(this,128); line-height:1.5!important">10000); bRet=return bRet; } Rect Girl::getRect() { Rect rect = Rect(_mySprite->getPosition().x - _mySprite->getContentSize().width * 0.5f+20,_mySprite->getContentSize().height-40); return rect; }

在MainScene的 startGame(float delta)的方法中加上初始化女主角的代码。

……
初始一个女主角
    Girl* girl=Girl::nodeWithType(设置女主角动画为卖萌动画
    girl->getMySprite()->walk();
    this->unschedule(schedule_selector(MainScene::startGame));

到这里,把第一篇中临时添加女主角的代码删除,就可以运行测试游戏了,本篇的任务到此为止,本篇完成后android真机的运行效果如下:

结束语:

这个塔防游戏系列已经写了3篇了,到现在为止还没有出现炮塔,说好的炮塔呢?请期待下一篇炮塔姑娘的保护神~

作者交流QQ:2303452599

邮箱:mymoney1001@126.com

Cocos2d-x3.x塔防游戏保卫萝卜从零开始(三)的更多相关文章

  1. Canvas实现贝赛尔曲线轨迹动画的示例代码

    这篇文章主要介绍了Canvas实现贝赛尔曲线轨迹动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 直播疯狂点赞动画实现代码 附源码

    为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞动作通常无限次,引导用户疯狂点赞,今天小编给大家分享HTML5 直播疯狂点赞动画实现代码 附源码,感兴趣的朋友一起看看吧

  3. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  4. 基于canvas的骨骼动画的示例代码

    这篇文章主要介绍了基于canvas的骨骼动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. 基于HTML5+Webkit实现树叶飘落动画

    本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧

  7. Html5页面内使用JSON动画的实现

    这篇文章主要介绍了Html5页面内使用JSON动画的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5实现图片转圈的动画效果——让页面动起来

    这篇文章主要介绍了html5实现图片转圈的动画效果——让页面动起来的相关资料,需要的朋友可以参考下

  9. 基于 HTML5 WebGL 实现的医疗物流系统

    物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。这篇文章给大家介绍基于 HTML5 WebGL 实现的医疗物流系统,感兴趣的朋友跟随小编一起看看吧

  10. ios – 围绕其中心点旋转UIImageView?

    我在UIImageView中有一个透明的png,我想围绕它的中心点旋转.代码应该非常简单:图像以正确的速度/时间和直角旋转,但其位置会发生偏移.这是一个正在发生的事情的例子:灰色方块只是为了在屏幕上显示位置.透明的png是另一个图.白色虚线显示UIImageView的中心.图像的左侧显示图像的原始位置,右侧显示使用上述代码旋转后的图像.黑色和白色圆圈位于图像文件的中心.有什么东西我不见了吗?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部