前情回顾 上一个博文我们提到象棋运动的函数dealWithChess,但是只是说该函数完成了棋子的选择和移动功能 其实在这个函数里,在移动棋子之前,是要对棋子的移动是否合法进行判断的,我们一起来看看如何对棋子进行判断的 判断移动规则入口 在dealWithChess中,关注如下代码,这个judgeAction就是判断棋子移动是否合法的入口了…
象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状态复位 开始:在开了[新局]之后,点击[开始]开始游戏,只有点击开始之后,才能移动棋子 悔棋:局面往后退一步 难度:该功能未实现 选中棋子 如果某个棋子选中,该棋子用绿色框围住,表示选中状态 移动棋子 当棋子被选中后,鼠标继续再点空地,如果符合规则,那么棋子就会移动到目标坐标 吃棋子 选中己方的棋子…
之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); #ifde…
上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main.cpp和工程文件 Resorces:代码中用到的资源 剩下三个文件我们不用,不解释了 classes目录: classes目录代码如上图 这里包含了一下代码文件,以cpp为例解释 WelCome.cpp:是欢迎页面的实现 AppDelegate.cpp:是app委托类,对cocos2dx应用程序的…
前情回顾 上个博客说道我们象棋程序进入了欢迎界面,在欢迎界面下等待一秒进入主界面 进入主界面的关键代码如下: CCScene* pScene = CCMainMenu::scene();  创建scene ... CCDirector::sharedDirector()->replaceScene(ps);  显示scene 最关键的是CCMainMenu::scene函数,说明后面要显示的scene类型是CCMainMenu类型的 所以接下来我们一起来看CCMainMenu是怎么回事 CCMa…
前情回顾 通过CCMainMenu的init函数,已经把所有的按钮,棋子都摆放完毕了,但是这个时候,棋子是不能走动的,只有在开始游戏之后才能移动棋子. 点击…
前情回顾 在之前的学习中,我们已经了解到,下棋主界面是由CCMainMenu类实现的,在它的init函数中,初始化了 主界面需要的各种数据,包括:创建控件,初始化32个棋子,初始化执行变量等等,在这个博文中,我们 主要来学习,32个棋子是如何被初始化并显示在界面上的.这个显示和initCoordinate以及 了解32个棋子显示在界面的目的,是为了让大家更好理解32个棋子的数据结构,这些数据结构在当棋子走动 时,需要改动,所以必须要理解. initCoordinate void CCMainMe…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-7/ 今天我们将完成我们第一个完整的游戏--打砖块.这次教程中,将展示怎样进行基本的碰撞检测和使用HTML5的本地存储.你可以使用鼠标和键盘来操作挡板,上一次游戏的持续时间和分数将会保存. 前一篇的的介绍在HTML5游戏开发系列教程6(译). 第一步:HTML <!DOCTYPE html> <html lang="en"> &l…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-6/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用canvas来进行HTML5游戏开发系列的文章.这次是个完整的游戏例子,再现一款经典的电脑游戏--坦克大战.我将教你们使用交替的数组地图(alternative array-maps),同时将说明如何检测活动对象(坦克)和周围环境之间的碰撞. 前一篇的的介绍在HTML5游戏开发系列教程5(译). 第一…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用canvas来进行HTML5游戏开发系列的文章.今天我准备音乐的例子(有点儿像音乐合成器),它用到了使用CSS3来制作的基于DOM的对话框.为什么我使用独立的对话框--简单,最主要是因为CSS有很多处理标准元素的文本和样式的方法,且它可以使JS的代码简单,同时能提升例子程序的速度.所以你可以对这些对话框应…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系列的文章,我们要学习下一个元素:精灵动画和基本的声音处理.在我们这个示例中,你将看见一直正在飞的龙,我们能一直听见它翅膀扇动的声音,当鼠标释放事件发生时还有龙咆哮的声音.最后我们将教会龙移动到鼠标按下处. 前一篇的的介绍在HTML5游戏开发系列教程3(译). 第一步:HTML index.html…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-8/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用canvas来进行HTML5游戏开发系列的文章.这次我将展示在你的项目中,如何使用Box2D的创建物体.Box2D是一个非常流行的开源物理引擎对于那些需要模拟2D物体的应用来说.在游戏开发中,2D物理引擎是个非常热门的话题.有了物理引擎的帮助,再设定环境和简单的规则,我们可以很容易的创建好玩的游戏.…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-10/ 最后我们将继续使用canvas来进行HTML5游戏开发系列的文章.今天我准备了一个新游戏--SkyWalker.这游戏基本上算是一个射击模拟类型的游戏(有飞机和敌人).我们的目标是到达终点线.该游戏有几个关键的特征:使用了精灵来处理飞机和爆炸,可以按下多个按键(比如你可以移动飞机的同时发射子弹),a certain level length,增强的碰撞检测…
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-9/ 今天我们将继续使用canvas来进行HTML5游戏开发系列的文章.这次我准备了一个新游戏,是基于第4篇的游戏,但是增加了火球,敌人和碰撞检测.故,我们的龙可以发射火球来杀死敌人,并且记录分数.这样该游戏就有更多的交互性. 之前的翻译文章可以点击这里:http://www.cnblogs.com/pigzhu/p/3234255.html 第一步:HTML 首…
cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程. Cocos2d-X是一个技持多平台的2D游戏引擎,使用C++开发,基于OpenGL ES, 支持WoPhone.iOS.Android.Windows等操作系统.Cocos2d-X主要是围绕跨平台, 快捷便携地开发移动端游戏.在平板及智能手机日趋成熟与充斥我们日常娱乐时间的趋势下, 移动端的游戏…
背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGameMap : public cocos2d::CCTMXTiledMap ,public CMReceiver { protected: enum { enTagMario = 998, //通过这个Tag查找Mario }; protected: CCArray *m_pArrayItems;…
背景 在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene 头文件 class CMGameScene : public cocos2d::CCLayer,public CMReceiver { public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* CreateGameScene(); pr…
在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡. 这个判断的代码在怪物类的检测函数实现中. 比如蘑菇怪的冲突检测函数: bool CMMonsterMushrooms::OnCollisionMario() { do { CCNode* pMushrooms = dynamic_cast<CCNode*>(getChildByTag(enTagMainNode)); CC_BREAK_IF(pMushrooms==NULL); //马里奥与蘑菇怪的…
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到appDelegate,在该类的重载函数applicationDidFinishLaunching函数中,程序进入CMMenuScene场景,我们顺藤摸瓜来学习CMMenuScene. 类定义头文件 class CMMenuScene : public cocos2d::CCLayerColor { private: bool…
前言 上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实现,并以一些篇幅来详细讲述遇到的具体问题和具体的类,由浅入深的学习cocos2dx. 程序效果图 在学习超级马里奥之前,我们依旧看看超级马里奥的程序运行之后的样子,以便获得感性认识.同学们可以到这里下载源代码(密码是c.itcast.cn),并用vs2010打开工程.如果你还不会怎么用vs2010打开cocos2dx工程,那么你需要先点击这里学习…
1.在上一篇中我们成功运行了HelloCpp和TestCpp工程,我们到目录cocos2d-x-2.2.1\Debug.win32下 查看生成的文件,在我电脑上绝对路径是H:\source\cocos2d-x-2.2.1\Debug.win32. 我们可以看到其中生成了很多文件,我们把其中所有的dll拷贝到系统目录中,如果是32位系统, 将dll拷贝到C:\Windows\System32,如果是64位系统就将dll拷贝到C:\Windows\SysWOW64 . 2.然后在cocos2d-x-…
在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等. 说起怪物的移动,首先在游戏里先要考虑怪物的抽象和设计. 在CMMonster.h中,有个类CMMonsterBasic,这个类抽象了所有的怪物,具体的怪物都是它的派生类,比如CMMonsterMushrooms蘑菇怪. CMMonsterBasic继承自CCNode和CMSender,所以怪物都是渲染对象,并且有消息发送功能. 怪物基本类的接口: virtual bool init(CCPoint ptMonsterPos,CMMar…
在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑,这个时候需要有一个机制,让马里奥通知地图对象,去处理这个游戏逻辑,这种通知机制,在cocos2dx中并没有提供.在马里奥游戏里,提供了这个机制,我认为值得好好学习. 一般说来,由于地图对象包含了所有的游戏元素,在面向对象设计时,地图类应该包容所有的游戏元素对象.由于游戏元素对象需要通知地图类,所以…
马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结果将会很难看. 卷动地图的原理在于,将地图的放在窗口的位置变化下.如下图所示…
在地图初始化好了之后,就开始移动马里奥吧,我在windows下,是使用键盘来移动马里奥的 w是跳,d是前进,a是后退,那么在程序里是怎么来获取这个按键的呢? 普通的windows程序,在按键之后,会有个win32消息发送到应用程序,但是cocos2dx里,没有用这个机制,而是在帧刷新函数中,主动去获取按键状态 根据状态来对马里奥进行处理. 帧刷新函数是在CMGameScene类中注册的,还记得CMGameScene么,它是游戏场景,但是游戏逻辑在它的子对象CMGameMap中…
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到在CCApplication::run()函数中,调用虚函数applicationDidFinishLaunching,将初始化的控制权留给开发者. 如何实现,为什么要这么实现呢? 如何实现:虚函数重载 实现的方法就是开发者从CCApplication继承一个类,这个类在创建工程模板生成的工程里叫做AppDelegate 这个A…
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 前景回顾 上一篇博文提到超级马里奥的游戏效果,大家是否已经搭建好环境,让马里奥运行起来呢? 代码结构 本文主要的目标是让大家粗略了解马里奥的代码结构,以方便后续的学习.…
上篇显示了控制手柄,但是还不能用来控制坦克, 这篇将会讲手柄和坦克的移动结合起来. 1.先在CityScene场景中实现场景的虚函数virtual void onEnter(); onEnter在进入场景后将会被调用,我们在onEnter中设置一个定时器, 游戏每一帧都调用次,这样我们可以在每帧中检测手柄按钮是否被按下, 然后控制坦克的移动,onEnter和update的函数实现如下: void CityScene::onEnter() { CCLayer::onEnter(); this->s…
上节课写了关卡选择场景,那么接下来写关卡内容,先写最基本的地图的加载 我们新建一个场景类,如下所示: class CityScene : public cocos2d::CCLayer { public: CityScene(); ~CityScene(); virtual bool init(); static cocos2d::CCScene *scene(); static cocos2d::CCScene *scene(int round); CREATE_FUNC(CityScene)…
上篇文章写了Paddle类来处理精灵的点击.触摸事件,现在我们在Paddle的基础上 写一个MyPaddle类,来处理上一关.下一关.开始游戏按钮的点击事件. 1.类声明如下: class MyPaddle : public Paddle { CC_SYNTHESIZE(enum_evt, m_evttyp, evttyp); CC_SYNTHESIZE(ChoiceScene*, m_pSence, pSence); public: MyPaddle(); ~MyPaddle(); virtu…