Cocos2dx教程专栏(一) 一切从一个游戏菜单开始:

学了cocos2dx不久,许多知识还是不是很懂,呵呵,至少cocos2dx的API函数没懂多少。但是这个时候就不要绝望,应该先做一个让自己可以小玩一下的游戏。
这个教程我把cocos2d中自带的打飞机游戏MoonWarriors(月球战士)这个游戏从js版转化为c++版,讲解如何制作一个2D游戏。
一切从一个游戏菜单开始。
(一)环境配置
我简单地说一下配置cocosdx文件:
1.从官网上下载coccs2dx,解压出来就是一个文件
2.下载vs2012
3.下载python,并且配置python环境变量,具体怎么配置参考以下的博文:
(二)创建游戏工程:
接下来要创建一个工程MyMoonWarriors:
1.依次打开cocos2d-x-2.2.2->tools->project-creator
2.在project-creator目录下按住shift+鼠标右键,选择在此处打开命令窗口,输入命令:

python create_project.py -project MyMoonWarriors-package org.MyMoonWarriors.game -language cpp
输入完以后,有如下效果就说明成功了:

这个时候工程文件的位置在cocos2d-x-2.2.2->projects->MyMoonWarriors
好!创建完文件以后就是迈向游戏制作的第一步!!
(三)创建游戏菜单:
1.放置资源文件:
当然,做游戏首先要有大量的图片资源,所以首先我们打开工程文件MyMoonWarriors的所在位置,会发现会如下的文件夹:选中Resources文件夹,把游戏需要的图片等资源都放置在这里

这个资源文件还是蛮难找的,找不到也没有关系,我把它上传了。请读者在这个链接下载资源文件,然后把它拷贝进去:
游戏资源
2.开始写代码:
依次打开MyMoonWarriors->proj.win32->MyMoonWarriors.sln(因为我们是在windows下写代码,所以上面那些 其他文件夹如proj.andorid、proj.ios等等不用管它,后面会慢慢讲)

打开后效果如上,我们要在最后一个写代码(上面那4个都是cocos2dx带的库文件,代码中经常要用到上面的API函数)
3.如何写代码:
打开MyMoonWarriors会发现我们不知如何下手,以前写的控制台程序对开发一个游戏来讲,简直是小巫见大巫,瞬间感觉以前多牛逼都是扯淡了。不过不要担忧,以前学的都是非常有用的。

首先,我们要记住C++面向对象的一个思想:先把功能写成一个个函数或者类,然后在main函数中调用这些功能函数或类等让代码生成程序运行起来!
在写游戏也是这样,我们大部分都是在Classes这个文件夹添加各种游戏类(比如主角,敌人,菜单类,主角管理,敌人管理等等),然后在win32中的main.cpp中调用这些游戏对象来运行

上面的这些经验对一个游戏开发初学者来说,都是十分宝贵的经验。接下来我们开始尝试创建一个游戏菜单,效果如下:

分析一下这个界面效果:很明显,它是一个由背景 logo 菜单项三个部分组成的一个菜单界面...
好,开始写代码:
1.创建一个类StartMenu:
创建方法是在工程文件夹里面创建StartMenu.cpp和StartMenu.h,然后拷贝复制到VS2012中的classes文件夹下(= =疑问来了,为什么不直接在VS2012下直接创建文件?我试过了,如果直接创建,在工程文件夹会显示不出来,所以只能用这样一个稍微复杂的方法,以后创建文件都这样创建)

2.在StartMenu.h中写如下功能类(代码我加了注释了,不懂的可以多看看或者手动度娘一下):
#ifndef __StartMenu_H__
#define __StartMenu_H__

class StartMenu:publiccocos2d::CCLayer
{
public :
staticcocos2d::CCScene *scene();//创建菜单场景
virtualboolinit();//初始化菜单类的成员变量
voidmenuCallback(CCObject *pSender);//回调函数,这个在点击菜单项的时候会用到回调机制,调用该函数
CREATE_FUNC( StartMenu);//这个函数有点麻烦,就暂时当作是一个自动释放内存的函数(很重要,教程一不会用到,后面慢慢讲)
private :

};
#endif // !__StartMenu_H__


