(四)C++自制植物大战僵尸游戏启动流程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL


一、启动方式

鼠标左键单机VS2022上方工具栏中**绿色三角按钮(本地Windows调试器)**进行项目启动。第一次启动项目需要编译项目中所有代码文件,编译生成需要一定的时间。不同性能的电脑需要消耗的时间差别可能较大,通常在几分钟到几十分钟之间。编译成功后会自动启动运行游戏。

qi

编译成功后自动启动运行游戏如下图。

二、启动流程

1. main函数

首先找到项目的main函数。mian函数在Class文件夹下的PlantsVsZombies.cpp文件中。

cpp 复制代码
int WINAPI _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    HANDLE hMutex = ::CreateMutex(NULL, TRUE, L"LZPVZGAME");
    if (hMutex != NULL)
    {
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            CloseHandle(hMutex);
            hMutex = NULL;
            MessageBoxW(nullptr, L"此程序已经启动,禁止多次启动此程序!", L"error", MB_OK);

            return 0;
        }
    }

    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // create the application instance
    AppDelegate app;
    return Application::getInstance()->run();
}

在Main函数中首先判断进程实例是否已经存在,如果存在则不会创建新的进程。游戏只允许一个进程实例进行运行。例如Windows任务管理器也是只允许一个进程实例。

cpp 复制代码
// create the application instance
AppDelegate app;
return Application::getInstance()->run();

2. AppDelegate

这两行代码用于创建启动Cocos2d-x 游戏实例。启动之后会进入AppDelegate.cpp 文件中的**applicationDidFinishLaunching()**函数中。

cpp 复制代码
bool AppDelegate::applicationDidFinishLaunching() 
{
    // initialize director
    auto director = Director::getInstance();

    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("PlantsVsZombies_1.2.0.3 (2020.06.19)", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
#else
        glview = GLViewImpl::create("PlantsVsZombies_1.2.0.3 (2020.06.19)");
#endif
        director->setOpenGLView(glview);
    }
   
    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0f / UserInformation::getScreenDisplayFrequency());
  
    // Set the design resolution
    glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::EXACT_FIT);
    
    register_all_packages();

    // create a scene. it's an autorelease object
	auto scene = LoadingScene::createLaodingScene();

    // run
    director->runWithScene(scene);

    return true;
}

在**applicationDidFinishLaunching()**函数中创建了游戏窗口,设置游戏运行帧率,最后切换场景进入游戏加载场景。

3. LaodingScene

在游戏加载场景中会进入init函数中。在init函数会进行游戏版本检查,检测游戏是否有更新,如果有更新,则会进入游戏更新场景。然后计算文件总数,设置系统参数,以及加载游戏文件同时展示加载动画。游戏文件加载是异步操作,会启动一个新的线程进行文件加载,否则游戏加载时界面就不能展示动画,动画会卡住,直到文件加载完成。

当所有文件加载完成后进入游戏按钮就会设置为可点击状态。点击后进入游戏主界面场景。

点击开始游戏按钮,触发回调函数,进入游戏主界面。同样的然后会调用主界面场景的init函数来创建游戏主场景。

至此,从主函数开始,到游戏加载完成进入游戏主界面的流程大概讲解完成。

三、后续

下一篇会详细讲解游戏文件加载场景中的细节。LoadScene.h和LoadingScene.cpp中详细的代码执行流程以及每个函数的作用。

相关推荐
码匠许师傅4 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
啦啦啦啦啦zzzz5 小时前
Logger的组装(c++20)
c++·算法·c++20
繁星蓝雨6 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
蒸蒸yyyyzwd7 小时前
机试学习笔记
c++·求职招聘
handler018 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
郝学胜-神的一滴8 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
hetao173383710 小时前
校内场-提高组 ZYZSC-S-Round 4
c++·算法
stellanke11 小时前
Linux网络编程实战2:TCP Socket 基础与实践
linux·网络·c++
蒸蒸yyyyzwd11 小时前
机试和Redis学习笔记
c++·笔记·面试
tdtsmt12 小时前
2026年SMT贴片加工选型指南:天地通电子推荐参考
c++