cocos2d-x 框架深入分析(二)—— CCScheduler

cocos2d-x定时器机制(更新完毕) 问题1:定时器回调函数,添加到cocos2d-x框架哪里去了。 问题2:定时器回调函数是如何被cocos2d-x回调用起来的 问题3:cocos2d-x框架式如何管理定时器的。 定时器的应用基础cocos2d-x  Cocos2d-x提供两种定时器 1)update定时器,每帧被调用,使用scheduleUpdate方法启用。 2)schedule定时器,可设置时间间隔来触发,使 阅读详情
Scheduler——调度者、计划者。从字面上我们就可以看出,这个类负责的是程序和数据的调度。在上一篇的主循环分析中,( cocos2d-x 框架深入分析(一)—— MainLoop : http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=10881&extra=page%3D1 )我们可以看到底层循环中:CCDirector::drawScene(void) 方法中,有这样的一句代码:m_pScheduler->update(m_fDeltaTime) ,这句代码中CCScheduler对象调用了成员函数 update方法。
  1.     // calculate "global" dt
  2.     calculateDeltaTime();//计算时间差

  3.     //tick before glClear: issue #533
  4.     if (! m_bPaused)    //如果不暂停,就更新数据
  5.     {
  6.         m_pScheduler->update(m_fDeltaTime);//调度者对象,是整个框架中,非常重要的东东,他负责者引擎中精灵、动作等的调度
  7.                                                                                    //而里面所用的数据结构的组织,一定程度决定者引擎的效率。
  8.     }

  9.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  10.     /* to avoid flickr, nextScene MUST be here: after tick and before draw.
  11.      XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */
  12.     if (m_pNextScene)
  13.     {
  14.         setNextScene();//如果有m_pNextScene对象不为空,就说明需要调用到新的场景中,
  15.                                            //在其中onEnter()、onEnterTransitionDidFinish()等函数被回调。
  16.     }

  17.     kmGLPushMatrix();//opengl:把当前矩阵放到栈中,开始绘图工作

  18.     // draw the scene
  19.     if (m_pRunningScene)
  20.     {
  21.         m_pRunningScene->visit();//通过访问方法,去绘制场景中包含的每个层和每个层中的每个节点的draw,
  22.                                                                  //这里面是一个递归的过程,其中transform()方法实现,opengl矩阵的变化,移动,旋转等。
  23.     }
复制代码
从代码上看,这段代码是在我们绘制图形前调用的。
更新?到底要更新什么?一个方法就可以实现了所有我们需要更新的数据?代者疑问,我们不妨来猜测一下设计者的思路:
1、既然是在绘图前的,那应该是更新游戏场景中的数据,比如:每层的显隐,精灵的坐标,旋转角度、纹理地图坐标、一些动画等等。
2、一个方法就可以实习,我们不妨大胆的猜测里面用上的设计模式和数据组织。如果我们把用调度的对象加入CCScheduler中,让CCScheduler来管理,和调度对象,这样的模式有一点像观察者设计模式(个人理解,不一定对!-。-!),对于观察者模式,我的理解为:有一个被观察者(类似于这个CCScheduler),在类中的内部中有0到多个的观察者接口(比如一个精灵),当被观察者的状态有所变化时,被观察者调用某个通知方法时,就会调用内部的所有的观察者接口的方法,这样就可以实现我们想要的效果。
       好了,我们带着自己的猜想去看看源代码。在进入update方法前,我们先看看这个类维持的是什么数据吧。
       找到...\cocos2d-2.1rc0-x-2.1.2\cocos2dx\CCScheduler.h
  1.     float m_fTimeScale;

  2.     //
  3.     // "updates with priority" stuff
  4.     //
  5.         // 权限越小越先被调度
  6.         // 记录权限小于0的链表CCActionManager就是被装入的第一个节点
  7.     struct _listEntry *m_pUpdatesNegList;        // list of priority < 0
  8.         // 记录权限等于0的链表,一般的节点是这个权限
  9.     struct _listEntry *m_pUpdates0List;            // list priority == 0
  10.         // 记录权限大于0的链表,最后被调度
  11.     struct _listEntry *m_pUpdatesPosList;        // list priority > 0


  12.         // 用于记录需要用Update方法的对象,这里是通过哈希表储存的,目的很明显,就是为了快速查找。
  13.         // 这里用的哈希表是在   ...\cocos2d-2.1rc0-x-2.1.2\cocos2dx\support\data_support\uthash.h
  14.         // uthash.h<span style="font-family: Arial;">头文件中,是用C语言实现的。</span>
  15.         // _hashUpdateEntry是哈希表项头地址,其中KEY是需要调度的对象的指针。VALUE就是_hashUpdateEntry结构体
  16.     struct _hashUpdateEntry *m_pHashForUpdates; // hash used to fetch quickly the list entries for pause,delete,etc

  17.     // Used for "selectors with interval"
  18.         // 结构同上,只是记录的是 SEL_SCHEDULE类型回调
  19.     struct _hashSelectorEntry *m_pHashForTimers;
  20.         // 结构同上,记录当前要调度的目标
  21.     struct _hashSelectorEntry *m_pCurrentTarget;

  22.     bool m_bCurrentTargetSalvaged;
  23.     // If true unschedule will not remove anything from a hash. Elements will only be marked for deletion.
  24.     bool m_bUpdateHashLocked;
  25.     CCArray* m_pScriptHandlerEntries;
