cocos2d-x初学笔记01:HelloWorld浅析

来源:互联网 发布:c语言小于 编辑:程序博客网 时间:2024/05/16 01:02

       刚刚接触cocos2d-x引擎,有些东西总是看了一段时间后又忘记了,所以找个地方记下来,顺便能够和大家一块交流学习。由于是初学笔记,所以这部分内容不会对引擎功能的实现进行深入研究,只是知道怎么用而已。以后掌握的多了再进行研究分析(我现在是菜鸟一个,也分析不出什么东西来偷笑)。

       按照国际惯例,首先是HelloWorld浅析。cocos2d-x的安装和环境配置我就不说了,网上都有详细的安装教程。安装时出现错误就上网查,一个一个解决,最后就OK了。成功后会出现官方提供的参考示例项目,我的共12个,其中HelloWorld被改名了,成了HelloCpp。

      (注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址

       同时,cocos2d-x从1.0升级到2.0之后改动了许多地方,详情参见官方文档

       好了,让我们把HelloCpp运行起来,就出现如下图

                                      

        我们可以看到,HelloCpp运行后显示的界面为:一张背景图,一行“HelloWorld”文字,左下角显示三行设置的数据,右下角是一个关闭按钮,点击关闭程序。接下来我们打开HelloCpp项目代码,来看一下它的结构和运行流程。

        由于我们是在Windows系统下运行的,所以main.h/cpp放在了win32文件夹下。main.h文件定义了使用win32平台进行编译的宏和一些Windows编程头文件

#ifndef __MAIN_H__#define __MAIN_H__//定义了使用win32进行编译的宏#define WIN32_LEAN_AND_MEAN// Windows编程用到的头文件#include <windows.h>#include <tchar.h>// cocos2d-x的C语言头文件#include "CCStdC.h"#endif    // __MAIN_H__

然后看一下main.cpp的实现

#include "main.h"#include "../Classes/AppDelegate.h"#include "CCEGLView.h"//using name space cocos2d;的宏表示USING_NS_CC;//WinMain主函数int APIENTRY _tWinMain(HINSTANCE hInstance,                       HINSTANCE hPrevInstance,                       LPTSTR    lpCmdLine,                       int       nCmdShow){    //UNREFERENCED_PARAMETER用于在VC编译器下告知编译器,不必检测变量是否使用的警告    UNREFERENCED_PARAMETER(hPrevInstance);    UNREFERENCED_PARAMETER(lpCmdLine);    // 创建一个cocos2d-x程序实例    AppDelegate app;    //创建OpenGL窗体,并设置大小    CCEGLView* eglView = CCEGLView::sharedOpenGLView();    eglView->setFrameSize(2048, 1536);    //Windows的分辨率小,所以设置为0.4倍    eglView->setFrameZoomFactor(0.4f);    //运行程序实例    return CCApplication::sharedApplication()->run();}

 接下来是AppDelegate.h/cpp。AppDelegate.h文件的代码如下

#ifndef  _APP_DELEGATE_H_#define  _APP_DELEGATE_H_#include "cocos2d.h"//继承自CCApplicationclass  AppDelegate : private cocos2d::CCApplication{public:    AppDelegate();    virtual ~AppDelegate();    //重载应用程序启动后调用的处理函数    virtual bool applicationDidFinishLaunching();    //重载应用程序转入后台时调用的函数    virtual void applicationDidEnterBackground();    //重载应用程序恢复前台时调用的函数    virtual void applicationWillEnterForeground();};#endif // _APP_DELEGATE_H_

 

再看  AppDelegate.cpp文件

#include "AppDelegate.h"#include "HelloWorldScene.h"#include "AppMacros.h"USING_NS_CC;AppDelegate::AppDelegate() {}AppDelegate::~AppDelegate() {}//重载应用程序启动后调用的处理函数bool AppDelegate::applicationDidFinishLaunching() {    //初始化显示设备和OpenGL窗体    CCDirector* pDirector = CCDirector::sharedDirector();    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();    //设置显示设备使用建立的OpenGL窗体    pDirector->setOpenGLView(pEGLView);    // 设置指定的分辨率    pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder);    //获得窗体的大小CCSize frameSize = pEGLView->getFrameSize();    // 根据窗体框架的高度来选择不同分辨率的资源,如果资源大小不同于指定分辨率的大小,我们要对其进行调整    // 我们用资源高度和指定分辨率的高度的比进行调整    // 这样就能保证资源的高度能够适合设定分辨率的高度      // 如果指定分辨率框架的高度大于mediumResource资源的高度,选择largeResourceif (frameSize.height > mediumResource.size.height){ CCFileUtils::sharedFileUtils()->setResourceDirectory(largeResource.directory);        pDirector->setContentScaleFactor(largeResource.size.height/designResolutionSize.height);}     // 如果指定分辨率框架的高度大于smallResource资源的高度,选择mediumResource    else if (frameSize.height > smallResource.size.height)    {         CCFileUtils::sharedFileUtils()->setResourceDirectory(mediumResource.directory);        pDirector->setContentScaleFactor(mediumResource.size.height/designResolutionSize.height);    }    // 如果指定分辨率框架的高度大于mediumResource资源的高度,选择smallResourceelse    { CCFileUtils::sharedFileUtils()->setResourceDirectory(smallResource.directory);        pDirector->setContentScaleFactor(smallResource.size.height/designResolutionSize.height);    }    // 显示FPS     pDirector->setDisplayStats(true);    // 设置FPS帧间隔时间    pDirector->setAnimationInterval(1.0 / 60);    // 创建场景,即通过HelloWorld的scene()返回的场景实例    CCScene *pScene = HelloWorld::scene();    // 运行这个场景    pDirector->runWithScene(pScene);    return true;}//重载应用程序转入后台时调用的函数,如电话打进来void AppDelegate::applicationDidEnterBackground() {    CCDirector::sharedDirector()->stopAnimation();    // 如果使用了声音引擎,这里进行暂停设置。否则会影响到通话,因为暂时没用到,所以屏蔽    // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();}//重载应用程序恢复前台时调用的函数void AppDelegate::applicationWillEnterForeground() {    CCDirector::sharedDirector()->startAnimation();    //如果使用了声音引擎,这里进行恢复设置    // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();}

最后,介绍下HelloWorld.h/cpp。

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"//继承自CCLayer,所以HelloWorld是一个布景class HelloWorld : public cocos2d::CCLayer{public:    // 布景HelloWorld的初始化方法    virtual bool init();      // 用于返回实例化的场景,在AppDelegate里运行这个场景    static cocos2d::CCScene* scene();        // 菜单回调函数    void menuCloseCallback(CCObject* pSender);        // create()的宏表达    CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__


cpp的实现如下

#include "HelloWorldScene.h"#include "AppMacros.h"USING_NS_CC;//返回用于运行的场景实例CCScene* HelloWorld::scene(){    // create()创建的对象是自动销毁的,实例化一个场景    CCScene *scene = CCScene::create();        // create()创建的对象是自动销毁的,实例化一个布景    HelloWorld *layer = HelloWorld::create();    // 将实例化的HelloWorld布景添加到场景中    scene->addChild(layer);    // 返回这个场景    return scene;}// 初始化HelloWorld布景实例bool HelloWorld::init(){    //////////////////////////////    // 1.实现父类的init()方法    if ( !CCLayer::init() )    {        return false;    }        CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();    /////////////////////////////    // 2. 添加一个菜单,点击退出程序    // 创建一个图标菜单项    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(                                        "CloseNormal.png",                                        "CloseSelected.png",                                        this,                                        menu_selector(HelloWorld::menuCloseCallback));    //设置位置    pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,                                origin.y + pCloseItem->getContentSize().height/2));    // 创建菜单,并且设置位置,将其添加到HelloWorld布景中    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);    pMenu->setPosition(CCPointZero);    this->addChild(pMenu, 1);    /////////////////////////////    // 3. 添加背景图片和一行“HelloWorld”文字    //创建一行文字,内容为“HelloWorld”    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE);        //设置显示位置    pLabel->setPosition(ccp(origin.x + visibleSize.width/2,                            origin.y + visibleSize.height - pLabel->getContentSize().height));    // 加入到HelloWorld布景中    this->addChild(pLabel, 1);    // 创建一个精灵,实际上就是一张图片    CCSprite* pSprite = CCSprite::create("HelloWorld.png");    //设置位置    pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));    // 将这个精灵图片添加到HelloWorld布景中    this->addChild(pSprite, 0);        return true;}//菜单回调函数,当点击菜单时执行void HelloWorld::menuCloseCallback(CCObject* pSender){    CCDirector::sharedDirector()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)    exit(0);#endif}

       

       好了,现在我们已经简单的看了一下HelloCpp项目的执行过程,并将其各个步骤的作用进行了注释。相信大家能够理解。接下来我会参考着TestCpp项目,讲一下其中常用功能的实现方法,依然是简单介绍,知道怎么用,不对其进行进行深入的研究。

        第一次写博客,难免有疏漏和错误的地方,希望大家能够指正教导,有表达不好的地方也望大家海涵。写一点学习笔记和大家交流探讨,有些地方可千万别被我误导了,我也是一个小白。        

        最后祝愿每一个奋斗在路上的人早日实现梦想!

原创粉丝点击