• 分享
  • Cocos2d - x 中 Director 类学习笔记

  • @ 2025-7-19 10:57:16

Cocos2d - x 中 Director 类学习笔记

一、前言

在 Cocos2d - x 游戏开发里,Director类就像电影拍摄中的导演,是整个游戏引擎的“总指挥” ,它掌管着游戏的场景切换、生命周期控制、配置信息访问等关键流程。下面我们结合理论和代码示例,详细学习Director类 。

二、Director 类的概念与角色

(一)类比理解

Director类对应电影拍摄中导演的概念,是 Cocos2d - x 引擎中的“总指挥”。就像导演把控电影的拍摄流程、场景切换、节奏把控等,Director类负责管理游戏的场景流程、游戏的暂停/继续/停止,以及访问引擎配置信息、坐标转换等核心工作。

(二)典型游戏流程中的作用(结合流程实例)

一个典型游戏流程一般包含故事介绍、功能菜单、游戏场景、剧情(插入剧情、胜利/失败剧情 )、高分排名等环节,流程如下:

graph TD
    A[故事介绍] --> B[功能菜单]
    B --> C[游戏场景1]
    C --> D[插入剧情]
    D --> E[游戏场景2]
    E --> F[胜利剧情]
    E --> G[失败剧情]
    G --> C
    F --> H[高分排名]
    B --> H

Director类在这个流程中,负责调度各个环节的切换,比如从功能菜单进入游戏场景、从游戏场景根据剧情走向(胜利/失败)切换到对应剧情展示,再到高分排名,以及支持从高分排名等环节回到功能菜单重新开始等,把控着游戏流程的流转。

三、Director 类的继承关系

Director类的继承体系为:RefDirectorDisplayLinkDirector

  • Ref是 Cocos2d - x 中用于内存管理的基础类,提供了引用计数等机制,Director类继承它来进行合理的内存管控。
  • DisplayLinkDirector是具体实现相关功能的子类,不同平台(如 iOS、Android 等)可能基于它做适配,不过我们日常开发中,主要直接使用Director类提供的接口。

四、Director 类的职责

(一)访问和切换场景

这是Director类最核心的职责之一,游戏中不同玩法、不同界面都对应不同场景(Scene),Director负责场景的加载、显示以及场景之间的切换。

(二)访问 Cocos2d - x 的配置信息

可以通过Director类获取引擎的一些配置参数,比如屏幕分辨率相关配置、渲染相关设置等,辅助我们进行游戏的适配和优化。

(三)暂停、继续和停止游戏

控制游戏的运行状态,比如游戏切到后台时暂停(stopAnimation ),回到前台时继续(startAnimation ),游戏结束时停止(end )等,管理游戏的生命周期。

(四)转换坐标

在游戏开发中,涉及到不同坐标系统(比如世界坐标、屏幕坐标 ),Director类提供方法帮助我们进行坐标转换,确保节点在正确的位置显示和交互。

五、Director 类的使用(代码示例 + 注释)

(一)环境说明

以下代码基于 Cocos2d - x 框架,使用 C++ 语言,在 Visual Studio 等支持 C++ 开发的 IDE 中进行编写和运行,示例围绕一个简单的多场景切换游戏展开。

(二)访问场景(runWithScene)

runWithScene方法用于启动游戏时设置第一个场景,游戏启动后,这个场景会作为初始场景显示。

#include "cocos2d.h"
USING_NS_CC;

// 假设我们有一个 HelloWorld 场景类,继承自 Scene
class HelloWorld : public Scene {
public:
    static Scene* createScene() {
        return HelloWorld::create();
    }
    virtual bool init() {
        if (!Scene::init()) {
            return false;
        }
        // 这里可以添加场景内的节点,比如标签、精灵等
        auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
        if (label) {
            label->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
            this->addChild(label);
        }
        return true;
    }
};