复制代码
这就是CCScheduler维持的数据。其中包涵3个链表和3个哈希项。由此可以看出,当我们向CCScheduler中添加一个调度对象时(实际也就是scheduleSelector(SEL_SCHEDULE pfnSelector, CCObject *pTarget, float fInterval, bool bPaused) 或者 scheduleUpdateForTarget(CCObject *pTarget, int nPriority, bool bPaused) 等方法)。我们现在看看scheduleUpdateForTarget这个方法,看看是怎么把调度对象加入CCScheduler中的。
进入...\cocos2d-2.1rc0-x-2.1.2\cocos2dx\CCScheduler.cpp
  1. void CCScheduler::scheduleUpdateForTarget(CCObject *pTarget, int nPriority, bool bPaused)
  2. {
  3.         // 申请一个用于记录Update的哈希项空指针
  4.     tHashUpdateEntry *pHashElement = NULL;
  5.         // 把KEY=pTarget 放到m_pHashForUpdates哈希链表中查找,找到为pHashElement赋值,没找到依然为空。
  6.     HASH_FIND_INT(m_pHashForUpdates, &pTarget, pHashElement);
  7.     if (pHashElement)   // 存在这个值
  8.     {
  9. #if COCOS2D_DEBUG >= 1
  10.         CCAssert(pHashElement->entry->markedForDeletion,"");
  11. #endif
  12.         // TODO: check if priority has changed!
  13.         // 确保被调度对象不被删除,最后返回
  14.         pHashElement->entry->markedForDeletion = false;
  15.         return;
  16.     }

  17.     // most of the updates are going to be 0, that's way there
  18.     // is an special list for updates with priority 0
  19.         // 多数的更新操作的权限值为0。
  20.     if (nPriority == 0)
  21.     {
  22.         appendIn(&m_pUpdates0List, pTarget, bPaused);
  23.     }
  24.         // CCActionManager的更新权限是小于0的。
  25.     else if (nPriority < 0)
  26.     {
  27.         priorityIn(&m_pUpdatesNegList, pTarget, nPriority, bPaused);
  28.     }
  29.     else
  30.     {
  31.         // priority > 0
  32.         priorityIn(&m_pUpdatesPosList, pTarget, nPriority, bPaused);
  33.     }
  34. }
复制代码
从上面的代码可以看出,如果在哈希表中已经存在对应的值就不在插入了,否则就进行插入方法。appendIn和priorityIn的方法实现的原理差不多,只是priorityIn方法在插入时,是按照权限的大小排序插入的。现在我们进入appendIn函数看看。
进入:...\cocos2d-2.1rc0-x-2.1.2\cocos2dx\CCScheduler.cpp
  1. void CCScheduler::appendIn(_listEntry **ppList, CCObject *pTarget, bool bPaused)
  2. {
  3.         //申请一个链表节点
  4.     tListEntry *pListElement = (tListEntry *)malloc(sizeof(*pListElement));

  5.     pListElement->target = pTarget;
  6.     pListElement->paused = bPaused;
  7.     pListElement->markedForDeletion = false;
  8.         //把链表节点插入链表中。DL_APPEND这个方法是在utlist.h文件中,用C语言写的一个链表
  9.     DL_APPEND(*ppList, pListElement);

  10.     // update hash entry for quicker access
  11.         // 申请一个哈希项,用于更新操作,可以快速查找。
  12.     tHashUpdateEntry *pHashElement = (tHashUpdateEntry *)calloc(sizeof(*pHashElement), 1);
  13.     pHashElement->target = pTarget;
  14.     pTarget->retain();
  15.     pHashElement->list = ppList;
  16.     pHashElement->entry = pListElement;
  17.         // 把KEY为target,VALUE为pHashElement,插入哈希表中
  18.     HASH_ADD_INT(m_pHashForUpdates, target, pHashElement);
  19. }
