cocos2dx4.0 c++游戏移植--Apple的学习笔记

一,前言

之前一篇cocos create游戏开发入门--Apple的学习笔记已经入门了cocos create3.0.1来创建小游戏。那么我对cocos引擎有了个大体的了解。包括场景,node等概念,并且学习了typescript进行脚本操作,其实cocos create的源码好像就是ts脚本,用它则需要使用ts脚本开发。而基于c++为主的开发则要使用cocos2dx的API。而我本次的目的是练习c++项目中面向对象的设计思想,当然游戏就是比较好玩的项目,游戏有复杂的大型游戏。也有2d小游戏,所以从简单的上手学习下游戏设计的代码模型。我在网上买了cocos小游戏的源码进行学习,总比自己乱下载来的code要优秀些吧~

二,cocos2dx c++工程移植到cocos2dx 4.0

由于是购买的游戏源码,所以代码都很老,用老的cocos2.2.6也无法编译。于是我对代码中的api进行了整改,改成了当前最新的cocos2dx4.0 sdk来创建就工程,然后将classes中的代码移植到此引擎中进行编译,修改了蛮多的内容。这让我想起来之前看过了,别人设计的游戏架构中说,游戏逻辑中要尽量少用引擎的api,自己建立foundation或base库代码来解耦。我现在移植后,发现c++不同版本的api改动很多,移植性不高。所以若有大型项目,建立自己的底层库用自己的API进行封装是有必要的。另外现在都没有CC打头的类了,所以我引用了#include "CCDeprecated.h",这样还可以通过mapping的方式用这些已经被废弃的类。

三,GUI事件处理框架

之前说过,经历了python的pygame及之前学习的opengl,vulkan,guilite,QT,littlvgel,甚至包括qemu中的hw虚拟界面显示也是用的sdl2事件触发框架。初始化后,进入while循环进行输入检测(事件回调)+渲染+显示输出。就是这样一个框架。QT之前做动画就在onpaint中自己重写draw函数,关于事件检测常规的就是触摸+按键+鼠标等。大框架源码在Application::getInstance()->run();中,一个初始化+while循环如下。其中关键的初始化在applicationDidFinishLaunching(),而draw绘图在director->mainLoop();,事件扫描及回调处理在mainLoop()
_openGLView->pollEvents();调用的。

    // Initialize instance and cocos2d.
    if (!applicationDidFinishLaunching())
    {
        return 1;
    }

    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();

    // Retain glview to avoid glview being released in the while loop
    glview->retain();

    LONGLONG interval = 0LL;
    LONG waitMS = 0L;

    LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);

    while(!glview->windowShouldClose())
    {
        QueryPerformanceCounter(&nNow);
        interval = nNow.QuadPart - nLast.QuadPart;
        if (interval >= _animationInterval.QuadPart)
        {
            nLast.QuadPart = nNow.QuadPart;
            director->mainLoop();
            glview->pollEvents();
        }
        else
        {
            // The precision of timer on Windows is set to highest (1ms) by 'timeBeginPeriod' from above code,
            // but it's still not precise enough. For example, if the precision of timer is 1ms,
            // Sleep(3) may make a sleep of 2ms or 4ms. Therefore, we subtract 1ms here to make Sleep time shorter.
            // If 'waitMS' is equal or less than 1ms, don't sleep and run into next loop to
            // boost CPU to next frame accurately.
            waitMS = static_cast((_animationInterval.QuadPart - interval) * 1000LL / freq.QuadPart - 1L);
            if (waitMS > 1L)
                Sleep(waitMS);
        }
    }

四,游戏源码分析

分析代码后,发现这个小游戏都可以不用cocos,里面的对象很少,而且固定。主要是建立start场景,然后切换到game场景,然后还有一个棋子对象的类,用来定义棋子熟悉及其位置。而按钮及其回调函数也在game场景中,game类中专门添加了游戏规则的逻辑。能学习到基于cocos2dx引擎的游戏逻辑设计,其主要api所继承的类及使用方法。调试运行后,我又按源码画了下类图,画完类图后,我发现关于游戏逻辑设计中真的没有用到什么面向对象的设计方法,另外它用的都是public,不太好。不过至少我明白如何用cocos2dx引擎组织成一个小游戏框架了,特别是需要有导演(Director),有大背景(Scene),还有背景上的小修饰物(Layer),还有人物(Sprite)的类,也了解了主要的cocos调度框架以及给用户重写的api函数。要是让我用这个引擎写个小游戏,也算是有思路了。


image.png

五,运行效果

image.png

mygame.gif

六,总结

现在终于对游戏设计有思路了哈但是这个工程没有用到什么设计思想,主要是因为是单机的简单游戏,设计师没有考虑可扩展性,估计不是高手的创作。依靠看这样的代码来学习游戏中c++的设计模式效率就太低了,但是学习游戏设计思想还是可以的,用来学习cocos2dx的API应用也是可以的哈

你可能感兴趣的:(cocos2dx4.0 c++游戏移植--Apple的学习笔记)