cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx

首先从程序入口main函数开始


main函数

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdLine,int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);#ifdef USE_WIN32_CONSOLEAllocConsole();freopen("CONIN$", "r", stdin);freopen("CONOUT$", "w", stdout);freopen("CONOUT$", "w", stderr);
#endif// create the application instanceAppDelegate app;// 获得viewCCEGLView* eglView = CCEGLView::sharedOpenGLView();eglView->setFrameSize(480, 320);// 运行程序int ret = CCApplication::sharedApplication()->run();#ifdef USE_WIN32_CONSOLEFreeConsole();
#endifreturn ret;
}

以上是中国象棋的main函数的所有内容,掐掉不关注的内容,关键部位为以下代码:

// create the application instanceAppDelegate app;// 获得viewCCEGLView* eglView = CCEGLView::sharedOpenGLView();eglView->setFrameSize(480, 320);// 运行程序int ret = CCApplication::sharedApplication()->run();
步骤:
1.使用AppDelegate去创建app对象

2.创建视图对象比设置视图对象

3.让app运行起来


在这里可以看到app对象并没有被显式的使用,但是它必须定义,在它的构造函数里,会将app的指针

保存在全局变量,使得CCApplication::sharedApplication()能获得app指针。

怎么验证这点呢,我们可以看到AppDelegate是有CCAppplication派生,而在CCApplication的构造函数里

有如下代码:



AppDelegate

AppDelegate在这里是应用程序代理类,该类的作用是继承一些虚函数,对程序进行管理

在我们的代码里,主要是

applicationDidFinishLaunching():启动完毕时被调用

applicationDidEnterBackground():当程序进入后台时该函数被调用

applicationWillEnterForeground():当程序从后台进入前台时被调用

这三个函数我们重点看第一个吧,因为我们在windows下,后面两个函数无效,先学习第一个


看看第一个函数的内容:

bool AppDelegate::applicationDidFinishLaunching()
{// initialize directorCCDirector *pDirector = CCDirector::sharedDirector();  // 导演类pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());  // 给导演一个空间// turn on display FPSpDirector->setDisplayStats(false);     // 显示view   // create a scene. it's an autorelease objectCCScene *pScene = CCWelCome::scene();   // 创建一个WelCome场景// 让导演去运行这个WelCome场景,该welCome场景是象棋程序里的第一个场景// 第一个场景有什么内容呢?那我们应该去看CCWelCome::scene();pDirector->runWithScene(pScene);      return true;
}
在这个函数里,创建了一个导演对象pDirector,然后给导演一个空间pDirecotor->setOpenGLView(...);

而这个view明显就是在main函数里创建的那个view,这个view是一个物理上的窗口,控制着整个程序的显示位置。


接下来CCWelCome::scene创建了一个场景,场景和view是什么关系呢?就好像马戏团表演节目,可以在北京表演可以在上海表演

无论你在哪里表演,你总得先搭台子,这个台子就是view,台子的位置决定了你在哪里表演节目。而当一个节目上演的时候

这个叫做scene,WelCome就是象棋里面的一个场景。


接着让导演pDirecotor去演示该Scene。该Sence演示的结果如下:

同学们一定好奇,这个欢迎页面怎么出来的,那我们继续看WelCome.cpp


CCWelCome

先看头文件的类定义:

class CCWelCome : public CCLayer
{
public:static CCScene* scene();virtual bool init();void step(float dt);CREATE_FUNC(CCWelCome);
};
从类定义可以看出CCWelCome是一个CCLayer,它有四个函数

scene函数:该函数为CWelCome创建了一个scene并创建一个CWelCome放入到该sence中

init函数:该函数被自动调用,CWelCome中的元素,都是在init时候被创建的

step函数:该函数在init时设置被计划调用,也就是当init被调用后一段时间,step被调用了

CREATE_FUNC:其实是定义了一个create函数


scene函数:

CCScene* CCWelCome::scene()
{// 创建一个新的sceneCCScene* pScene = CCScene::create();if(!pScene){return NULL;}// 创建一个新CLayerCCWelCome* pLayer = CCWelCome::create();if(!pLayer){return NULL;}// 把Layer加入到Scene,返回Scene,所以scene函数时创建了一个Layer但是返回包容了该Layer的一个ScenepScene->addChild(pLayer);return pScene;
}
注释在代码中,同学可以好好看。这里注意为什么要返回Scene,为什么不直接返回Layer,是因为导演只能导Scene。