复制代码
这个方法就是简单的插入数据。具体的每个字段的含义,下次讲到 CCScheduler用到的数据结构时,具体讲。。。
下面我们看看最重要的 update方法:...\cocos2d-2.1rc0-x-2.1.2\cocos2dx\CCScheduler.cpp
  1. // main loop
  2. void CCScheduler::update(float dt)
  3. {
  4.     m_bUpdateHashLocked = true;

  5.     if (m_fTimeScale != 1.0f)
  6.     {
  7.         dt *= m_fTimeScale;
  8.     }

  9.     // Iterate over all the Updates' selectors
  10.     tListEntry *pEntry, *pTmp;

  11.         // 遍历每个权限小于0的链表,并调用他们的update方法
  12.     // updates with priority < 0
  13.     DL_FOREACH_SAFE(m_pUpdatesNegList, pEntry, pTmp)
  14.     {
  15.                 // 不是暂定和删除状态就update
  16.         if ((! pEntry->paused) && (! pEntry->markedForDeletion))//如果不是暂停和删除标志
  17.         {
  18.             pEntry->target->update(dt);
  19.         }
  20.     }

  21.         // 遍历每个权限等于0的链表,并调用他们的update方法
  22.     // updates with priority == 0
  23.     DL_FOREACH_SAFE(m_pUpdates0List, pEntry, pTmp)
  24.     {
  25.                 // 不是暂定和删除状态就update
  26.         if ((! pEntry->paused) && (! pEntry->markedForDeletion))
  27.         {
  28.             pEntry->target->update(dt);
  29.         }
  30.     }

  31.         // 遍历每个权限大于0的链表,并调用他们的update方法
  32.     // updates with priority > 0
  33.     DL_FOREACH_SAFE(m_pUpdatesPosList, pEntry, pTmp)
  34.     {
  35.                 // 不是暂定和删除状态就update
  36.         if ((! pEntry->paused) && (! pEntry->markedForDeletion))
  37.         {
  38.             pEntry->target->update(dt);
  39.         }
  40.     }

  41.         // 遍历更新所有的定制的选择器,注意这里遍历的实际是哈希表,这是一个比较特殊的哈希表,在下次讲数据结构时会说
  42.     // Iterate over all the custom selectors
  43.     for (tHashTimerEntry *elt = m_pHashForTimers; elt != NULL; )
  44.     {
  45.         m_pCurrentTarget = elt;
  46.         m_bCurrentTargetSalvaged = false;

  47.         if (! m_pCurrentTarget->paused)
  48.         {
  49.                         // 一个周期回调
  50.             // The 'timers' array may change while inside this loop
  51.             for (elt->timerIndex = 0; elt->timerIndex < elt->timers->num; ++(elt->timerIndex))
  52.             {
  53.                                 // 当前索引的Timer
  54.                 elt->currentTimer = (CCTimer*)(elt->timers->arr[elt->timerIndex]);
  55.                 elt->currentTimerSalvaged = false;

  56.                 elt->currentTimer->update(dt);

  57.                                 // 如果update方法调用后currentTimerSalvaged被改为true就取消当前Timer
  58.                 if (elt->currentTimerSalvaged)
  59.                 {
  60.                     // The currentTimer told the remove itself. To prevent the timer from
  61.                     // accidentally deallocating itself before finishing its step, we retained
  62.                     // it. Now that step is done, it's safe to release it.
  63.                     elt->currentTimer->release();
  64.                 }

  65.                 elt->currentTimer = NULL;
  66.             }
  67.         }

  68.         // elt, at this moment, is still valid
  69.         // so it is safe to ask this here (issue #490)
  70.                 // 哈希表的下一个位置
  71.         elt = (tHashTimerEntry *)elt->hh.next;

  72.         // only delete currentTarget if no actions were scheduled during the cycle (issue #481)
  73.                 // 当前目标对象没有动作需要调度就把他从哈希表中移除
  74.         if (m_bCurrentTargetSalvaged && m_pCurrentTarget->timers->num == 0)
  75.         {
  76.             removeHashElement(m_pCurrentTarget);
  77.         }
  78.     }

  79.     // Iterate over all the script callbacks
  80.     if (m_pScriptHandlerEntries)
  81.     {
  82.         for (int i = m_pScriptHandlerEntries->count() - 1; i >= 0; i--)
  83.         {
  84.             CCSchedulerScriptHandlerEntry* pEntry = static_cast<CCSchedulerScriptHandlerEntry*>(m_pScriptHandlerEntries->objectAtIndex(i));
  85.             if (pEntry->isMarkedForDeletion())
  86.             {
  87.                 m_pScriptHandlerEntries->removeObjectAtIndex(i);
  88.             }
  89.             else if (!pEntry->isPaused())
  90.             {
  91.                 pEntry->getTimer()->update(dt);
  92.             }
  93.         }
  94.     }

  95.     // delete all updates that are marked for deletion
  96.     // updates with priority < 0
  97.         // 依据权限把当前被设置为删除状态的目标对象,从哈希表中移除
  98.     DL_FOREACH_SAFE(m_pUpdatesNegList, pEntry, pTmp)
  99.     {
  100.         if (pEntry->markedForDeletion)
  101.         {
  102.             this->removeUpdateFromHash(pEntry);
  103.         }
  104.     }

  105.     // updates with priority == 0
  106.     DL_FOREACH_SAFE(m_pUpdates0List, pEntry, pTmp)
  107.     {
  108.         if (pEntry->markedForDeletion)
  109.         {
  110.             this->removeUpdateFromHash(pEntry);
  111.         }
  112.     }

  113.     // updates with priority > 0
  114.     DL_FOREACH_SAFE(m_pUpdatesPosList, pEntry, pTmp)
  115.     {
  116.         if (pEntry->markedForDeletion)
  117.         {
  118.             this->removeUpdateFromHash(pEntry);
  119.         }
  120.     }

  121.     m_bUpdateHashLocked = false;

  122.     m_pCurrentTarget = NULL;
  123. }
