• Cocos2d-x C++ 工程初探


    经过较为繁琐的环境搭建后,我们终于运行出了一个helloworld窗口,可以正式上手cocos了

    现在我们就从改代码开始玩起

    AppDelegate

    AppDelegate类 是程序的入口,现在我们先来看AppDelegate的几个成员函数

    你可能会好奇入口为什么不是main函数,因为AppDelegate类其实是一个应用委托类,main.c里把游戏的运行委托给了这个类

    • applicationDidFinishLaunching 正如其名,我们的游戏启动时会调用这个函数,也就是入口函数
      比如等下会提到的:实例化单例类 director,设置窗口大小,游戏分辨率等等
    • applicationDidEnterBackground 是在游戏要切换到后台时调用的函数
      比如:停止音乐,停止动画等等
    • applicationWillEnterForeground 也就是游戏从后台切换回来时调用的函数
      比如:继续播放音乐,继续播放动画

    接下来我们的重点是看 applicationDidFinishLaunching 函数内的代码

    导演

    首先可以看到第一行

    实例化了一个 Director 类,director是干什么的呢?
    如果把做游戏比作拍电影,director导演就是总指挥,切换场景,播放/停止音乐等动作都是director决定的
    也就是说你你在cocos里需要通过director来实现这一系列操作,他是必不可少的

    窗口

    接下来你看到的会是

    auto glview = director->getOpenGLView();
    if(!glview) {
        #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
        glview = GLViewImpl::createWithRect("Test", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
        #else
        glview = GLViewImpl::create("Test");
        #endif
        director->setOpenGLView(glview);
    }
    

    你可能会有点懵,没关系,先看

    // 为方便阅读我做了换行处理
    glview = GLViewImpl::createWithRect(
        "Test", 
        cocos2d::Rect(
            0, 
            0, 
            designResolutionSize.width, 
            designResolutionSize.height
    	)
    );
    

    再看看你运行出来的画面

    GLViewImpl::createWithRect() 的第一个参数 “Test” 其实就是运行出来的窗口的名称(默认是你的项目名)

    至于第二个参数

    cocos2d::Rect(
        0, 
        0, 
        designResolutionSize.width, 
        designResolutionSize.height
    )
    

    从名字应该不难看出一个是高,一个是宽,在Visual Studio里按住Ctrl,鼠标左键点选designResolutionSize就能找到定义

    cocos有一个叫做Size的类,这个尺寸的width和height两个成员是我们经常需要使用的,在设置精灵的尺寸,坐标的时候会经常使用到

    这是示例预先设置好的几个窗口大小,所以你应该能理解上面那一段代码是干什么的了吧——设置窗口名和大小

    至于 #if#else#endif 是干嘛的,从字面上看其实就很好理解,是检测你的运行环境的(WIN32,MAC,LINUX或其他)这个我们暂时不用深究

    现在由于designResolutionSize提供的宽高太小了不方便我们调试,我们把参数换成mediumResolutionSize将下面这个designResolutionSize直接改成mediumResolutionSize即可:

    改后

    运行:

    之后的两行都很好理解

    director->setDisplayStats(true);			// 显示FPS
    director->setAnimationInterval(1.0f / 60);	// 设置每帧的间隔
    

    把第一个参数改成false就能关闭帧数显示,可以发现FPS显示和帧间隔也是director控制的

    画面分辨率

    看字面应该就能理解了,setDesignResolutionSize就是设置画面分辨率的,同样是属于Director导演类的成员函数

    现在虽然我们窗口的尺寸设置成了mediumResolutionSize1024*768,但是实际上游戏窗口里的分辨率还是designResolutionSize480*320个像素

    打开项目目录的Resources文件夹我们可以看到HelloWorld.png这个图片的分辨率是195*270

    可以尝试下更改窗口分辨率运行,窗口内的这个Logo还是一样大的,但是改了画面分辨率的话就不一定了

    场景

    最后有两行比较关键的代码

    这里用我们写好的HelloWorld类创建了一个场景helloWorldscene

    然后让directorhelloWorldscene这个场景开始,启动整个程序

    精灵

    精灵(Sprite)是Cocos里的一个概念,我们helloworld界面的Cocos的logo就是一个精灵,现在我们尝试把他换成别的图片,选一张图片放到项目目录的Resources文件夹内

    控制这个精灵的代码在HelloWorldScene.cpp内,打开找到这段代码:

    只要把HelloWorld.png修改成你放入Resources内的图片名即可

    运行:

    坐标系统

    首先介绍一下Vec2类,有接触过图形库或者游戏引擎的同学应该不陌生,这个类代表的是二维向量,有x和y这两个成员,我们在设置游戏物体的坐标的时候会使用到

    同样在HelloWorldScene.cpp中,在创建sprite精灵的地方有这么几行代码,就是我们刚才换图片的那里

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    

    这行代码就是使用 setPosition 设置初始化好的精灵(你的图片)的坐标,

    注意,坐标中出现了两个对象,一个是visibleSizeorigin

    • visibleSize这个对象储存了游戏世界的尺寸,也就是我们能够看到的窗口的尺寸,设置游戏的分辨率可以影响这个值
    • origin指的是窗口左下角的点在游戏世界中的位置

    在设置坐标的代码下加入这样一行代码输出一些信息(log函数可以当作c/c++的printf使用)

    log("visibleSize.width=%f, visibleSize.height=%f, origin.x=%f, origin.y=%f", 
                visibleSize.width, 
                visibleSize.height,
                origin.x,
                origin.y);
    

    运行,查看输出窗口

    可以看到visibleSize和origin的值

    再回看设置坐标的代码

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    

    理性理解一下,实际上意思很简单,就是set到了窗口正中间的位置

    稍作改动
    Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y)

    就向左移动了1/4窗口宽度的距离

    最后一句

    this->addChile(sprite, 0);
    

    意思是将这个精灵加入到当前图层中,参数0代表最底层,如果不加这行代码,sprite不会成为游戏世界中的一员,编译出来之后就不会显示(这个涉及到场景的 z-order 值,下一节会讲到)

    总结

    通过这篇文章你应该基本了解了实例工程HelloWorld里的几个文件是干什么的了

    关于场景和精灵,要学习的还有很多,我们之后会逐一介绍

  • 相关阅读:
    Android 之 JSON操作
    android 之 XMLPull
    DOM 之 SAX操作
    android之DOM生成与解析
    parseDouble()方法
    读取遥感图像中遇到的问题集锦
    xml学习
    linux基础
    hadoop的基本概念 伪分布式hadoop集群的安装 hdfs mapreduce的演示
    【原】自定义tableViewCell的两种方法
  • 原文地址:https://www.cnblogs.com/zhxmdefj/p/11686396.html
Copyright © 2020-2023  润新知