那么WelCome作为一个Layer,只好将其加入到一个Scene之后再返回。


init函数:

bool CCWelCome::init()
{// 调用父类的init函数进行初始化if (!CCLayer::init()){// 如果调用父类的初始化就失败,则返回falsereturn false;}// 获得窗口大小,这里CCDirector::sharedDirector获取的导演是外面创建的那个// 精灵需要用到这个位置信息CCSize s = CCDirector::sharedDirector()->getWinSize();// 创建两个精灵,第一个是黑色的老将,第二个是红帅,都通过addChild把精灵加入到了本Layer// 两个精灵的位置是由上述窗口Size计算得到,图片bkg1.png和bkg2.png是两个老将的图片,如果// 在你的环境中不显示,那就要看看RES_PATH的路径是否正确了CCSprite* pBlackSprite = CCSprite::create(RES_PATH"bkg1.png");pBlackSprite->setPosition(ccp(s.width/2 - 56, s.height/2));addChild(pBlackSprite, 1); CCSprite* pRedSprite = CCSprite::create(RES_PATH"bkg2.png");pRedSprite->setPosition(ccp(s.width/2 + 56, s.height/2));addChild(pRedSprite, 2);     // 最后精灵放置好之后,调用定时器函数,在一秒之后调用step函数schedule(schedule_selector(CCWelCome::step), 1.0f);return true;
}
在WelCome层中,我们为该Layer创建了两个精灵后,启动定时器,1秒之后调用step函数,使得窗口

停留一秒后进入比赛窗口,那是如何进入比赛窗口的呢。我们需要看step函数


step函数:

void CCWelCome::step(float dt)
{// 比赛界面的SceneCCScene* pScene = CCMainMenu::scene();// 做个特效,逐渐隐退效果CCScene* ps = CCTransitionFade::create(2, pScene, ccc3(0, 0, 0));//CCScene* ps = pScene;  // 如果把上面的话,换成这句,那么场景切换就很生硬了// 替换senceCCDirector::sharedDirector()->replaceScene(ps);// step函数的定时器取消掉unschedule(schedule_selector(CCWelCome::step));
}
step函数创建新的主界面场景,然后在场景切换时做了个特效,接着将新的sence替换那个WelCome的Scene。

这样CCMainMenu的init函数就要被自动调用了....

预知后事如何,请听下回分解

转载于:https://www.cnblogs.com/niulanshan/p/6175074.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[原创]Android中的android:layout_width和android:width的区别

在android系统中&#xff0c;我们可以通过在xml资源文件中定义布局&#xff0c;一般的写法是&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"ma…

【C++基础】模板参数与模板继承

模板参数 默认类型参数 函数参数可以设定一个默认值&#xff0c;我们现在可以对类模板的类型参数设定一个默认类型。 指定泛型Stack的默认类型参数为 int template<typename T int> class Stack{... };当我们这样定义一个对象时&#xff1a; Stack<> stack;使…

UNIX标准化及实现之POSIX标准可选头文件

POSIX标准定义的可选头文件 头文件说明<aio.h>异步I/O<mqueue.h>消息队列<pthread.h>线程<sched.h>执行调度<semaphore.h>信号量<spawn.h>实时spawn接口<stropts.h>XSI STREAMS接口<trace.h>事件跟踪转载于:https://www.cnblo…

Julia中的denominator()函数

Julia| 分母()函数 (Julia | denominator() function) denominator() function is a library function in Julia programming language, it is used to get the denominator of the rational representation of the given value. denominator()函数是Julia编程语言中的库函数&a…

【C++基础】STL迭代器

已知&#xff1a; STL组成部分&#xff1a; 容器、迭代器、算法、函数对象、空间分配器 容器&#xff1a;用于保存一组数据&#xff0c;数据个体被称为元素 迭代器&#xff1a;用于遍历容器中的元素&#xff0c;容器都有自己专属的迭代器&#xff0c;只有容器才知道如何遍历自己…

用ie9浏览器若出现看视频有声音没图像的问题处理

当我们在用ie9浏览器上网想看视频时&#xff0c;有时会遇到各种问题&#xff0c;尤其是有关声音和图像的。有时候有声音没图像&#xff0c;但有时候有图像却没声音。各种问题。当遇到某些问题时&#xff0c;只要是关于网页视频的&#xff0c;一般都会选择更新网页视频播放插件&…

