基于cocos2d-x的跑酷游戏入门(1) 项目名称:基于cocos2d-x的跑酷游戏入门
项目难度:★ 项目内容:基于cocos2d-x的简易跑酷游戏,熟悉跑酷游戏的基本业务逻辑,熟悉cocos2d-x的开发环境和常用API 项目教程
Chatper 1 cocos2d-x环境搭建 1.cocos2d-x支持vs2010,2012 那么这两个软件的搭建都很简单 2.配置python,cocos2d-x从2.15之后为了增强移植性,取消了VS模板,改用python创建 3.强烈建议使用python2.75的版本,不同的python版本可能导致程序运行出错。 4.在path环境变量中加入python变量,我的电脑→右键→属性→高级→环境变量→系统变量→path→加入你的python安装目录。测试一下:进入cmd,输入python,如果没有提示“不是外部或内部命令”,说明搭建成功
4.创建项目,进入cocos2d-x-2.20\tools\project-creator目录,可以在CMD下执行以下命令 python create_project.py -project Test -package com.jacky.test -language cpp//其中Test为工程名称,com.jacky.test为包名,-language后面跟上你要使用的开发语言 5.创建批处理文件.bat @echo off @echo cocos2d-x 项目快捷创建方式 set /p project=请输入项目名称: if "%project%"=="" goto inputError set /p package=请输入包标示名: if "%package%"=="" goto inputError set /p language =请输入语言名 /cpp/javascript/lua: if "%language%"=="" goto inputError create_project.py -project %project% -package %package% -language %language% pause exit :inputError @echo 项目名称或者包标示名不能为空! pause 将批处理文件放在cocos2d-x-2.20\tools\project-creator,每次创建项目,双击即可 6.项目文件在cocos2d-x-2.20\projects文件夹下面,里面包含了各个平台的项目,是哪一个平台直接点击运行即可
chatper 2 跑酷游戏基本逻辑设计 这个跑酷游戏逻辑比较简单,固定角色精灵在一个固定的位置,循环背景图,造成背景图运动,给人错觉为人物在跑动,在建立怪物类,怪物随机在地图外产生,然后向角色精灵方向移动,如果碰撞,主人公掉血,如果不碰撞,出场景消除,每秒加上跑动的分数。就是我们的基本逻辑,人物由两个按键控制跳跃和蹲下。 
基于cocos2d-x的跑酷游戏入门(2) chatper 3 类结构的设计 本项目类的结构较为简单,主要是角色和怪物的,主要场景为用户交互事件和业务逻辑,根据分析,我们可以建立这样几个类,来分别表示各个对象之间的关系 由于结构简单,我们首先构建一个基类来管理我们的角色,和怪物,为什么?因为角色和怪物都是精灵,都有共同属性。那就是具有节点和精灵贴图,所以我们可以构建这样一个基类来管理 class BasisEntity:public CCNode{ private: CCSprite* m_sprite; public: BasisEntity(); ~BasisEntity(); CCSprite* GetSprite();//得到一个精灵对象 void bindSprite(CCSprite* sprite);//绑定精灵对象到类 };解释一下我们为什么要继承CCNode类,而没有继承CCSprite类,很多人肯定会疑问,我们的角色怪物是精灵啊,为什么不是继承精灵类,而是节点类?比如就那角色这个类来说,我们的角色有怎样的属性,他可以跑可以跳,还能被挨打,被掉血,有血条等等的属性值,如果我们继承精灵类就变得不是非常方便,为什么我们有没有继承CCLayer类呢,因为CCLayer包含了很多不是精灵的属性和事件,当我们继承CCLayer随着功能的增加而类的结构也变得臃肿了,所以,一般情况下我们都是选择继承CCNode。 基类建立了就该建立我们的角色类(Role)和怪物类(monster) class Role:public BasisEntity{ public: Role(); ~Role(); virtual bool init(); CREATE_FUNC(Role); public: void RoleJumpUp(); void RoleJumpEnd(); void getRoleHp(); bool RoleCurrentState(); void RoleUpdata(); private: bool m_isJumping; int m_RoleHp; public: inline bool getJumpingState(){return m_isJumping;}
}; 角色类的基本结构就是这样,为什么这么定义呢? 分析一下角色的属性 ,角色需要能够跳跃,那么跳跃就有升起和落下两个阶段, 角色也需要有血量才能判断最后的胜利条件, 还需要一个函数去判断是否发生碰撞,如果发生碰撞那么就需要一个角色碰撞状态的检测 根据分析对象来写这样一个类的结构 根据类的结构来完成相应的操作就很简单了。 这个角色的属性和方法,那么怪物的属性和方法我们也可以用同样的方法去完成 class monster :public BasisEntity{ public: monster(); ~monster(); virtual bool init; void MonsterUpdata(); void createMonster(); CREATE_FUNC(monster); public: void removeMonster(); void resetMonster(); void ActiveMonster(); bool isAlive(){return m_isAlive} private: bool m_isAlive; CCArray * m_MonsterArr; }; 由于怪物很多,我们直接用CCArray的数组来进行直接管理,如果是活着的就让怪物执行活着的动作,比如走路的动画,如果死了,那就直接不显示,然后从数组中移除掉
基于cocos2d-x的跑酷游戏入门(3) 我们在上面规划了类的结构,下面就该完成 实现和组合 从 BasisEntity开始一步一步完成功能 class BasisEntity:public CCNode{ private: CCSprite* m_sprite; public: BasisEntity(); ~BasisEntity(); CCSprite* GetSprite();//得到一个精灵对象 void bindSprite(CCSprite* sprite);//绑定精灵对象到类 };
首先是实体基类,我们还是从功能上入手 实体基类里我们完成的无非就是对精灵的初始化,传入精灵。 BasisEntity.cpp
BasisEntity::BasisEntity() { m_sprite == NULL; } BasisEntity::~BasisEntity(){}
BasisEntity::GetSprite(){ return this->m_sprite; } void BasisEntity::bindSprite(CCSprite* sprite){ this->m_sprite = sprite; this->addChild(m_sprite); }
|