03--理解HelloWorld结构
作为程序猿还是要代码来说事的,现在开始进入到具体的代码中来。国际惯例HelloWorld打头阵,我也不能免这个俗。
Win32入口函数中主要代码如下:
main.cpp// 创建应用实例
AppDelegate app; //创建游戏窗口并设置窗口大小
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setFrameSize(2048, 1536); eglView->setFrameZoomFactor(0.4f); //分辨率的0.4倍
return CCApplication::sharedApplication()->run();
语句AppDelegate app 将创建一个应用程序实例,类AppDelegate 继承自CCApplication,此处将调用到分类CCApplication的构造函数。接下来的两句代码创建了游戏窗口并设置了它的大小。因为我们电脑显示器分辨率一般都不高(远远没达到2048X1536),所有使用了eglView->setFrameZoomFactor(0.4f)缩放窗口。最后使用CCApplication的sharedApplication方法获取一个实例运行。
初看这部分代码不明白为什么已经创建了一个继承自CCApplication的实例,还在最后使用sharedApplication方法创建实例。其实最后一句已经不是在创建实例而是在获取已经创建的实例。这是由C++语法特性确定的,在调用AppDelegate 的无参数构造函数的时候首先会调用父类的无参数构造。我们到父类CCApplication构造函数看看就明了:
CCApplication::CCApplication()
: m_hInstance(NULL)
, m_hAccelTable(NULL)
{
m_hInstance = GetModuleHandle(NULL);
m_nAnimationInterval.QuadPart = 0;
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this; // 将当前实例保存起来
}
CCApplication* CCApplication::sharedApplication()
{
CC_ASSERT(sm_pSharedApplication);
return sm_pSharedApplication;
}
下面来看看AppDelegate重载CCApplication的三个方法:
applicationDidEnterBackground() 当游戏窗口进入后台时所要做的处理,比如手机有一个电话进来的时候,游戏窗口就回转到后台。
applicationWillEnterForeground() 当游戏窗口恢复到前台的时候要做的工作。
applicationDidFinishLaunching() 当启动游戏窗口完成后所要做的工作。
在HelloWorld程序中,前两个方法就是调用父类中相应的方法,下面我们重点来看看最后一个,代码如下:
bool AppDelegate::applicationDidFinishLaunching() {
// 创建导演实例
CCDirector* pDirector = CCDirector::sharedDirector();
// 在main中已经创建过,者里仅仅是获取已经创建的实例
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
// 将游戏窗口传递个导演实例,导演绘制的内容就在该窗口上
pDirector->setOpenGLView(pEGLView);
//设置帧显示模式
pDirector->setDisplayStats(true);
// 设置每秒60帧
pDirector->setAnimationInterval(1.0 / 60);
// 创建一个场景对象
CCScene *pScene = HelloWorld::scene();
// 让导演绘制这个场景
pDirector->runWithScene(pScene);
return true;
}
代码已经注释的够清楚就不多解释,Demo中的代码我删除了设置资源路径那部分。下面再来看看场景是如何创建出来的
CCScene* HelloWorld::scene()
{
//创建一个场景实例,它讲由引擎自动释放
CCScene *scene = CCScene::create(); // 创建一个HelloWorld类型的图层对象
HelloWorld *layer = HelloWorld::create(); // 将图层添加到场景中
scene->addChild(layer); return scene;
}
上面代码重点就这句HelloWorld *layer = HelloWorld::create() ,create从和而来还要看看头文件这句
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld); // 希望高手能详细解释一下CREATE_FUNC的定义
这个宏展开会调用init方法,所以这个类中最重要的就是他了。init方法包含了HelloWorld程序中的所有绘制逻辑。
bool HelloWorld::init()
{
//调用基类的init方法
if ( !CCLayer::init() )
{
return false;
} CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); //用图片创建一个关闭菜单项,并为其关联回调函数
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
//
pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
origin.y + pCloseItem->getContentSize().height/2)); // 根据菜单项创建一个菜单并添加到图层中
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1); //创建一个显示"Hello World"的标签
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // 设置显示位置为屏幕中央
pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer
this->addChild(pLabel, 1); // 使用图片创建一个精灵实例
CCSprite* pSprite = CCSprite::create("HelloWorld.png"); pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); this->addChild(pSprite, 0); return true;
}
运行效果像这样(windows环境搭建很容易,请到网上搜索)