复制代码
现在我们基本都知道了引擎是怎么通过CCScheduler更新所有node的数据的了,其中引起注意的是Update方法是CCObject的虚函数。所以只要是继承CCObject实现Update方法的类,注册进CCScheduler中,我们就可以在Update方法中每帧更新自己的数据。甚至我们还可以注册自己的回调函数。可见CCScheduler设计的强大。
       好了,这次写到这里吧。下次记录下CCScheduler中的数据结构的组织,看这个有什么用呢?游戏最要紧的一点就是帧数。而CCScheduler又是引擎一个非常重要的调度中心,它的数据组织是很重要的。了解它,可以方便我们写出更高效的代码,或者尝试去优化引擎不好的地方。花了3节课,终于写完。。。
NX二次开发编译时dll自动数字签名及拷贝 在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 阅读详情

相关推荐

SAP 接口测试操作-业务顾问

业务顾问测试接口操作

weixin_43657667的博客 5157

开源库uthash第二弹utlist.h

一、简介 1.1 介绍 utlist.h中包含了一组用于C结构体的通用链表宏。使用起来非常简单,只需要将utlist.h拷贝到你的项目,并包含进你的源码即可: #include "utlist.h" utlist.h宏提供了基本的链表操作:添加、删除、排序、遍历。 1.2 源码获取 utlist.h的源码可以在GitHub上直接获取(src/utlist.h): https://github....

小银子 7399

Linux下Linpack测试GPU和CPU性能

前面的文章已经介绍了如何搭建Linpack环境:https://blog.youkuaiyun.com/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI.

liu_feng_zi_的专栏 4633

CCScheduler( 定时调度器) | schedule(定时器) & update(定时器)