// AppDelegate.cpp 中应用启动相关代码
bool AppDelegate::applicationDidFinishLaunching() {
    // 初始化 Director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if (!glview) {
        // 创建 OpenGL 视图,不同平台适配,这里以 Windows 等桌面平台为例
        glview = GLViewImpl::createWithRect("MyGame", Rect(0, 0, 800, 600));
        director->setOpenGLView(glview);
    }

    // 开启显示 FPS(每秒帧数),方便调试性能
    director->setDisplayStats(true);
    // 设置游戏帧率,这里设置为 60 帧每秒
    director->setAnimationInterval(1.0f / 60);

    // 创建初始场景并运行,使用 runWithScene
    auto scene = HelloWorld::createScene();
    director->runWithScene(scene);

    return true;
}

代码注释

  • 首先定义了HelloWorld场景类,createScene静态方法用于创建场景实例,init方法初始化场景内容,添加了一个显示“Hello World”的标签。
  • AppDelegate.cppapplicationDidFinishLaunching方法中,先初始化Director和 OpenGL 视图,然后配置显示 FPS 和帧率,最后通过director->runWithScene(scene)HelloWorld场景设置为初始运行的场景,游戏启动后就会显示该场景。

(三)替换场景(replaceScene)

当游戏需要从一个场景切换到另一个场景时(比如从游戏场景切换到胜利剧情场景 ),可以使用replaceScene方法,它会销毁当前场景并替换为新场景。

// 假设我们有另一个场景类 HelloWorldScene2,代表另一个场景(比如胜利剧情场景等)
class HelloWorldScene2 : public Scene {
public:
    static Scene* createScene() {
        return HelloWorldScene2::create();
    }
    virtual bool init() {
        if (!Scene::init()) {
            return false;
        }
        auto label = Label::createWithTTF("Hello World2", "fonts/Marker Felt.ttf", 24);
        if (label) {
            label->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
            this->addChild(label);
        }
        // 添加一个菜单按钮,点击按钮切换场景
        auto menuItem = MenuItemImage::create(
            "CloseNormal.png",
            "CloseSelected.png",
            CC_CALLBACK_1(HelloWorldScene2::menuCloseCallback, this));
        auto menu = Menu::create(menuItem, NULL);
        menu->setPosition(Vec2(visibleSize.width - menuItem->getContentSize().width / 2, menuItem->getContentSize().height / 2));
        this->addChild(menu, 1);
        return true;
    }
    void menuCloseCallback(Ref* pSender) {
        // 使用 replaceScene 切换回 HelloWorld 场景
        auto newScene = HelloWorld::createScene();
        Director::getInstance()->replaceScene(newScene);
    }
};

代码注释

  • 定义HelloWorldScene2场景类,init方法中除了添加显示“Hello World2”的标签,还创建了一个菜单按钮。
  • 按钮的回调函数menuCloseCallback中,通过Director::getInstance()->replaceScene(newScene),创建HelloWorld场景实例并替换当前的HelloWorldScene2场景,实现场景切换。这样当点击按钮时,游戏画面就会从HelloWorldScene2切换回HelloWorld场景。

(四)暂停、继续和停止游戏

// 比如在游戏切到后台时暂停游戏
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation(); // 暂停游戏动画更新等
}

// 游戏回到前台时继续游戏
void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation(); // 继续游戏动画更新等
}

// 游戏结束时停止(比如用户主动退出游戏)
void someQuitFunction() {
    Director::getInstance()->end(); // 停止游戏,清理相关资源
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0); // iOS 平台下退出应用进程,不同平台处理可能有差异
    #endif
}

代码注释

  • applicationDidEnterBackgroundapplicationWillEnterForegroundAppDelegate类中的方法,分别在应用进入后台和回到前台时调用,通过DirectorstopAnimationstartAnimation控制游戏的暂停和继续。
  • someQuitFunction是自定义的退出游戏函数,调用Director::getInstance()->end()停止游戏相关逻辑,对于 iOS 平台,再调用exit(0)退出应用进程(不同平台退出处理方式有区别,需按需适配 )。