03--理解HelloWorld结构的更多相关文章
- 036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构
036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构 本文知识点:Java中的嵌套if结构 什么是嵌套if结构? 概念: 嵌套if结构 ...
- 更加清楚理解mvc结构
更加清楚理解mvc结构 文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注,有问题一起学习欢迎留言.评论.
- 深入理解“HelloWorld”小程序
对于每个Java程序员来说,HelloWorld是一个再熟悉不过的程序.它很简单,但是这段简单的代码能指引我们去深入理解一些复杂的概念.这篇文章,我将探索我们能从这段简单的代码中学到什么.如果你对He ...
- 你如何理解HTML结构的语义化?
去掉或样式丢失的时候能让页面呈现清晰的结构: html本身是没有表现的,我们看到例如<h1>是粗体,字体大小2em,加粗:<strong>是加粗的,不要认为这是html的表现, ...
- 深入理解指针—>结构体里的成员数组和指针
单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如 ...
- 深入理解BS结构应用程序
随着学习的深入,和编程经验的丰富,对BS应用程序有一些认识. 在一些讨论软件技术的QQ群里,或一些社区.BBS中,经常会有一些初学者会犯一些认知性的错误.比如经常会有一些朋友提这样的一些问题:“我怎么 ...
- 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!
一.java中流程控制方式采用三种基本流程结构:顺序结构,选择(分支)结构,循环结构. 1.[if-else 结构] if(1>2){ system.out.println("if条件 ...
- JVM体系结构-----深入理解内存结构
一.概述 内存在计算机中占据着至关重要的地位,任何运行时的程序或者数据都需要依靠内存作为存储介质,否则程序将无法正常运行.与C和C++相比,使用Java语言编写的程序并不需要显示的为每一个对象编写对应 ...
- 深入理解JVM结构
JVM结构探究---- 1.JVM结构示意图 2.JVM运行时数据区 1)程序计数器(Program Counter Register) 程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法 ...
随机推荐
- Python新手学习基础之运算符——赋值与逻辑运算
赋值也是一种运算符 我们在之前的章节,了解过,在Python里变量是不需要声明的,只要变量的标识符合法,就可以直接定义并赋值,而且Python也允许我们同时为多个变量赋值(包括为多个变量赋不同类型的值 ...
- c++ 连接数据库
#include <icrsint.h> #include<iostream> #include<iomanip> #include <string> ...
- 关于offsetWidth innerWidth的使用
最近因为有使用到offsetWidth 和innerWidth,刚开始以为这两个属性在jq何js之中是可以通用的,谁知道在js中使用innerWidth时,发现如果对页面元素使用它时,发现出来的是un ...
- linux下如何编译python生成libpython2.5.so动态库
http://biancheng.dnbcw.info/python/245306.html
- 这样就算会了PHP么?-4
数组初步 <?php $ereg = 'tm'; $str = 'hello,tm,Tm,tM,TM.'; $rep_str = eregi_replace($ereg, 'TM', $str) ...
- Spring注解 @Resource和@Autowired
@Resource和@Autowired两者都是做bean的注入使用.其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spri ...
- 360网站卫士常用前端公共库CDN服务
360网站卫士常用前端公共库CDN服务 360网站卫士常用前端公共库CDN服务
- Struts2小结
Struts 2是在WebWork2基础发展而来的. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1.在软件设计上Struts 2 ...
- Query语句对系统性能的影响
需求: 取出某个group(假设id为1)下的用户编号id,用户昵称(nick_name),并按照加入组的时间(user_group.gmt_create)来进行倒序排列,取出前20个 解决方案一: ...
- DenyHosts限制SSH登录尝试次数
DenyHosts官方网站为:http://denyhosts.sourceforge.net 1. 安装 # tar -zxvf DenyHosts-2.6.tar.gz # cd DenyHost ...