cocos2dx课程游戏主循环.docx
- 文档编号:26538138
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:22
- 大小:223.79KB
cocos2dx课程游戏主循环.docx
《cocos2dx课程游戏主循环.docx》由会员分享,可在线阅读,更多相关《cocos2dx课程游戏主循环.docx(22页珍藏版)》请在冰豆网上搜索。
cocos2dx课程游戏主循环
cocos2dx课程游戏主循环
部门:
xxx
时间:
xxx
制作人:
xxx
整理范文,仅供参考,可下载自行修改
cocos2d-x学习MoonWarriorsx(四>小节一:
游戏主循环。
终于抽时间把这个游戏写完了。
由于没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。
自此,我算是完成了一个功能比较完善的游戏了。
麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。
这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记了。
b5E2RGbCAP
首先还是就我个人的理解,讲讲游戏引擎的处理流程。
其实游戏逻辑简单化就是一个死循环,如下:
boolgame_is_running=true。
while(game_is_running>{
update_game(>。
display_game(>。
}
我们所看到的游戏画面,游戏音乐,以及一些触控,输入等。
在逻辑上就是这么一个死循环。
这个循环一直再跑,期间会处理一些列的事件,简化之就是上面的两个函数。
p1EanqFDPw
cocos2d-x引擎也是如此,所有的逻辑都是在这个主循环下实现的。
下面看看cocos2dx在各平台上的主循环实现。
DXDiTa9E3d
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(>。
RTCrpUDGiT
eglView->setFrameSize(2048,1536>。
//Theresolutionofipad3isverylarge.Ingeneral,PC'sresolutionissmallerthanit.5PCzVD7HxA
//Soweneedtoinvoke'setFrameZoomFactor'(onlyvalidondesktop(win32,mac,linux>>tomakethewindowsmaller.jLBHrnAILg
eglView->setFrameZoomFactor(0.4f>。
returnCCApplication:
:
sharedApplication(>->run(>。
//注意这里xHAQX74J0X
}
前面都不要关心,只是用来传递OpenGL窗口的,关键是最后一句,CCApplication:
:
sharedApplication(>->run(>。
看这个run函数:
LDAYtRyKfE
intCCApplication:
:
run(>
{
PVRFrameEnableControlWindow(false>。
//Mainmessageloop:
MSGmsg。
LARGE_INTEGERnFreq。
LARGE_INTEGERnLast。
LARGE_INTEGERnNow。
QueryPerformanceFrequency(&nFreq>。
QueryPerformanceCounter(&nLast>。
//Initializeinstanceandcocos2d.
if(!
applicationDidFinishLaunching(>>
{
return0。
}
CCEGLView*pMainWnd=CCEGLView:
:
sharedOpenGLView(>。
Zzz6ZB2Ltk
pMainWnd->centerWindow(>。
ShowWindow(pMainWnd->getHWnd(>,SW_SHOW>。
while(1>//注意这里,主循环来了
{
if(!
PeekMessage(&msg,NULL,0,0,PM_REMOVE>>
{
//Getcurrenttimetick.
QueryPerformanceCounter(&nNow>。
//Ifit'sthetimetodrawnextframe,drawit,elsesleepawhile.dvzfvkwMI1
if(nNow.QuadPart-nLast.QuadPart>m_nAnimationInterval.QuadPart>rqyn14ZNXI
{
nLast.QuadPart=nNow.QuadPart。
CCDirector:
:
sharedDirector(>->mainLoop(>。
//看看这是神马EmxvxOtOco
}
else
{
Sleep(0>。
}
continue。
}
if(WM_QUIT==msg.message>
{
//Quitmessageloop.
break。
}
//Dealwithwindowsmessage.
if(!
m_hAccelTable||!
TranslateAccelerator(msg.hwnd,m_hAccelTable,&msg>>SixE2yXPq5
{
TranslateMessage(&msg>。
DispatchMessage(&msg>。
}
}
return(int>msg.wParam。
}
不熟悉windows的童鞋估计都知道windows是消息驱动的。
这个死循环就是用来处理windows的消息循环的,在其中处理了FPS逻辑,消息分发等。
注意看其中红色标标注的6ewMyirQFL
CCDirector:
:
sharedDirector(>->mainLoop(>。
这是神马东西啊!
这个就是cocos2d-x的主循环了,由导演负责维护。
从此就进入了cocos2d-x的世界,跟windows没有一毛钱关系了。
kavU42VRUs
2.Android
Android平台的游戏是从一个Activity开始的。
(话说好像Android的所有应用都是从Activity开始的吧>。
y6v3ALoS89
在引擎源码下有个目录是android的java代码,是模板代码,几乎所有的游戏都用这个,不怎么变。
不信可以你可以看M2ub6vSTnP
YourCocos2dxDir/cocos2dx/platform/android/java这个目录,就是创建android工程的时候回去这个拷贝java代码作为模板。
0YujCfmUCw
来看看HelloCpp的代码
packageorg.cocos2dx.hellocpp。
importorg.cocos2dx.lib.Cocos2dxActivity。
importandroid.os.Bundle。
publicclassHelloCppextendsCocos2dxActivity{
protectedvoidonCreate(BundlesavedInstanceState>{eUts8ZQVRd
super.onCreate(savedInstanceState>。
}
static{
System.loadLibrary("hellocpp">。
}
}
很简单,对吧。
几行代码而已,这里说明了两个问题
1.Cocos2dxActivity才是核心的Activity。
2.游戏的C++部分包括引擎部分,被编译成了动态链接库hellocpp。
这里就是加载了hellocpp动态链接库。
sQsAEJkW5T
这个动态链接库是在用NDK编译的时候生成的,就是libs/armeabi/libhellocpp.so。
<扯远了)GMsIasNXkA
还是来看看Cocos2dxActivity这个Activity。
publicabstractclassCocos2dxActivityextendsActivityimplementsCocos2dxHelperListener{TIrRGchYzg
//===========================================================7EqZcWLZNX
//Constants
//===========================================================lzq7IGf02E
privatestaticfinalStringTAG=Cocos2dxActivity.class.getSimpleName(>。
zvpgeqJ1hk
//===========================================================NrpoJac3v1
//Fields
//===========================================================1nowfTG4KI
privateCocos2dxGLSurfaceViewmGLSurfaceView。
//注意这个SurfaceViewfjnFLDa5Zo
privateCocos2dxHandlermHandler。
//===========================================================tfnNhnE6e5
//Constructors
//===========================================================HbmVN777sL
@Override
protectedvoidonCreate(finalBundlesavedInstanceState>{V7l4jRB8Hs
super.onCreate(savedInstanceState>。
this.mHandler=newCocos2dxHandler(this>。
this.init(>。
Cocos2dxHelper.init(this,this>。
}
//===========================================================83lcPA59W9
//Getter&Setter
//===========================================================mZkklkzaaP
//===========================================================AVktR43bpw
//Methodsfor/fromSuperClass/Interfaces
//===========================================================ORjBnOwcEd
@Override
protectedvoidonResume(>{
super.onResume(>。
Cocos2dxHelper.onResume(>。
this.mGLSurfaceView.onResume(>。
}
@Override
protectedvoidonPause(>{
super.onPause(>。
Cocos2dxHelper.onPause(>。
this.mGLSurfaceView.onPause(>。
}
@Override
publicvoidshowDialog(finalStringpTitle,finalStringpMessage>{2MiJTy0dTT
Messagemsg=newMessage(>。
msg.what=Cocos2dxHandler.HANDLER_SHOW_DIALOG。
msg.obj=newCocos2dxHandler.DialogMessage(pTitle,pMessage>。
gIiSpiue7A
this.mHandler.sendMessage(msg>。
}
@Override
publicvoidshowEditTextDialog(finalStringpTitle,finalStringpContent,finalintpInputMode,finalintpInputFlag,finalintpReturnType,finalintpMaxLength>{uEh0U1Yfmh
Messagemsg=newMessage(>。
msg.what=Cocos2dxHandler.HANDLER_SHOW_EDITBOX_DIALOG。
IAg9qLsgBX
msg.obj=newCocos2dxHandler.EditBoxMessage(pTitle,pContent,pInputMode,pInputFlag,pReturnType,pMaxLength>。
WwghWvVhPE
this.mHandler.sendMessage(msg>。
}
@Override
publicvoidrunOnGLThread(finalRunnablepRunnable>{asfpsfpi4k
this.mGLSurfaceView.queueEvent(pRunnable>。
}
//===========================================================ooeyYZTjj1
//Methods
//===========================================================BkeGuInkxI
publicvoidinit(>{
//FrameLayout
ViewGroup.LayoutParamsframelayout_params=
newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,PgdO0sRlMo
ViewGroup.LayoutParams.FILL_PARENT>。
FrameLayoutframelayout=newFrameLayout(this>。
//帧布局,可一层一层覆盖3cdXwckm15
framelayout.setLayoutParams(framelayout_params>。
//Cocos2dxEditTextlayout
ViewGroup.LayoutParamsedittext_layout_params=
newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,h8c52WOngM
ViewGroup.LayoutParams.WRAP_CONTENT>。
Cocos2dxEditTextedittext=newCocos2dxEditText(this>。
v4bdyGious
edittext.setLayoutParams(edittext_layout_params>。
//...addtoFrameLayout
framelayout.addView(edittext>。
//Cocos2dxGLSurfaceView
this.mGLSurfaceView=this.onCreateView(>。
//...addtoFrameLayout
framelayout.addView(this.mGLSurfaceView>。
//添加GLSurfaceViewJ0bm4qMpJ9
this.mGLSurfaceView.setCocos2dxRenderer(newCocos2dxRenderer(>>。
//注意这行,一个渲染器XVauA9grYP
this.mGLSurfaceView.setCocos2dxEditText(edittext>。
//Setframelayoutasthecontentview
setContentView(framelayout>。
}
publicCocos2dxGLSurfaceViewonCreateView(>{
returnnewCocos2dxGLSurfaceView(this>。
}
//===========================================================bR9C6TJscw
//InnerandAnonymousClasses
//===========================================================pN9LBDdtrd
}
代码很多,呵呵。
其实核心就是那个mGLSurfaceView和它的渲染器newCocos2dxRenderer(>。
在Android上,OpenGL的渲染是由一个GLSurfaceView和其渲染器Render组成。
GLSurfaceView显示界面,Render渲染更新。
这个Render其实是一个渲染线程,不停再跑,由框架层维护。
这里不多讲。
DJ8T7nHuGT
来看这个Cocos2dxRenderer
packageorg.cocos2dx.lib。
importjavax.microedition.khronos.egl.EGLConfig。
importjavax.microedition.khronos.opengles.GL10。
importandroid.opengl.GLSurfaceView。
publicclassCocos2dxRendererimplementsGLSurfaceView.Renderer{QF81D7bvUA
//===========================================================4B7a9QFw9h
//Constants
//===========================================================ix6iFA8xoX
privatefinalstaticlongNANOSECONDSPERSECOND=1000000000L。
wt6qbkCyDE
privatefinalstaticlongNANOSECONDSPERMICROSECOND=1000000。
Kp5zH46zRk
privatestaticlongsAnimationInterval=(long>(1.0/60*Cocos2dxRenderer.NANOSECONDSPERSECOND>。
Yl4HdOAA61
//===========================================================ch4PJx4BlI
//Fields
//===========================================================qd3YfhxCzo
privatelongmLastTickInNanoSeconds。
privateintmScreenWidth。
privateintmScreenHeight。
//===========================================================E836L11DO5
//Constructors
//===========================================================S42ehLvE3M
//===========================================================501nNvZFis
//Getter&Setter
//===========================================================jW1viftGw9
publicstaticvoidsetAnimationInterval(finaldoublepAnimationInterval>{xS0DOYWHLP
Cocos2dxRenderer.sAnimationInterval=(long>(pAnimationInterval*Cocos2dxRenderer.NANOSECONDSPERSECOND>。
LOZMkIqI0w
}
publicvoidsetScreenWidthAndHeight(finalintpSurfaceWidth,finalintpSurfaceHeight>{ZKZUQsUJed
this.mScreenWidth=pSurfaceWidth。
this.mScreenHeight=pSurfaceHeight。
}
//===========================================================dGY2mcoKtT
//Methodsfor/fromSuperClass/Interfaces
//===========================================================rCYbSWRLIA
@Override//①注意这里
publicvoidonSurfaceCreated(finalGL10pGL10,finalEGLConfigpEGLConfig>{FyXjoFlMWh
Cocos2dxRenderer.nativeInit(this.mScreenWidth,this.mScreenHei
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- cocos2dx 课程 游戏 循环