(五)访问配置信息与坐标转换(简单示例)

// 访问配置信息示例,获取屏幕尺寸
auto director = Director::getInstance();
auto glView = director->getOpenGLView();
Size screenSize = glView->getFrameSize(); // 获取屏幕的尺寸大小
log("Screen width: %f, height: %f", screenSize.width, screenSize.height);

// 坐标转换示例,假设将世界坐标转换为屏幕坐标(简单示意,实际根据需求调整)
Vec2 worldPos(100, 100);
Vec2 screenPos = director->convertToGL(worldPos); // 将世界坐标转换为 OpenGL 屏幕坐标(Cocos2d - x 中相关坐标体系转换)
log("World position (%f, %f) convert to screen position (%f, %f)", worldPos.x, worldPos.y, screenPos.x, screenPos.y);

代码注释

  • 首先通过Director获取OpenGLView,进而调用getFrameSize获取屏幕尺寸并打印,这就是访问引擎配置信息(屏幕相关 )的示例。
  • 然后模拟一个世界坐标worldPos,通过director->convertToGL方法将其转换为屏幕坐标(Cocos2d - x 中涉及到 OpenGL 渲染的坐标体系转换 ),并打印转换前后的坐标,展示Director在坐标转换中的作用。实际开发中,坐标转换常用于处理节点在不同层级、不同显示环境下的位置计算,确保交互和显示正确。

六、总结

Director类在 Cocos2d - x 游戏开发中扮演着极为重要的“总指挥”角色,从游戏启动时的初始场景设置(runWithScene ),到游戏过程中的场景切换(replaceScene ),再到游戏生命周期的控制(暂停、继续、停止 ),以及访问配置信息、坐标转换等功能,都离不开它。掌握Director类的使用,能让我们更灵活、高效地把控游戏的整体流程和运行状态,后续开发复杂游戏场景切换、多状态管理的游戏时,就能更加得心应手啦。