java架构师之路:JAVA程序员必看的15本书的电子版下载地址

java架构师之路&#xff1a;JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说&#xff0c;最痛苦的事情莫过于可以选择的范围太广&#xff0c;可以读的书太多&#xff0c;往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些&#xff0c;按照学习的先后顺序…

office数据集dslr_DSLR的完整形式是什么?

office数据集dslrDSLR&#xff1a;数码单镜反光 (DSLR: Digital Single-Lens Reflex) DSLR is an abbreviation of digital single-lens reflex. It alludes to a digital camera which with the sensor of digital imaging merges optics and mechanism of single-lens reflex…

envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning 解决方案

import tensorflow后的完整报错&#xff1a; D:\Anaconda3\envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will b…

转义序列

转义序列描述\n换行符\r回车\t水平制表符\\反斜杠\$美元符\"双引号\[0-7]{1.3}八进制记法\x[0-9A-Fa-f]{1,2}十六进制记法转载于:https://www.cnblogs.com/cindylu520/archive/2012/07/05/2577246.html

Java动态代理模拟spring的AOP

广州疯狂软件学院拥有三大课程体系包括&#xff1a;java课程&#xff0c;android课程&#xff0c;ios课程&#xff0c;疯狂软件年终钜惠&#xff0c;报名java就业班&#xff0c;免费赠送基础班&#xff0c;名额有限&#xff0c;本月火热报名中&#xff0c;欢迎有志之士电话或者…

xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法

将原本的xlrd卸载&#xff0c;安装旧版本&#xff1a; pip uninstall xlrd pip install xlrd1.2.0转自&#xff1a;https://www.cnblogs.com/xiaoqiangink/p/14144517.html

生产消费是什么设计模式_快速消费品的完整形式是什么?

生产消费是什么设计模式快消品&#xff1a;快速消费品 (FMCG: Fast-Moving Consumer Goods) FMCG is an abbreviation of Fast-Moving Consumer Goods which are also known as Consumer Packed Goods (CPG). These consumer packed goods allude to the products that are sol…

分类释义概述

分类(classification) 是人工智能领域基本的研究领域之一&#xff0c;也是知识表示和获取的主要途径之一。一般认为&#xff0c;分类属于科学发展的较初级阶段&#xff0c;即形成理论之前的阶段。 分类的释义&#xff1a; 中文解释&#xff1a;分类指的是将无规律的事物按照其性…

占位博客

占位博客 转载于:https://www.cnblogs.com/CharmingDang/p/9663895.html

通过从全局和类内部重载operator new /delete来获取内存管理权

目录1、通过重载获得内存管理权2、容器的内存管理3、重载new、array new、replacement new&#xff0c;接管内存控制权1、重载全局::operator new / ::operator delete以及array版本2、在类里面去重载1、通过重载获得内存管理权 之前的几章学习&#xff0c;是红色的路线。此时…

sml完整形式_教资会的完整形式是什么?

sml完整形式教资会&#xff1a;大学教育资助委员会 (UGC: University Grants Commission) UGC is an abbreviation of the University Grants Commission. It is an organization established by the Indian Union government in agreement with the UGC Act 1956 under the Mi…

ASP.NET线程相关配置

1、ASP.NET 同一时刻只能发起的工作线程数量&#xff1a; (maxWorkerThreads * CPU逻辑数量&#xff09;-minFreeThreads 比如2个CPU默认配置maxWorkerThreads100&#xff0c;minFreeThreads176&#xff0c;则同时最大只能有24个工作线程。&#xff08;这里不管 <system.ne…

Android 编程下 AlarmManager

对应 AlarmManager 有一个 AlarmManagerServie 服务程序&#xff0c;该服务程序才是正真提供闹铃服务的&#xff0c;它主要维护应用程序注册的各类闹铃并适时的设置即将触发的闹铃给闹铃设备 ( 在系统中&#xff0c;Linux 实现的设备名为 ”/dev/alarm” ) &#xff0c;并且一直…

erp开发模式_ERP的完整形式是什么?

erp开发模式ERP&#xff1a;企业资源计划 (ERP: Enterprise Resource Planning) ERP is an abbreviation of Enterprise Resource Planning. It is incorporated business management that is executed by a lot of numerous business houses to enhance their productivity an…