Camera视角:确定显示的视场及视角。

Game:显示的基类。静态单例模式。但是获取方式很奇怪。

Game::getInstance得到的是__gameInstance,但是__gameInstance是在Game()构造函数里=this。因此如果没有Game的实例,this就是NULL。

然而使用时,编写继承自Game的子类,如HomuraGame,并且声明HomuraGame的全局变量,这样在加载该so时子类的实例就会创建,同时Game也就会创建。而后调用时Game::getInstance就能得到Game的指针。

这也意味着同一时间只能存在一个Game的实例进行操作。

 Game::Game()
: _initialized(false), _state(UNINITIALIZED), _pausedCount(),
_frameLastFPS(), _frameCount(), _frameRate(), _width(), _height(),
_clearDepth(1.0f), _clearStencil(), _properties(NULL),
_animationController(NULL), _audioController(NULL),
_physicsController(NULL), _aiController(NULL), _audioListener(NULL),
_timeEvents(NULL), _scriptController(NULL), _scriptTarget(NULL)
{
GP_ASSERT(__gameInstance == NULL); __gameInstance = this;
_timeEvents = new std::priority_queue<TimeEvent, std::vector<TimeEvent>, std::less<TimeEvent> >();
} Game::~Game()
{
SAFE_DELETE(_scriptTarget);
SAFE_DELETE(_scriptController); // Do not call any virtual functions from the destructor.
// Finalization is done from outside this class.
SAFE_DELETE(_timeEvents);
#ifdef GP_USE_MEM_LEAK_DETECTION
Ref::printLeaks();
printMemoryLeaks();
#endif __gameInstance = NULL;
} Game* Game::getInstance()
{
GP_ASSERT(__gameInstance);
return __gameInstance;
}
     /**
* Constructor.
*/
Game(); /**
* Destructor.
*/
virtual ~Game(); /**
* Gets the single instance of the game.
*
* @return The single instance of the game.
*/
static Game* getInstance();
 #define DISPATCH_EVENT(dispatch, count, eventName, ...) { \
for (int i = ; i < count; i++) { \
EXECUTE_FUNCTION(dispatch[i], eventName, __VA_ARGS__); \
} \
} HomuraGame game; HomuraGame::HomuraGame() : mParticleIndex(), mGraphicsIndex(), pFont(NULL) {
memset(pParticle, , MAX_HOMURA_SIZE * sizeof(Homura*));
memset(pGraphics, , MAX_HOMURA_SIZE * sizeof(Homura*));
memset(pPhysical, , MAX_HOMURA_SIZE * sizeof(Homura*));
}

而后Game的子类中实现了update和render方法,openGL中每次更新都会调用Game的frame方法,而frame方法会调用update及render方法,从而对动画进行更新。

 class HomuraGame : public Game {
public:
HomuraGame(); /**
* @see Game::initialize
*/
void initialize(); /**
* @see Game::finalize
*/
void finalize(); /**
* @see Game::update
*/
void update(float elapsedTime); /**
* @see Game::render
*/
void render(float elapsedTime); void resizeEvent(unsigned int width, unsigned int height); void keyEvent(Keyboard::KeyEvent evt, int key); void touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex); bool mouseEvent(Mouse::MouseEvent evt, int x, int y, int wheelDelta); static HomuraGame* getInstance();

gameplay理解的更多相关文章

  1. 我所理解的Cocos2d-x

    我所理解的Cocos2d-x(完全基于Cocos2d-x3.0,深度剖析计算机图形学,OpenGL ES及游戏引擎架构,全面提升游戏开发相关知识) 秦春林 著   ISBN 978-7-121-246 ...

  2. 《InsideUE4》GamePlay架构(十)总结

    世界那么大,我想去看看 引言 通过对前九篇的介绍,至此我们已经了解了UE里的游戏世界组织方式和游戏业务逻辑的控制.行百里者半九十,前述的篇章里我们的目光往往专注在于特定一个类或者对象,一方面固然可以让 ...

  3. [Unity3D] C# Basic : Gameplay Scripting

    教程:https://unity3d.com/cn/learn/tutorials/s/scripting 补充:http://www.runoob.com/csharp/csharp-inherit ...

  4. 凉鞋:我所理解的框架 【Unity 游戏框架搭建】

    前言 架构和框架这些概念听起来很遥远,让很多初学者不明觉厉.会产生"等自己技术牛逼了再去做架构或者搭建框架"这样的想法.在这里笔者可以很肯定地告诉大家,初学者是完全可以去做这些事情 ...

  5. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  6. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  7. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  8. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  9. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

随机推荐

  1. Python基本运算符和流程控制

    常量 常量即不可改变的量,在Python中不存在常量,我们只能逻辑上规定一个常量并不去修改它,通常用全大写字母表示. 基本运算符之二 算术运算 运算符 说明 ** 幂运算 *, /, //, % 乘. ...

  2. css 元素垂直居中

    通用 <div id="parent"> <div id="child">Content here</div> </d ...

  3. C#简易日志输出

    精简版: public static void WriteLog(string message, string group = "") { var logPath = System ...

  4. Python开发:模块

    在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办法,把这些定义存放在文 ...

  5. STM32F407 窗口看门狗 个人笔记

    窗口看门狗的喂狗时间范围 由框图知: 复位条件是:当且仅当 { 启动位启动 且 { T6为0 (计数器的值减小到0X03F即下限,还没喂狗,即喂狗太晚) 或 计数器的值高于上限时喂狗,即喂狗太早 } ...

  6. 大数据学习——Kafka集群部署

    1下载安装包 2解压安装包 -0.9.0.1.tgz -0.9.0.1 kafka 3修改配置文件 cp server.properties  server.properties.bak # Lice ...

  7. 使用create datafile... as ...迁移数据文件到裸设备

    下面是一个测试过程 1.首先创建裸设备:root@ultra66 # cd /opt/app/oradata/test             root@ultra66 # lscontrol01.c ...

  8. 九度oj 题目1108:堆栈的使用

    题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. 输入: 对于每组测 ...

  9. shrio注解的方式进行权限控制

    除了通过API方式外,Shiro 提供Java 5+注解的集合,以注解为基础的授权控制.在你可以使用Java 注释之前,你需要在你的应用程序中启用AOP 支持. Shiro注解支持AspectJ.sp ...

  10. 【bzoj2901】矩阵求和 前缀和

    题目描述 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. 输入 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数,表示第二个矩阵. ...