//#ifndef __StartMenu_H__,#define __StartMenu_H__关于这个作用无非就是防止头文件的重复包含和编译
2.在写StartMenu.cpp之前 ,我们还要创建一个StdAfx.cpp和StdAfx.h用来把需要包含的类库都放在这个上面,代码很简单
StdAfx.h:
#include "cocos2d.h"//包含cocos2d类库

USING_NS_CC ; //使用cc命名空间


StdAfx.cpp:
#include "StdAfx.h"
3.开始写StartMenu.cpp:
#include "StdAfx.h"//记住,这个要写在第一个
#include "StartMenu.h"

CCScene * StartMenu::scene()
{
CCScene*scene=CCScene::create();

StartMenu*layer=StartMenu::create();
scene->addChild(layer);

returnscene;
}
bool StartMenu::init()
{
if(!CCLayer::init())
{
returnfalse;
}

CCDirector*pDirector=CCDirector::sharedDirector();//创建一个导演类,用来调用整个场景所需要的变量,比如窗口大小
CCSizewinSize=pDirector->getWinSize();//通过导演类获得窗口的大小

CCSprite*pLoadingImg =CCSprite::create("loading.png");//创建一个精灵类,来存放一张背景图片
pLoadingImg->setPosition( ccp(winSize.width / 2,winSize.height / 2));//图片放在正中央
this->addChild(pLoadingImg);//场景添加图片
returntrue;
}
//1.菜单是一个场景,场景要有一个导演来调度资源的排布
//2.精灵类在cocos2d中很常见,创建一个图片可以用一个精灵类CCSprite
//3.添加图片经常用this->addChild();

4 .接下来可以运行看看效果了,把AppDelegate.cpp中
#include"StartMenu.h"
然后把
bool AppDelegate::applicationDidFinishLaunching()
函数里面的
CCScene *pScene =HelloWorld::scene();改成CCScene*pScene =StartMenu::scene();
点击F5调试运行,可以看到如下效果。成功加载了背景!!

接下来继续添加Logo和菜单选项了,代码会有点多,但是只有几个知识点,就是菜单类的学习和一些设置图片锚点等等
#include "StdAfx.h"
#include "StartMenu.h"
#include "About.h"

CCScene * StartMenu ::scene()
{
CCScene *scene = CCScene ::create();
StartMenu *layer = StartMenu ::create();
scene->addChild(layer);
return scene;
}

// on "init" you need to initialize your instance
bool StartMenu ::init()
{
if ( ! CCLayer ::init() )
{
return false ;
}
CCDirector * pDirector = CCDirector ::sharedDirector();
CCSizewinSize = pDirector->getWinSize();

CCSprite*pLoadingImg =CCSprite::create("loading.png");//用CCSprite创建一张背景图Loading,然后设置它在窗口的摆放位置,然后加进场景里面
pLoadingImg->setPosition( ccp(winSize.width / 2,winSize.height / 2));
this->addChild(pLoadingImg);

//仿照上面的创建一个Logo图,设置图片的锚点,一样放进场景里面
CCSprite*pLogoImg =CCSprite::create("logo.png");

pLogoImg->setAnchorPoint( ccp(0.5,1));

pLogoImg->setPosition( ccp(winSize.width / 2,winSize.height-60));
this->addChild(pLogoImg);
//创建菜单项的方法可能有点复杂,但是思路很清晰
//1.首先同样用CCSprite创建一个菜单项正常,被点击,不能使用三种状态的图片,后面有个CCRectMake是(0,0)表示从图像的0,0(左上角)
//点开始,(126,33)表示截取一张完整图像中的宽126,高33的部分图像
//这么做有个很简单的原因是做美术的时候总是把多张图放在一起整合成一张图,避免太多的图片资源导致混乱。
//2.接着用CCMenuItemSprite创建一个菜单项,然后把三种不同的状态加进去
//3.后面有个Menu_selector(StartMenu:menuCallback);用来表示菜单项被点击的时候会响应事件(通常是切换场景)
//4.最后要给项设置一个节点标志setTag(),用来识别是哪个菜单项被创建
//这样一个菜单项创建完毕,后面两个菜单项依法炮制创建出来
CCSprite*pNewNormalItemImg =CCSprite::create("menu.png",CCRectMake(0,126,33));
CCSprite*pNewSelectedItemImg =CCSprite::create("menu.png",33,33));
CCSprite*pNewDisabledItemImg =CCSprite::create("menu.png",66,33));
CCMenuItemSprite*pNewItem =CCMenuItemSprite::create(pNewNormalItemImg,pNewSelectedItemImg,pNewDisabledItemImg,this,menu_selector(StartMenu::menuCallback));
pNewItem->setTag(1);

