cocos2dx入门编程HelloGame

来源:互联网 发布:字有几个字节知乎 编辑:程序博客网 时间:2024/06/08 00:20

我们游戏开发通常是这样的,首先在Microsoft Visual Studio 2012proj.win32工程编写代码并且在windows上调试运行,当游戏主体开发完成后,进行so文件的编译打包,然后继续在eclipseproj.android工程中编写少量的代码完成游戏在android平台下的打包开发。

分析proj.win32工程的主要构成

Microsoft Visual Studio 2012打开proj.win32工程

组成:

整个hellogame的解决方案由hellogamelibbox2dlibcocos2dlibSpine四个工程项目构成。

1Hellogame工程:游戏主工程,我们开发工作主要在这个工程中完成

2libbox2d工程:模拟2D刚体物体的C++物理引擎,大名鼎鼎植物大战僵尸、愤怒的小鸟等游戏均有这个引擎的功劳

3libcocos2d工程:这个不用说了,整个cocos2dx核心

4libSpine工程:工具软件支持库

接下来主要对Hellogame工程的代码进行解析,libbox2d工程在后面的物理引擎篇的时候在进行讲解,至于其它2个工程在后续使用到的篇幅中在进行讲解。

Hellogame工程的源代码:

工程主要由src目录下的AppDelegate.cppAppDelegate.hHelloWorldScene.cppHelloWorldScene.h四个源文件和win32目录下的main.cppmain.h两个源文件组成。

src目录下的源文件是所有6个平台共用的代码文件,不管是android还是ios都使用这个目录下的源文件,属于真正跨平台部分的代码。

win32目录下的源文件只是一个main主入口文件,负责win32平台下对游戏的调用。其实在对应的proj.android的工程里也有一个android平台对应的main主入口文件,只是由于平台的不同实现代码也各有不同,但是目的一样。

AppDelegate.cpp源代码:

AppDelegate类似于androidApplication的作用,提供一些应用程序级别的状态的回调,整个游戏应用程序由这个文件方法进行控制。下面是几个主要方法的说明和解释:

#include"AppDelegate.h"

#include"HelloWorldScene.h"

//命名空间宏,偷懒引入cocos2d的头文件

USING_NS_CC;

AppDelegate::AppDelegate(){

 

}

 

AppDelegate::~AppDelegate()

{

}

 

//设置 OpenGL context

//这个设置对所有平台都有效

void AppDelegate::initGLContextAttrs()

{

   //设置 OpenGL context属性,目前只能设置6个属性

   //red,green,blue,alpha,depth,stencil

   GLContextAttrs glContextAttrs = {8,8, 8,8, 24,8};

   GLView::setGLContextAttrs(glContextAttrs);

}

 

//当应用程序启动时执行,游戏程序启动入口

//在这里我们启动了第一个scene(场景)

//在具体游戏中通常在这里启动loading界面

//你的游戏从这里开始!

bool AppDelegate::applicationDidFinishLaunching() {

   // 初始化 director

   auto director = Director::getInstance();

   auto glview = director->getOpenGLView();

   if(!glview) {

       glview = GLViewImpl::create("My Game");

       director->setOpenGLView(glview);

   }

   // 在屏幕上显示FPS

   // 开发阶段建议开启这个设置,可以通过这个对自己游戏性能有个大体了解

   // 等游戏正式发布时关闭这个设置

   director->setDisplayStats(true);

   // 设置 FPS默认值为 1.0/60

   director->setAnimationInterval(1.0 /60);

   // 创建一个HelloWorldscene.这个是自动回收的对象

   auto scene = HelloWorld::createScene();

   // 告诉director运行HelloWorldscene

   director->runWithScene(scene);

   returntrue;

}

 

//当游戏进入后台时会调用这个方法

//比如玩游戏时按下android手机的home按键

//比如当游戏时有电话打入直接显示来电界面