------------------------------------------------------------ 定时调度器 CCScheduler CCScheduler可以算是个计时器(单例),可以根据需要通过此类下的各种方法设定计时来执行回调函数,达到计时控制精灵、动画的作用。官方原例中已经演示了这个类的具体使用方法,这里就记录一下使用方法: 1.setTimeScale 用于减慢或者快进动画,其默认参数值为1.0,低于此值时计时器会放慢,否则加快,下面是代码: class..

翻肚鱼儿的博客 1239

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1320

用python自动复制粘贴excel表里某一列的数据到另一个表中

昨天接到人事小姐姐求助减轻复制粘贴的重复工作量,分享一下代码 半路新手上路 耶 把 2.xlsx 表里的第二列 的数据复制粘贴到 test.xlsx的第一列 python3.6.2 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.writer.excel import Exc...

weixin_33854644的博客 2万+

uthash项目中的utlist宏:C语言链表操作指南

uthash项目中的utlist宏提供了一套高效、易用的C语言链表操作工具。这些宏定义在utlist.h头文件中,可以方便地集成到任何C项目中,为开发者提供了完整的链表操作功能,而无需手动处理繁琐的指针操作。 ## 核心特性 utlist宏支持三种基本链表类型: 1. **单向链表**:每个元素只包含指向下一个元素的指针 2. **双向链表**:每个元素包含指向前后元素的指针 3. **循环

gitblog_00817的博客 558

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 318

data_support/utlist(关于编译器的一些宏宏设置)

#ifndef UTLIST_H #define UTLIST_H #define UTLIST_VERSION 1.9.8 #include /*   * This file contains macros to manipulate singly and doubly-linked lists.  *  * 1.

sssssNian的专栏 1123

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

【智能模型系列】基于Unity和MediaPipe【手部追踪+手势识别】系统开发指南

在本文中,我将详细介绍一个基于MediaPipe的Unity手势识别系统,该系统能够识别多种常见手势(如拳头、点赞、胜利手势等),并提供完整的事件系统来处理手势状态变化。这个系统非常适合用于VR/AR交互、手势控制游戏或任何需要自然用户界面的应用场景。

纯技术流日常开发商业开发记录总结等 582

c语言双链表iterator,C语言使用utlist实现的双向链表

#include #include #include #include "utlist.h"#define BUFLEN 20typedef struct el {char bname[BUFLEN];struct el *next, *prev;} el;int namecmp(el *a, el *b) {return strcmp(a->bname,b->bname);}el *...

weixin_28884205的博客 271

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Cocos2d-x CCScheduler

