• cocos2d-x 3.0的入门程序:helloworld


    看过了这么多不同方向的应用,发现很多程序入门都是helloworld
    helloworld是所有程序员的绝对初恋

    先看一下程序的运行结果吧


    然后就是他的工程代码

    工程的目录有两个

        Classes:程序中的类

              AppDelegate.h/cpp:Cocos2d-x程序框架
              AppMacros.h:所用到的宏,主要是设置分辩率及对应的资源目录         
              HelloWorldScene.h/cpp:场景显示层

        win32:WIN32程序所涉及的主函数

              main.cpp:winMain主函数

     

    WinMain函数:

    #include "main.h"
    #include "AppDelegate.h"
    #include "cocos2d.h"
    
    USING_NS_CC;
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                           HINSTANCE hPrevInstance,
                           LPTSTR    lpCmdLine,
                           int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // create the application instance
        AppDelegate app;
    	//运行创建程序
        return Application::getInstance()->run();
    }
    

          一切都被封装到程序类AppDelegate中,这是一个基于Cocos2d-x的cocos2d::Application类的派生类。

    它将程序框架封装为一个类,提供了统一的多平台上基本程序框架的实现。

    AppDelegate.cpp:

    #include "AppDelegate.h"
    #include "HelloWorldScene.h"
    
    USING_NS_CC;
    
    AppDelegate::AppDelegate() {
    
    }
    
    AppDelegate::~AppDelegate() 
    {
    }
    
    bool AppDelegate::applicationDidFinishLaunching() {
        // initialize director创建导演
        auto director = Director::getInstance();
    	//创建opengl窗口
        auto glview = director->getOpenGLView();
        if(!glview) {
            glview = GLView::create("My Game");
            director->setOpenGLView(glview);
        }
    
        // turn on display FPS 打开FPS
        director->setDisplayStats(true);
    
        // set FPS. the default value is 1.0/60 if you don't call thi 1秒60帧
        director->setAnimationInterval(1.0 / 60);
    
        // create a scene. it's an autorelease object创建场景和层
        auto scene = HelloWorld::createScene();
    
        // run启动场景
        director->runWithScene(scene);
    
        return true;
    }
    //当收到电话,游戏转入后台服务
    // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
    void AppDelegate::applicationDidEnterBackground() {
        Director::getInstance()->stopAnimation();
    
        // if you use SimpleAudioEngine, it must be pause
        // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
    }
    //当电话完成,选择恢复游戏时,响应这句
    // this function will be called when the app is active again
    void AppDelegate::applicationWillEnterForeground() {
        Director::getInstance()->startAnimation();
    
        // if you use SimpleAudioEngine, it must resume here
        // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    }
    

      

     

    下面我们来看一下HelloWorld场景,它是一个基于cocos2d::Layer的派生类。cocos2d::Layer是什么?在这里,我想打个比方来建立一些基本的认知,比方说我们生活在地球上,地球属于宇宙内的一部分。从Cocos2d-x的框架体系来看,我们是Sprite精灵,地球是Layer,而宇宙是Scene。

            一个程序要想表现出精彩的世界,要先建立一个宇宙Scene,然后增加地球,月球,太阳等Layer,然后在这些Layer上增加相应的物体。而我们站在地球上,地球运动,我们也会跟着一起运动。

      OK,现在我们来看一下如何创建Scene和Layer:

    HelloWorldScene.h:

    #include "HelloWorldScene.h"
    
    USING_NS_CC;
    
    Scene* HelloWorld::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        
        // 'layer' is an autorelease object
        auto layer = HelloWorld::create();
    
        // add layer as a child to scene
        scene->addChild(layer);
    
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !Layer::init() )
        {
            return false;
        }
        //得到屏幕的大小,得到原点
        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
        /////////////////////////////
        // 2. add a menu item with "X" image, which is clicked to quit the program
        //    you may modify it.
    	//   // 创建一个菜单项,它由两张图片来表现普通状态和按下状态,设置按下时调用menuCloseCallback函数响应关闭  
        // add a "close" icon to exit the progress. it's an autorelease object
        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));
    
        // create menu, it's an autorelease object菜单项放到菜单里
        auto menu = Menu::create(closeItem, NULL);
        menu->setPosition(Vec2::ZERO);
        this->addChild(menu, 1);//放到当前的层
    
        /////////////////////////////
        // 3. add your codes below...
    
        // add a label shows "Hello World"
        // create and initialize a label
        //创建标签
        auto label = LabelTTF::create("Hello World", "Arial", 24);
        
        // position the label on the center of the screen标签位置
        label->setPosition(Vec2(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - label->getContentSize().height));
    
        // add the label as a child to this layer将标签放到层中
        this->addChild(label, 1);
    
        // add "HelloWorld" splash screen"创建图片精灵
        auto sprite = Sprite::create("HelloWorld.png");
    
        // position the sprite on the center of the screen精灵位置
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    
        // add the sprite as a child to this layer将精灵放到层中
        this->addChild(sprite, 0);
        
        return true;
    }
    
    //点close菜单项的时候来回调的
    void HelloWorld::menuCloseCallback(Ref* pSender)
    {
    	////如果是WP8平台,弹出消息框提示一下。  
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
    	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
        return;
    #endif
    	//终止程序。
        Director::getInstance()->end();
    	//如果是ios平台
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        exit(0);
    #endif
    }
    

      Layer中增加了精灵,按钮,文字等表现物,有了这些表现物,一个Layer才有价值。

    参考:http://blog.csdn.net/honghaier/article/details/24518863(谢谢)

  • 相关阅读:
    Error creating bean with name 'entityManagerFactory' defined in class path resource
    com.sun.org.apache.regexp.internal不存在
    [Kubernetes] Best Practices/Design Patterns for Kubernetes in Production
    [Tools] Kill the process running on port 8080
    [AWS] Lab: Docker and CodeCommit Part 1
    [AWS] Lab: Docker with CodeCommit & CodeBuild Part2
    [AWS] Lab: Launching an EKS Cluster
    [AWS] Lab: Configure and Work with CodeCommit from the CLI
    [DevOps] Environment Variables with Travis
    [DevOps] CI/CD Benefits
  • 原文地址:https://www.cnblogs.com/zsboy/p/3925098.html
Copyright © 2020-2023  润新知