全国文明网联盟网站建设,中国最著名网站建设公司,查域名的网站,wordpress 旋转加载之前两个博客讲述了象棋的规格和工程文件之后#xff0c;我们继续深入的从代码开始学习cocos2dx首先从程序入口main函数开始main函数int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{UNREFERENCED_PARAMETER(h… 之前两个博客讲述了象棋的规格和工程文件之后我们继续深入的从代码开始学习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. its 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台子的位置决定了你在哪里表演节目。而当一个节目上演的时候这个叫做sceneWelCome就是象棋里面的一个场景。接着让导演pDirecotor去演示该Scene。该Sence演示的结果如下同学们一定好奇这个欢迎页面怎么出来的那我们继续看WelCome.cppCCWelCome先看头文件的类定义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_PATHbkg1.png);pBlackSprite-setPosition(ccp(s.width/2 - 56, s.height/2));addChild(pBlackSprite, 1); CCSprite* pRedSprite CCSprite::create(RES_PATHbkg2.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