在CCNode这个类中定义了定时器,那么这个类的派生类都可以进行使用。那么假如不是继承自CCNode的话,可以使用 CCScheduler 这个类,通过:CCDirector::sharedDirector()->getScheduler() 获取全局定时器,使用需要的定时器功能。 通过这个类的头文件就可以大致可以知道它的用法了。 /** @brief Scheduler is respo

小邓笔记 3665

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

cocos2d-x源码分析-CCScheduler

Scheduler――调度者、计划者。从字面上我们就可以看出,这个类负责的是程序和数据的调度。在上一篇的主循环分析中,( cocos2d-x 框架深入分析(一)―― MainLoop :http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=10881&extra=page%3D1)我们可以看到底层循环中:CCDirector:

whl_cxy的专栏 1146

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

cocos2d-x 菜鸟学习笔记十(计时器-CCScheduler)

CCScheduler可以算是个计时器,可以根据需要通过此类下的各种方法设定计时来执行回调函数,达到计时控制精灵、动画的作用。官方原例中已经演示了这个类的具体使用方法,这里就记录一下使用方法: 1.setTimeScale 用于减慢或者快进动画,其默认参数值为1.0,低于此值时计时器会放慢,否则加快,下面是代码: class SchedulerTimeScale : public coc

cyistudio的专栏 1万+

COcos2d-X 节点(CCScheduler.h)API

本文来自http://blog.youkuaiyun.com/runaying ,引用必须注明出处! COcos2d-X 节点(CCScheduler.h)API 温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记 /*****************************************************************

runaying的专栏 2152

cocos2d-x 计时器-CCScheduler)

CCScheduler可以算是个计时器,可以根据需要通过此类下的各种方法设定计时来执行回调函数,达到计时控制精灵、动画的作用。官方原例中已经演示了这个类的具体使用方法,这里就记录一下使用方法: 1.setTimeScale 用于减慢或者快进动画,其默认参数值为1.0,低于此值时计时器会放慢,否则加快,下面是代码: [cpp] view plaincopy class S

NightWish 3482

Cocos2d计时器CCScheduler,Cocos2d游戏进度控制CCProgressTimer

CCScheduler

不落航班 982

cocos2d-x TestLua 之 pauseAllRunningActions() resumeTargets()

欢迎各位童鞋转载,转载请注明出处:http://blog.youkuaiyun.com/song_hui_xiang 作者新浪微博:http://weibo.com/u/3168848533 作者腾讯微博:http://t.qq.com/song_huixiang local schedule1ID = nil local schedule2ID = nil local pauseID =

song_hui_xiang 3306

cocos2d-x CCScheduler

CCNode::CCNode(void){ m_pScheduler = director->getScheduler(); m_pScheduler->retain();}void CCNode::schedule(SEL_SCHEDULE selector){this->schedule(selector, 0.0f, kCCRepeatFo...

weixin_34417635的博客 93

cocos2d-x整体框架源码分析以及启动过程原理(win32)

引言:如果你想深入了解cocos2d-x的整个框架和运行流程,如果你想知道整个启动过程的细节,如果你想知道自己写的代码是在什么时候和在哪里被调用的,下面可以为你解答其中奥秘。 对象:适合刚刚入门了cocos2d-x的初学者,编写并运行过简单的demo,并且想仔细探究其中的原理机制。

1822

cocos2d-x 框架深入分析(一)—— MainLoop

学习游戏开发也有3个月了,其中也做一个安卓的原创游戏(2D游戏,目前没有接触到3D游戏),之前没有接触过游戏引擎,游戏的一些简单的物理效果都是自己写,cocos2d-x是我第一次接触游戏引擎,下载源码后就开始深入源码去学习,学习别人更好的思想,也在寻找在设计上和自己做的有什么异同点。记录下我现在所看到的,了解到的。废话不多说,我现在看的版本是cocos2d-2.1rc0-x-2.1.2。

billcools的专栏 793

【玩转cocos2d-x之十一】定时器schedule

如果我们想定时执行一个动作怎么办?CCScheduler帮了我们一个大忙。 1.概况 CCNode内部封装了一个 [cpp] view plaincopy CCScheduler *m_pScheduler;   正是通过它我们可以很轻松地完成一些定时功能,所以定时器是节点所具备的功能。 定时器分为2种

偶尔e网事 2万+

cocos2d-x引擎浅析

项目开始了半年左右,半年前经过调研和工具链的准备,决定使用cocos2d-x制作一款2d的rpg游戏。 阅读cocos2d-x源码后,基本了解cocos2d-x的模块以及功能,我们使用的引擎版本为2.0.3。 引擎分为cocos2d、CocosDenshion、Extensions、Box2D、chipmunk、lua等几个project。cocos2d是引擎基础库代码,CocosDenshi

code_monkey的专栏 1248

Cocos2d-x 动作之动作原理——CCActionManager的工作原理

学习了CCAction在每一帧中如何被更新之后,我们不妨回头看看动作管理类CCActionManager的工作原理。在对CCDirector进行初始化时,也会对CCActionManager进行初始化。下面的代码是CCDirector::init()方法中的一部分: //动作管理器 m_pActionManager = new CCActionManager(); m_pScheduler->s

fyn6417的专栏 1744

cocos2d-x 源码剖析(11)

好久没用动笔写博客了,今天是1024节,还是要表示下。而且今天检查邮箱发现了5个垃圾评论,觉得很高兴,也要来篇文章庆祝下。哈哈。 时间隔得太久,我都不记得我讲到那里来了。原来是打算将几个特殊点的Action为大家结尾,最后一看源码,发现有点杂乱,待我整理好之后再写。今天来讲一讲CCScheduler。之前讲过,在ActionManager创建出来之后立马就加入到CCScheduler中去了,然后

姚大头 837
上一篇: Cocos2d-x 屏幕适配新解
下一篇: cocos2d-x 框架深入分析(一)—— MainLoop
billcools
博客等级 码龄19年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值