3 条评论

  • @ 2025-7-19 12:26:35
    • Delegate
      • 意思:在编程中常译为“委托”,指一种设计模式或类/对象,用于处理特定任务、事件响应或代理其他对象的功能(如文档中AppDelegate负责处理应用的生命周期事件)。
      • 中文音译:“德legate”(可近似读作“德力给特”)。
    • @ 2025-7-19 12:25:07

      以下是文档中涉及的英语单词及短语的意思和中文音译(按出现顺序整理):

      基础词汇

      • Cocos2d - x:一款开源的跨平台游戏引擎,中文音译可参考“科科斯2d - x”
      • Director:导演、指挥者,中文音译“迪雷克特”
      • admin:管理员(administrator的缩写),中文音译“艾德明”
      • Ref:引用(Reference的缩写),中文音译“雷夫”
      • DisplayLinkDirector:(Cocos2d - x中的)显示链路导演类,可音译为“迪丝普雷林克迪雷克特”
      • Scene:场景,中文音译“斯辛”
      • Visual Studio:微软开发的集成开发环境(IDE),常译为“视觉工作室”,音译“维休艾尔 斯丢迪奥”
      • IDE:集成开发环境(Integrated Development Environment的缩写),无固定音译
      • FPS:每秒帧数(Frames Per Second的缩写),无固定音译
      • AppDelegate:应用委托类(用于处理应用生命周期),可音译“爱普德艾利盖特”
      • OpenGL:开放式图形库(Open Graphics Library的缩写),音译“欧盆基艾尔”
      • GLView:OpenGL视图(OpenGL View的缩写),可音译“基艾尔维尤”
      • GLViewImpl:OpenGL视图实现类(OpenGL View Implementation的缩写),可音译“基艾尔维尤因普莱姆”
      • MenuItemImage:图像菜单项,可拆分为:
        • MenuItem:菜单项,音译“麦纽伊特姆”
        • Image:图像,音译“伊梅吉”
      • Menu:菜单,音译“麦纽”
      • CC_CALLBACK_1:Cocos2d中的回调函数宏(1表示参数数量),无固定音译
      • iOS:苹果公司的移动操作系统,常直接使用“iOS”,音译“艾欧艾斯”
      • Android:谷歌公司的移动操作系统,常译为“安卓”,音译“安朱伊德”
      • Windows:微软公司的操作系统,常译为“视窗”,音译“温都斯”
      • exit:退出、终止,音译“艾克西特”
      • Size:尺寸、大小,音译“赛兹”
      • Vec2:二维向量(Vector 2的缩写),可音译“维克托2”
      • log:日志、记录,音译“劳格”
      • Target:目标,音译“塔吉特”
      • Platform:平台,音译“普拉特佛姆”
      • Hydro:文档中是在线判题系统的底层框架,意为“水疗院、氢”,音译“海德罗”

      短语及复合词拆分

      • createScene:创建场景,拆分:
        • create:创建,音译“克瑞伊特”
        • Scene:场景(同上)
      • init:初始化(initialize的缩写),音译“伊尼提”
      • label:标签,音译“莱布尔”
      • createWithTTF:用TTF字体创建(TTF是TrueType Font的缩写,意为“真型字体”),拆分:
        • createWith:用……创建,音译“克瑞伊特威兹”
        • TTF:无固定音译
      • setPosition:设置位置,拆分:
        • set:设置,音译“塞特”
        • Position:位置,音译“波西申”
      • addChild:添加子节点,拆分:
        • add:添加,音译“艾德”
        • Child:子节点、孩子,音译“柴尔德”
      • replaceScene:替换场景,拆分:
        • replace:替换,音译“瑞普莱斯”
        • Scene:场景(同上)
      • menuCloseCallback:菜单关闭回调函数,拆分:
        • menu:菜单(同上)
        • Close:关闭,音译“克洛斯”
        • Callback:回调,音译“卡布克”
      • runWithScene:用场景运行,拆分:
        • runWith:用……运行,音译“润威兹”
        • Scene:场景(同上)
      • stopAnimation:停止动画,拆分:
        • stop:停止,音译“斯托普”
        • Animation:动画,音译“安尼梅申”
      • startAnimation:启动动画,拆分:
        • start:启动、开始,音译“斯大特”
        • Animation:动画(同上)
      • getFrameSize:获取帧尺寸,拆分:
        • get:获取,音译“盖特”
        • Frame:帧,音译“弗雷姆”
        • Size:尺寸(同上)
      • convertToGL:转换到OpenGL坐标,拆分:
        • convertTo:转换到,音译“康沃尔特图”
        • GL:OpenGL的缩写(同上)
      • applicationDidFinishLaunching:应用完成启动(生命周期方法),拆分:
        • application:应用,音译“爱普累kei申”
        • Did:(助动词,无实义),音译“迪德”
        • Finish:完成,音译“菲尼什”
        • Launching:启动(动名词),音译“朗秦”
      • applicationDidEnterBackground:应用进入后台(生命周期方法),拆分:
        • application:应用(同上)
        • Did:(同上)
        • Enter:进入,音译“恩特”
        • Background:后台,音译“贝克格如昂德”
      • applicationWillEnterForeground:应用将要进入前台(生命周期方法),拆分:
        • application:应用(同上)
        • Will:将要,音译“威尔”
        • Enter:进入(同上)
        • Foreground:前台,音译“佛如昂特格如昂德”

      其他相关词汇

      • Community:社区,音译“科缪尼提”
      • API:应用程序接口(Application Programming Interface的缩写),无固定音译
      • QQ:腾讯公司的即时通讯软件,直接使用“QQ”
      • Language:语言,音译“兰格威奇”
      • Powered by:由……提供支持,无固定音译

      注:音译仅为辅助记忆,实际使用中建议以英文原词和中文释义为主。

      • @ 2025-7-19 12:23:44

        以下是文档中涉及的英语单词及其意思和中文音译:

        英语单词 意思 中文音译
        Director 导演;指挥者(在Cocos2d-x中特指管理游戏流程的核心类) 迪雷克托
        Cocos2d-x 一款开源的跨平台游戏引擎 科科斯2d-x
        Ref 引用(Cocos2d-x中用于内存管理的基础类) 雷夫
        DisplayLinkDirector (Cocos2d-x中Director类的子类,负责具体功能实现) 迪丝普雷林克迪雷克托
        Scene 场景(游戏中不同的界面或玩法模块) 斯辛
        runWithScene (Cocos2d-x中的方法,用于启动游戏时设置第一个场景) 润威兹斯辛
        replaceScene (Cocos2d-x中的方法,用于替换当前场景) 瑞普莱斯斯辛
        stopAnimation (Cocos2d-x中的方法,用于暂停游戏动画) 斯托普安尼梅逊
        startAnimation (Cocos2d-x中的方法,用于继续游戏动画) 斯塔尔安尼梅逊
        init 初始化(用于初始化对象等) 伊尼特
        createScene (Cocos2d-x中的方法,用于创建场景实例) 克瑞特斯辛
        Label 标签(用于显示文字的节点) 莱博尔
        TTF TrueType字体(一种字体格式) 提提艾弗
        Menu 菜单(游戏中的交互菜单) 梅纽
        MenuItemImage 图片菜单项(菜单中以图片为载体的选项) 梅纽艾特伊梅吉
        Callback 回调(当某个事件发生时调用的函数) 考尔巴克
        OpenGL 开放式图形库(用于渲染2D和3D图形的跨语言、跨平台API) 奥彭基艾尔
        GLView OpenGL视图(用于显示OpenGL渲染内容的视图) 基艾尔维尤
        GLViewImpl OpenGL视图实现(GLView的具体实现类) 基艾尔维尤因普
        FPS 每秒帧数(用于衡量游戏画面流畅度) 艾弗皮埃斯
        Size 尺寸(表示宽度和高度等的大小信息) 赛兹
        Vec2 二维向量(用于表示2D坐标等) 维克图二
        log 日志(用于输出信息进行调试等) 洛格
        AppDelegate 应用委托(处理应用生命周期等事件的类) 爱普德累盖特
        applicationDidFinishLaunching (AppDelegate中的方法,应用完成启动时调用) 爱普累克申迪德菲尼什朗秦
        applicationDidEnterBackground (AppDelegate中的方法,应用进入后台时调用) 爱普累克申迪德恩特巴克莱格伦德
        applicationWillEnterForeground (AppDelegate中的方法,应用将要进入前台时调用) 爱普累克申威尔恩特佛勒格伦德
        CC_TARGET_PLATFORM (Cocos2d-x中的宏,用于标识目标平台) 西西塔吉特普拉特佛姆
        CC_PLATFORM_IOS (Cocos2d-x中的宏,表示iOS平台) 西西普拉特佛姆艾欧艾斯
        exit 退出(用于结束程序进程) 埃克西特
        convertToGL (Cocos2d-x中的方法,用于将坐标转换为OpenGL坐标) 康vert图基艾尔
        Community 社区 科缪尼提
        Hydro (文档末尾提到的Hydro v4.13.3,可能是指相关的系统或框架) 海德罗
        API 应用程序编程接口(用于不同软件组件之间交互的规范) 艾皮爱
        IDE 集成开发环境(用于编写、调试代码的软件) 艾迪伊
        Visual Studio 微软开发的一款集成开发环境 维休阿尔斯蒂久
        Windows 微软开发的操作系统 温都斯
        iOS 苹果公司开发的移动操作系统 艾欧艾斯
        Android 谷歌开发的移动操作系统 安卓伊德
        • 1