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指令,如该方法 ...
随机推荐
- ECSTORE关于MONGODB安装
1.安装mongodb wget http://www.phpwindow.com/linux/mongodb-linux-x86_64-2.2.1.tgz tar zxvf mongodb-linu ...
- HTML&CSS基础学习笔记1.23-表单的文本域和下拉列表
文本域 <textarea>标签定义多行的文本输入控件. 平时在网页上的一些需要输入比较多的内容的输入框,比如回复帖子,回答问题等,都可以用<textarea>标签. < ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- Thinking in Java——笔记(21)
Concurrency However, becoming adept at concurrent programming theory and techniques is a step up fro ...
- 漫游Ruby
Ruby是一门完全面向对象的编程语言,Ruby中的每个值都是对象(nil是Ruby总的特殊值代表null),以下是在irb中的案例. 在Ruby中,圆括号通常都是可选的而且一般都被省略掉. Ruby中 ...
- PCB正片和负片有什么区别
概念:正片和负片是底片的两种不同类型. 正片:简单地说就是,在底片上看到什么就有什么. 负片:正好相反,看到的就是没有的,看不到的就是有的.见下图: 在 Allegro中使用正负片的特点: 正片:优点 ...
- UART与USART的区别
UART与USART都是单片机上的串口通信,他们之间的区别如下: 首先从名字上看: UART:universal asynchronous receiver and transmitter通用异步收/ ...
- 2015第22周一Web性能测试工具及IE扩展区别
在高性能web测试工具推荐http://www.jb51.net/article/23034.htm中发现了dynaTrace 感觉很不错,不但可以检测资源加载瀑布图,而且还能监控页面呈现时间,CPU ...
- poj 1979 Red and Black(dfs水题)
Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...
- (转)Building MariaDB on Mac OS X using Homebrew
https://kb.askmonty.org/en/building-mariadb-on-mac-os-x-using-homebrew/ Work has been done to provid ...