void AppDelegate::applicationDidEnterBackground() {

   Director::getInstance()->stopAnimation();

   // 如果你的游戏使用了SimpleAudioEngine,必须在这里进行暂停

   // 暂停代码如下:

   //SimpleAudioEngine::getInstance()->pauseBackgroundMusic();

}

 

//当游戏恢复到前台运行时会调用这个方法

//比如接电话结束是游戏界面又恢复到前台时

void AppDelegate::applicationWillEnterForeground() {

   Director::getInstance()->startAnimation();

   // 如果你的游戏使用了SimpleAudioEngine,必须在这里进行恢复

   // 恢复代码如下:

   // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

}

上述代码解释中的提到的director(导演:负责游戏场景的显示切换等,像电影导演一样掌控整个电影的一切)、scene(场景:负责显示一个游戏场景,就像电影的一个场景镜头)。

上面代码中最重要的方法为applicationDidFinishLaunching(),因为你的游戏从这个方法开始!

 

HelloWorldScene.cpp源代码:

上面代码中在AppDelegate类的applicationDidFinishLaunching()方法中创建了一个HelloWorldScene的场景,并且运行这个场景,HelloWorldScene.cpp就是这个场景具体的代码实现。下面是几个主要方法的说明和解释:

#include"HelloWorldScene.h"

USING_NS_CC;

//创建场景

Scene*HelloWorld::createScene()

{

   //创建一个自释放的场景对象

   auto scene = Scene::create();

   //创建一个自释放的画面层对象

   auto layer = HelloWorld::create();

   //把创建的画面层添加到场景中

   //一个场景可以添加多个画面层

   scene->addChild(layer);

   //返回这个创建的场景

   return scene;

}

 

//场景初始化方法

bool HelloWorld::init()

{

   // 1. 首先进行父类初始化

   if ( !Layer::init() )

   {

       //如果初始化父类失败返回false

       returnfalse;

   }

   

   //获取整个手机可视屏幕尺寸

   Size visibleSize =Director::getInstance()->getVisibleSize();

   //获取手机可视屏原点的坐标

   Vec2 origin =Director::getInstance()->getVisibleOrigin();

   // 创建一个带图标的关闭按钮

   // 点击后调用menuCloseCallback方法退出游戏

   auto closeItem = MenuItemImage::create(

                                          "CloseNormal.png",

                                          "CloseSelected.png",

                                          CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));

   // 设置关闭按钮的显示位置

   // 显示在可视屏幕的右下角

   closeItem->setPosition(Vec2(origin.x +visibleSize.width - closeItem->getContentSize().width/2 ,

                               origin.y +closeItem->getContentSize().height/2));

   // 创建一个可自释放的菜单

   auto menu = Menu::create(closeItem, NULL);

   menu->setPosition(Vec2::ZERO);

   this->addChild(menu,1);

   //创建一个显示"HelloGame"文字的Label

   auto label = Label::createWithTTF("Hello Game","fonts/Marker Felt.ttf",24);

   // 设置label在屏幕中的显示位置

   label->setPosition(Vec2(origin.x +visibleSize.width/2,

                           origin.y +visibleSize.height - label->getContentSize().height));

   // label添加到画面层

   this->addChild(label,1);

   // 创建一个带图片的精灵

   auto sprite = Sprite::create("HelloWorld.png");

   // 设置图片精灵的显示位置

   sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

   // 添加图片精灵到画面层

   this->addChild(sprite,0);

   returntrue;

}

 

//退出按钮事件

void HelloWorld::menuCloseCallback(Ref* pSender)

{

//当是wp8或者winrt平台的时候

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM ==CC_PLATFORM_WINRT)

   MessageBox("You pressedthe close button. Windows Store Apps do not implement a close button.","Alert");

   return;

#endif

   //结束Director

   Director::getInstance()->end();

//当是ios平台的时候退出

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

   exit(0);

#endif

}

上述的代码是一个简单的Scene(场景)实现代码,当我们真正开发游戏时,其实就是制作一个一个的场景,并且通过Director进行调度组织构成一个完整的游戏。

原创粉丝点击