AndEngine学习文档格式.docx
《AndEngine学习文档格式.docx》由会员分享,可在线阅读,更多相关《AndEngine学习文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
AndEngineLiveWallpaperExtension:
AndEngineTexturePackerExtension:
AndEngineTMXTiledMapExtension:
AndEngineMultiplayerExtension:
AndEnginePhysicsBox2DExtension:
AndEngineSVGTextureRegionExtension:
AndEngineMODPlayerExtension:
AndEngineAugmentedRealityExtension:
PS:
如果git不会用请自行谷歌。
PS2:
github下的是持续更新的代码,如果要考虑支持更多机型,比如2.1以下,要去googlecode下载,点击打开链接
2.下载完成后,全部导入eclipse,编译会遇到的问题
a.编译AndEngine工程时,android:
targetSdkVersion最好大于8,最好要有2.3以后的sdk,因为引擎中有判断当前版本的代码,如果sdk不够,编译出错!
我华丽的选择4.0,毫无压力!
(ps:
是targetSdkVersion,而不是android:
minSdkVersion,这个可以写低调点无碍!
(ps2:
project.properties中的版本与targetSdkVersion一致)
b.编译8个扩展包,在每个工程中的project.properties中都写的target=android-15。
这个是很坑爹的,你要手动全部改成你有的sdk最高的版本,比如14(对应的是android4.0),如果还报错,可以看一下错误的位置,估计有的话都是在导入AndEngine包的错误,也就是说扩展包有的需要AndEngine支持,右键扩展包工程->
BuildPath->
ConfigureBuildPath,打开面板后,选择Addjar,找到AndEngine工程下bin目录下的andengine.jar包导入即可!
对于8个扩展包,都要按上述步骤配置!
3.AndEngine和扩展包都配置好了,你就可以使用AndEngine引擎了,但是如果你想要学习官方提供的demo,就要导入AndengineExamples了
(导入之后可能会有红色的叹号,主要是关联库的问题)
a.需要按照步骤2-b的操作,将AndEngine工程下bin目录下的andengine.jar和8个扩展工程下bin目录下的.jar包全部导入
b.将AndEngine工程下的libs目录拷贝到AndEngineExamples下(jni需要调用的c/c++库)
只要按着上述3步,基本上就没问题了!
好好看示例和源码吧!
AndEngine学习
(二):
AndEngine引擎运行原理
通过对于一般游戏的逻辑原理的分析,以及对AndEngine源码的阅读,总算是对游戏的一般架构以及AndEngine是如何实现这一架构的原理有了一定的了解,总结一下备忘!
一般的游戏主逻辑:
(在游戏的主线程中)
[java]<
spanstyle="
font-size:
16px;
"
>
while(true)
{
用户交互监听(用户输入)
逻辑运算
绘制屏幕
}<
/span>
<
while(true)
{
用户交互监听(用户输入)
逻辑运算
绘制屏幕
如果简单的写成这样会有一个很严重的问题,就是在不同配置的机器上游戏运行的效果不一样,因为线程是在一直不停的运行的,而不同的CPU会影响到逻辑的运算,而不同的GPU又会影响其绘制效率,所以就是,在不同的配置的机器上在一定的时间内,循环运行的次数是不一样的,假设一个精灵会在一帧中走10px,不同机器上每秒跑10帧和跑100帧,那么精灵就会出现在不同的机器上在相同的时间内移动的距离是不同的!
这是很严重的!
所以,主逻辑有了下面的改进,
startTime=currentTime;
用户输入监听
endTime=currentTime;
deltaTime=endTime-startTime;
if(deltaTime<
FRAME_LENGTH_PER_SECOND)
{
sleep(deltaTime);
}
startTime=currentTime;
用户输入监听
endTime=currentTime;
deltaTime=endTime-startTime;
if(deltaTime<
FRAME_LENGTH_PER_SECOND)
sleep(deltaTime);
}
注意currentTime是获取的系统当前时间,deltaTime即用于用户输入监听,逻辑运算的时间,而FRAME_LENGTH_PER_SECOND这个值很重要,这是我们希望每帧用的时间(当然是毫秒级的,即每秒/我们希望游戏在不同的机器上每秒都运行的帧数上限制,比如我们希望游戏在所有的机器上都保持在30帧以内,则FRAME_LENGTH_PER_SECOND=1000/30=33ms(毫秒)),当然我们是认为绘制屏幕过程很快的,如果使用双缓冲的话,在逻辑运算部分就已经将要绘制的内容绘制到缓冲区了,而绘制屏幕的过程则相当于缓冲区到屏幕的一个拷贝,过程会非常快!
帅帅的分割线===============================================================================================
下面就要来介绍一下AndEngine是来如何实现这个主线程死循环的!
在Engine类中有一个内部类UpdateThread类,
privateclassUpdateThreadextendsThread
//===========================================================
//Constants
//Fields
//Constructors
publicUpdateThread()
super(UpdateThread.class.getSimpleName());
//Getter&
Setter
//Methodsfor/fromSuperClass/Interfaces
@Override
publicvoidrun()
android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority());
try
while(true)
Engine.this.onTickUpdate();
catch(finalInterruptedExceptione)
Debug.d(this.getClass().getSimpleName()+"
interrupted.Don'
tworry-this"
+e.getClass().getSimpleName()+"
ismostlikelyexpected!
e);
this.interrupt();
//Methods
//InnerandAnonymousClasses
}<
privateclassUpdateThreadextendsThread
//===========================================================
//Constants
//Fields
//Constructors
publicUpdateThread()
super(UpdateThread.class.getSimpleName());
//Getter&
Setter
//Methodsfor/fromSuperClass/Interfaces
@Override
publicvoidrun()
android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority());
try
Engine.this.onTickUpdate();
catch(finalInterruptedExceptione)
Debug.d(this.getClass().getSimpleName()+"
+e.getClass().getSimpleName()+"
this.interrupt();
//Methods
//InnerandAnonymousClasses
看到了吧,在其run()方法中,就是这个游戏的主循环,而这个主线程是在Engine的构造方法中启动的(可以看代码)
问题来了,这只是实现的我们一般游戏的引擎,是有不同配置机器运行效率不同的问题的,当然我们可以靠TimerHandler来大概控制,可是却不是可靠的,那么我们想要的控制帧数的引擎该怎么做呢?
其实AndEngine已经为我们实现了,即LimitedFPSEngine类,从名字上看,这个类实现的功能就是和我们想要的控制帧数是一样的!
下面是LimitedFPSEngine类中的onUpdate方法,源码已经很认真的解释了控制帧数的原理,
@Override
publicvoidonUpdate(finallongpNanosecondsElapsed)throwsInterruptedException
finallongpreferredFrameLengthNanoseconds=this.mPreferredFrameLengthNanoseconds;
finallongdeltaFrameLengthNanoseconds=preferredFrameLengthNanoseconds-pNanosecondsElapsed;
if(deltaFrameLengthNanoseconds<
=0)
super.onUpdate(pNanosecondsElapsed);
else
finalintsleepTimeMilliseconds=(int)(deltaFrameLengthNanoseconds/NANOSECONDS_PER_MILLISECOND);
Thread.sleep(sleepTimeMilliseconds);
super.onUpdate(pNanosecondsElapsed+deltaFrameLengthNanoseconds);
publicvoidonUpdate(finallongpNanosecondsElapsed)throwsInterruptedException
finallongpreferredFrameLengthNanoseconds=this.mPreferredFrameLengthNanoseconds;
finallongdeltaFrameLengthNanoseconds=preferredFrameLengthNanoseconds-pNanosecondsElapsed;
if(deltaFrameLengthNanoseconds<
=0)
super.onUpdate(pNanosecondsElapsed);
else
finalintsleepTimeMilliseconds=(int)(deltaFrameLengthNanoseconds/NANOSECONDS_PER_MILLISECOND);
Thread.sleep(sleepTimeMilliseconds);
super.onUpdate(pNanosecondsElapsed+deltaFrameLengthNanoseconds);
LimitedFPSEngine是Engine的子类,在其onUpdate方法中,也会调用父类(Engine)的onUpdate方法,而Engine的onupdate方法就做了我们每帧需要的一些运算(Scene的更新是递归的噢)
这篇内容主要记录一下AndEngine的运行原理,下一篇将会记录一下AndEngine与我们的Android游戏的一些粘合点
不是大神,难免有疏漏,各位如果认为我在哪总结有不妥之处,敬请拍砖!
谢谢!
AndEngine学习(三):
AndEngine与Android的粘合点
AndEngine为我们提供了在Android中使用其引擎方便的接口!
众所周知,几乎每一个Android的应用和游戏都会有Activity(当然只有某些Service或者Reciver之类的除外。
),而作为游戏,Activity更是必不可少的,原因很简单,游戏需要与用户交互,游戏需要呈现出画面,这些,都需要Activity的支持。
再看