cocos2dx课程游戏主循环.docx
- 文档编号:30119813
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:26
- 大小:23.50KB
cocos2dx课程游戏主循环.docx
《cocos2dx课程游戏主循环.docx》由会员分享,可在线阅读,更多相关《cocos2dx课程游戏主循环.docx(26页珍藏版)》请在冰豆网上搜索。
cocos2dx课程游戏主循环
cocos2d-x学习MoonWarriorsx(四>小节一:
游戏主循环。
终于抽时间把这个游戏写完了。
因为没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。
自此,我算是完成了一个功能比较完善的游戏了。
麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。
这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记了。
首先还是就我个人的理解,讲讲游戏引擎的处理流程。
其实游戏逻辑简单化就是一个死循环,如下:
boolgame_is_running=true。
while(game_is_running>{
update_game(>。
display_game(>。
}
我们所看到的游戏画面,游戏音乐,以及一些触控,输入等。
在逻辑上就是这么一个死循环。
这个循环一直再跑,期间会处理一些列的事件,简化之就是上面的两个函数。
cocos2d-x引擎也是如此,所有的逻辑都是在这个主循环下实现的。
下面看看cocos2dx在各平台上的主循环实现。
1.Win
看它的main.cpp
#include"main.h"
#include"../Classes/AppDelegate.h"
#include"CCEGLView.h"
USING_NS_CC。
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow>
{
UNREFERENCED_PARAMETER(hPrevInstance>。
UNREFERENCED_PARAMETER(lpCmdLine>。
//createtheapplicationinstance
AppDelegateapp。
CCEGLView*eglView=CCEGLView:
:
sharedOpenGLView(>。
eglView->setFrameSize(2048,1536>。
//Theresolutionofipad3isverylarge.Ingeneral,PC'sresolutionissmallerthanit.
//Soweneedtoinvoke'setFrameZoomFactor'(onlyvalidondesktop(win32,mac,linux>>tomakethewindowsmaller.
eglView->setFrameZoomFactor(0.4f>。
returnCCApplication:
:
sharedApplication(>->run(>。
//注意这里
}
前面都不要关心,只是用来传递OpenGL窗口的,关键是最后一句,CCApplication:
:
sharedApplication(>->run(>。
看这个run函数:
intCCApplication:
:
run(>
{
PVRFrameEnableControlWindow(false>。
//Mainmessageloop:
MSGmsg。
LARGE_INTEGERnFreq。
LARGE_INTEGERnLast。
LARGE_INTEGERnNow。
QueryPerformanceFrequency(&nFreq>。
QueryPerformanceCounter(&nLast>。
//Initializeinstanceandcocos2d.
if(!
applicationDidFinishLaunching(>>
{
return0。
}
CCEGLView*pMainWnd=CCEGLView:
:
sharedOpenGLView(>。
pMainWnd->centerWindow(>。
ShowWindow(pMainWnd->getHWnd(>,SW_SHOW>。
while(1>//注意这里,主循环来了
{
if(!
PeekMessage(&msg,NULL,0,0,PM_REMOVE>>
{
//Getcurrenttimetick.
QueryPerformanceCounter(&nNow>。
//Ifit'sthetimetodrawnextframe,drawit,elsesleepawhile.
if(nNow.QuadPart-nLast.QuadPart>m_nAnimationInterval.QuadPart>
{
nLast.QuadPart=nNow.QuadPart。
CCDirector:
:
sharedDirector(>->mainLoop(>。
//看看这是神马
}
else
{
Sleep(0>。
}
continue。
}
if(WM_QUIT==msg.message>
{
//Quitmessageloop.
break。
}
//Dealwithwindowsmessage.
if(!
m_hAccelTable||!
TranslateAccelerator(msg.hwnd,m_hAccelTable,&msg>>
{
TranslateMessage(&msg>。
DispatchMessage(&msg>。
}
}
return(int>msg.wParam。
}
不熟悉windows的童鞋估计都知道windows是消息驱动的。
这个死循环就是用来处理windows的消息循环的,在其中处理了FPS逻辑,消息分发等。
注意看其中红色标标注的
CCDirector:
:
sharedDirector(>->mainLoop(>。
这是神马东西啊!
这个就是cocos2d-x的主循环了,由导演负责维护。
从此就进入了cocos2d-x的世界,跟windows没有一毛钱关系了。
2.Android
Android平台的游戏是从一个Activity开始的。
(话说好像Android的所有应用都是从Activity开始的吧>。
在引擎源码下有个目录是android的java代码,是模板代码,几乎所有的游戏都用这个,不怎么变。
不信可以你可以看
YourCocos2dxDir/cocos2dx/platform/android/java这个目录,就是创建android项目的时候回去这个拷贝java代码作为模板。
来看看HelloCpp的代码
packageorg.cocos2dx.hellocpp。
importorg.cocos2dx.lib.Cocos2dxActivity。
importandroid.os.Bundle。
publicclassHelloCppextendsCocos2dxActivity{
protectedvoidonCreate(BundlesavedInstanceState>{
super.onCreate(savedInstanceState>。
}
static{
System.loadLibrary("hellocpp">。
}
}
很简单,对吧。
几行代码而已,这里说明了两个问题
1.Cocos2dxActivity才是核心的Activity。
2.游戏的C++部分包括引擎部分,被编译成了动态链接库hellocpp。
这里就是加载了hellocpp动态链接库。
这个动态链接库是在用NDK编译的时候生成的,就是libs/armeabi/libhellocpp.so。
<扯远了)
还是来看看Cocos2dxActivity这个Activity。
publicabstractclassCocos2dxActivityextendsActivityimplementsCocos2dxHelperListener{
//===========================================================
//Constants
//===========================================================
privatestaticfinalStringTAG=Cocos2dxActivity.class.getSimpleName(>。
//===========================================================
//Fields
//===========================================================
privateCocos2dxGLSurfaceViewmGLSurfaceView。
//注意这个SurfaceView
privateCocos2dxHandlermHandler。
//===========================================================
//Constructors
//===========================================================
@Override
protectedvoidonCreate(finalBundlesavedInstanceState>{
super.onCreate(savedInstanceState>。
this.mHandler=newCocos2dxHandler(this>。
this.init(>。
Cocos2dxHelper.init(this,this>。
}
//===========================================================
//Getter&Setter
//===========================================================
//===========================================================
//Methodsfor/fromSuperClass/Interfaces
//===========================================================
@Override
protectedvoidonResume(>{
super.onResume(>。
Cocos2dxHelper.onResume(>。
this.mGLSurfaceView.onResume(>。
}
@Override
protectedvoidonPause(>{
super.onPause(>。
Cocos2dxHelper.onPause(>。
this.mGLSurfaceView.onPause(>。
}
@Override
publicvoidshowDialog(finalStringpTitle,finalStringpMessage>{
Messagemsg=newMessage(>。
msg.what=Cocos2dxHandler.HANDLER_SHOW_DIALOG。
msg.obj=newCocos2dxHandler.DialogMessage(pTitle,pMessage>。
this.mHandler.sendMessage(msg>。
}
@Override
publicvoidshowEditTextDialog(finalStringpTitle,finalStringpContent,finalintpInputMode,finalintpInputFlag,finalintpReturnType,finalintpMaxLength>{
Messagemsg=newMessage(>。
msg.what=Cocos2dxHandler.HANDLER_SHOW_EDITBOX_DIALOG。
msg.obj=newCocos2dxHandler.EditBoxMessage(pTitle,pContent,pInputMode,pInputFlag,pReturnType,pMaxLength>。
this.mHandler.sendMessage(msg>。
}
@Override
publicvoidrunOnGLThread(finalRunnablepRunnable>{
this.mGLSurfaceView.queueEvent(pRunnable>。
}
//===========================================================
//Methods
//===========================================================
publicvoidinit(>{
//FrameLayout
ViewGroup.LayoutParamsframelayout_params=
newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT>。
FrameLayoutframelayout=newFrameLayout(this>。
//帧布局,可一层一层覆盖
framelayout.setLayoutParams(framelayout_params>。
//Cocos2dxEditTextlayout
ViewGroup.LayoutParamsedittext_layout_params=
newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT>。
Cocos2dxEditTextedittext=newCocos2dxEditText(this>。
edittext.setLayoutParams(edittext_layout_params>。
//...addtoFrameLayout
framelayout.addView(edittext>。
//Cocos2dxGLSurfaceView
this.mGLSurfaceView=this.onCreateView(>。
//...addtoFrameLayout
framelayout.addView(this.mGLSurfaceView>。
//添加GLSurfaceView
this.mGLSurfaceView.setCocos2dxRenderer(newCocos2dxRenderer(>>。
//注意这行,一个渲染器
this.mGLSurfaceView.setCocos2dxEditText(edittext>。
//Setframelayoutasthecontentview
setContentView(framelayout>。
}
publicCocos2dxGLSurfaceViewonCreateView(>{
returnnewCocos2dxGLSurfaceView(this>。
}
//===========================================================
//InnerandAnonymousClasses
//===========================================================
}
代码很多,呵呵。
其实核心就是那个mGLSurfaceView和它的渲染器newCocos2dxRenderer(>。
在Android上,OpenGL的渲染是由一个GLSurfaceView和其渲染器Render组成。
GLSurfaceView显示界面,Render渲染更新。
这个Render其实是一个渲染线程,不停再跑,由框架层维护。
这里不多讲。
来看这个Cocos2dxRenderer
packageorg.cocos2dx.lib。
importjavax.microedition.khronos.egl.EGLConfig。
importjavax.microedition.khronos.opengles.GL10。
importandroid.opengl.GLSurfaceView。
publicclassCocos2dxRendererimplementsGLSurfaceView.Renderer{
//===========================================================
//Constants
//===========================================================
privatefinalstaticlongNANOSECONDSPERSECOND=1000000000L。
privatefinalstaticlongNANOSECONDSPERMICROSECOND=1000000。
privatestaticlongsAnimationInterval=(long>(1.0/60*Cocos2dxRenderer.NANOSECONDSPERSECOND>。
//===========================================================
//Fields
//===========================================================
privatelongmLastTickInNanoSeconds。
privateintmScreenWidth。
privateintmScreenHeight。
//===========================================================
//Constructors
//===========================================================
//===========================================================
//Getter&Setter
//===========================================================
publicstaticvoidsetAnimationInterval(finaldoublepAnimationInterval>{
Cocos2dxRenderer.sAnimationInterval=(long>(pAnimationInterval*Cocos2dxRenderer.NANOSECONDSPERSECOND>。
}
publicvoidsetScreenWidthAndHeight(finalintpSurfaceWidth,finalintpSurfaceHeight>{
this.mScreenWidth=pSurfaceWidth。
this.mScreenHeight=pSurfaceHeight。
}
//===========================================================
//Methodsfor/fromSuperClass/Interfaces
//===========================================================
@Override//①注意这里
publicvoidonSurfaceCreated(finalGL10pGL10,finalEGLConfigpEGLConfig>{
Cocos2dxRenderer.nativeInit(this.mScreenWidth,this.mScreenHeight>。
//②初始化窗口
this.mLastTickInNanoSeconds=System.nanoTime(>。
}
@Override
publicvoidonSurfaceChanged(finalGL10pGL10,finalintpWidth,finalintpHeight>{
}
@Override//③注意这里
publicvoidonDrawFrame(finalGL10gl>{
/*
*FPScontrollingalgorithmisnotaccurate,anditwillslowdownFPS
*onsomedevices.SocommentFPScontrollingcode.
*/
/*
finallongnowInNanoSeconds=System.nanoTime(>。
finallonginterval=nowInNanoSeconds-this.mLastTickInNanoSeconds。
*/
//shouldrenderaframewhenonDrawFrame(>iscalledorthereisa
//"ghost"
Cocos2dxRenderer.nativeRender(>。
//④特别注意这个
/*
//fpscontrolling
if(interval
try{
//becausewerenderitbefore,soweshoulds
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- cocos2dx 课程 游戏 循环