cocos2d-x游戏开发(三)游戏主循环

终于抽时间把这个游戏写完了。由于没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。自此,我算是完成了一个功能比较完善的游戏了。

麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记了。


首先还是就我个人的理解,讲讲游戏引擎的处理流程。

其实游戏逻辑简单化就是一个死循环,如下:

  1.      
  2. bool game_is_running = true;  
  3.   
  4.     while( game_is_running ) {   
  5.         update_game();   
  6.         display_game();   
  7.     }  

我们所看到的游戏画面,游戏音乐,以及一些触控,输入等。在逻辑上就是这么一个死循环。这个循环一直在跑,期间会处理一些列的事件,简化之就是上面的两个函数。

cocos2d-x引擎也是如此,所有的逻辑都是在这个主循环下实现的。下面看看cocos2dx在各平台上的主循环实现。


1.Win

看它的main.cpp

  1. #include "main.h"  
  2. #include "../Classes/AppDelegate.h"  
  3. #include "CCEGLView.h"  
  4.   
  5. USING_NS_CC;  
  6.   
  7. int APIENTRY _tWinMain(HINSTANCE hInstance,  
  8.                        HINSTANCE hPrevInstance,  
  9.                        LPTSTR    lpCmdLine,  
  10.                        int       nCmdShow)  
  11. {  
  12.     UNREFERENCED_PARAMETER(hPrevInstance);  
  13.     UNREFERENCED_PARAMETER(lpCmdLine);  
  14.   
  15.     // create the application instance  
  16.     AppDelegate app;  
  17.     CCEGLView* eglView = CCEGLView::sharedOpenGLView();  
  18.     eglView->setFrameSize(2048, 1536);  
  19.     // The resolution of ipad3 is very large. In general, PC's resolution is smaller than it.  
  20.     // So we need to invoke 'setFrameZoomFactor'(only valid on desktop(win32, mac, linux)) to make the window smaller.  
  21.     eglView->setFrameZoomFactor(0.4f);  
  22.     return CCApplication::sharedApplication()->run();// 注意这里  
  23. }  

前面都不要关心,只是用来传递OpenGL窗口的,关键是最后一句,CCApplication::sharedApplication()->run()。看这个run函数:

  1. int CCApplication::run()  
  2. {  
  3.     PVRFrameEnableControlWindow(false);  
  4.   
  5.     // Main message loop:  
  6.     MSG msg;  
  7.     LARGE_INTEGER nFreq;  
  8.     LARGE_INTEGER nLast;  
  9.     LARGE_INTEGER nNow;  
  10.   
  11.     QueryPerformanceFrequency(&nFreq);  
  12.     QueryPerformanceCounter(&nLast);  
  13.   
  14.     // Initialize instance and cocos2d.  
  15.     if (!applicationDidFinishLaunching())  
  16.     {  
  17.         return 0;  
  18.     }  
  19.   
  20.     CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();  
  21.     pMainWnd->centerWindow();  
  22.     ShowWindow(pMainWnd->getHWnd(), SW_SHOW);  
  23.   
  24.     while (1)// 注意这里,主循环来了  
  25.     {  
  26.         if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
  27.         {  
  28.             // Get current time tick.  
  29.             QueryPerformanceCounter(&nNow);  
  30.   
  31.             // If it's the time to draw next frame, draw it, else sleep a while.  
  32.             if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)  
  33.             {  
  34.                 nLast.QuadPart = nNow.QuadPart;  
  35.                 CCDirector::sharedDirector()->mainLoop(); //看看这是神马  
  36.             }  
  37.             else  
  38.             {  
  39.                 Sleep(0);  
  40.             }  
  41.             continue;  
  42.         }  
  43.   
  44.         if (WM_QUIT == msg.message)  
  45.         {  
  46.             // Quit message loop.  
  47.             break;  
  48.         }  
  49.   
  50.         // Deal with windows message.  
  51.         if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))  
  52.         {  
  53.             TranslateMessage(&msg);  
  54.             DispatchMessage(&msg);  
  55.         }  
  56.     }  
  57.   
  58.     return (int) msg.wParam;  
  59. }  

不熟悉windows的童鞋估计都知道windows是消息驱动的。这个死循环就是用来处理windows的消息循环的,在其中处理了FPS逻辑,消息分发等。注意看其中红色标标注的
  1. CCDirector::sharedDirector()->mainLoop();  

这是神马东西啊!这个就是cocos2d-x的主循环了,由导演负责维护。从此就进入了cocos2d-x的世界,跟windows没有一毛钱关系了。


2.Android

Android平台的游戏是从一个Activity开始的。(话说好像Android的所有应用都是从Activity开始的吧)。

在引擎源码下有个目录是android的java代码,是模板代码,几乎所有的游戏都用这个,不怎么变。不信可以你可以看

YourCocos2dxDir/cocos2dx/platform/android/java这个目录,就是创建android工程的时候会去这个目录拷贝java代码作为模板。

来看看HelloCpp的代码

[java]  view plain copy print ?
  1. package org.cocos2dx.hellocpp;  
  2.   
  3. import org.cocos2dx.lib.Cocos2dxActivity;  
  4.   
  5. import android.os.Bundle;  
  6.   
  7. public class HelloCpp extends Cocos2dxActivity{  
  8.   
  9.     protected void onCreate(Bundle savedInstanceState){  
  10.         super.onCreate(savedInstanceState);  
  11.     }  
  12.       
  13.     static {  
  14.          System.loadLibrary("hellocpp");  
  15.     }  
  16. }  

很简单,对吧。几行代码而已,这里说明了两个问题

1. Cocos2dxActivity才是核心的Activity。

2. 游戏的C++部分包括引擎部分,被编译成了动态链接库hellocpp。这里就是加载了hellocpp动态链接库。

这个动态链接库是在用NDK编译的时候生成的,就是libs/armeabi/libhellocpp.so。(扯远了)


还是来看看Cocos2dxActivity这个Activity。

[java]  view plain copy print ?
  1. public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {  
  2.     // ===========================================================  
  3.     // Constants  
  4.     // ===========================================================  
  5.   
  6.     private static final String TAG = Cocos2dxActivity.class.getSimpleName();  
  7.   
  8.     // ===========================================================  
  9.     // Fields  
  10.     // ===========================================================  
  11.       
  12.     private Cocos2dxGLSurfaceView mGLSurfaceView;//注意这个SurfaceView  
  13.     private Cocos2dxHandler mHandler;  
  14.   
  15.     // ===========================================================  
  16.     // Constructors  
  17.     // ===========================================================  
  18.   
  19.     @Override  
  20.     protected void onCreate(final Bundle savedInstanceState) {  
  21.         super
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值