//仿照第一个菜单项创建
CCSprite*pOptionNormalItemImg =CCSprite::create("menu.png",CCRectMake(126,33));
CCSprite*pOptionSelectedItemImg =CCSprite::create("menu.png",33));
CCSprite*pOptionDisabledItemImg =CCSprite::create("menu.png",33));
CCMenuItemSprite*pOptionItem =CCMenuItemSprite::create(pOptionNormalItemImg,pOptionSelectedItemImg,pOptionDisabledItemImg,menu_selector(StartMenu::menuCallback));
pOptionItem->setTag(2);

//仿照第一个菜单项创建
CCSprite*pAboutNormalItemImg =CCSprite::create("menu.png",CCRectMake(252,33));
CCSprite*pAboutSelectedItemImg =CCSprite::create("menu.png",33));
CCSprite*pAboutDisabledItemImg =CCSprite::create("menu.png",33));
CCMenuItemSprite*pAboutItem =CCMenuItemSprite::create(pAboutNormalItemImg,pAboutSelectedItemImg,pAboutDisabledItemImg,menu_selector(StartMenu::menuCallback));
pAboutItem->setTag(3);
//三个菜单项创建完毕之后,就要把它们合并成一个菜单了
//用CCMenu 创建一个菜单把三个菜单项包含进去
//设置每个菜单项之间的距离是30:alignItemsVerticallyWithPadding(20);
CCMenu*pMenu =CCMenu::create(pNewItem,pOptionItem,pAboutItem,NULL);
pMenu->alignItemsVerticallyWithPadding(20);
pMenu->setPosition( ccp(winSize.width / 2,winSize.height/2-60));
addChild(pMenu);
return true ;
}


void StartMenu ::menuCallback(CCObject*pSender)
{
intnTag = ((CCNode*)pSender)->getTag();
switch(nTag)
{
case1:
{
CCLOG("New Click");
}
break;
case2:
{
CCLOG("Option Click");
}
break;
case3:
{
CCLOG("About Click");
CCScene*scene =About::scene();
CCDirector::sharedDirector()->replaceScene(CCTransitionPageTurn::create(1.2,scene,false));
}
break;
}
}
运行一下效果:

5.最后怎么点击一个菜单项就切换进入游戏:
写StartMenu:menuCallback()方法:
我们要实现的是点击New Game选项就进入进入游戏场景:
在此之前要先建立游戏场景类:GameLayer.cpp和GameLayer.h
代码就不贴了 只是设置了一个背景图,读者可以仿照StartMenu菜单类写,贴一下StartMenu:menuCallback()方法:
void StartMenu ::menuCallback(CCObject*pSender)
{
intnTag=((CCNode*)pSender)->getTag();
switch(nTag)
{
case1:
{
CCScene*GameLayerScene=GameLayer::scene();
CCDirector::sharedDirector()->replaceScene(GameLayerScene);
}
break;
case2:
break;
case3:
break;

}
}
运行结果,切换成功



教程一结束:源码下载

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是