AndEngine2D游戏引擎资料Android学习资料大全AndEngine学习_第1页
AndEngine2D游戏引擎资料Android学习资料大全AndEngine学习_第2页
AndEngine2D游戏引擎资料Android学习资料大全AndEngine学习_第3页
AndEngine2D游戏引擎资料Android学习资料大全AndEngine学习_第4页
AndEngine2D游戏引擎资料Android学习资料大全AndEngine学习_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AndEngine学习(一):AndEngine环境配置及extension,AndEngineExamples导入 最近在看AndEngine,总结点东西备忘!其实AndEngine的配置相比较Libgdx(Android下的另一款游戏引擎),还是很好配置的!可能唯一麻烦点的是配置AndEngineExamples时导入各种扩展吧!详细步骤如下:1.git下载得到AndEngine源码,需要的8个extension,学习要用的AndEngineExamples(没有文档,所以就拿这个当API Demo看吧!)git库根地址:AndEngine git 库/nicolasgramlich好吧,我再写出更详细的吧。AndEngine源码:点击打开链接/nicolasgramlich/AndEngineAndEngineExamples:点击打开链接/nicolasgramlich/AndEngineExamples下面是需要的8个扩展包,包括神奇的Box2d,排名不分先后。AndEngineLiveWallpaperExtension:点击打开链接/nicolasgramlich/AndEngineLiveWallpaperExtensionAndEngineTexturePackerExtension:点击打开链接/nicolasgramlich/AndEngineTexturePackerExtensionAndEngineTMXTiledMapExtension:点击打开链接/nicolasgramlich/AndEngineTMXTiledMapExtensionAndEngineMultiplayerExtension:点击打开链接/nicolasgramlich/AndEngineMultiplayerExtensionAndEnginePhysicsBox2DExtension:点击打开链接/nicolasgramlich/AndEnginePhysicsBox2DExtensionAndEngineSVGTextureRegionExtension:点击打开链接/nicolasgramlich/AndEngineSVGTextureRegionExtensionAndEngineMODPlayerExtension:点击打开链接/nicolasgramlich/AndEngineMODPlayerExtensionAndEngineAugmentedRealityExtension:点击打开链接/nicolasgramlich/AndEngineAugmentedRealityExtensionPS:如果git不会用请自行谷歌。PS2:git hub下的是持续更新的代码,如果要考虑支持更多机型,比如2.1以下,要去google code下载,点击打开链接/p/andengine/2.下载完成后,全部导入eclipse,编译会遇到的问题a.编译AndEngine工程时,android:targetSdkVersion最好大于8,最好要有2.3以后的sdk,因为引擎中有判断当前版本的代码,如果sdk不够,编译出错!我华丽的选择4.0,毫无压力!(ps:是targetSdkVersion,而不是android:minSdkVersion,这个可以写低调点无碍!)(ps2: perties中的版本与targetSdkVersion一致)b.编译8个扩展包,在每个工程中的perties中都写的target=android-15。这个是很坑爹的,你要手动全部改成你有的sdk最高的版本,比如14(对应的是android 4.0),如果还报错,可以看一下错误的位置,估计有的话都是在导入AndEngine包的错误,也就是说扩展包有的需要AndEngine支持,右键扩展包工程-Build Path-Configure Build Path,打开面板后,选择Add jar,找到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 while (true) 用户交互监听(用户输入) 逻辑运算 绘制屏幕while (true)用户交互监听(用户输入)逻辑运算绘制屏幕如果简单的写成这样会有一个很严重的问题,就是在不同配置的机器上游戏运行的效果不一样,因为线程是在一直不停的运行的,而不同的CPU会影响到逻辑的运算,而不同的GPU又会影响其绘制效率,所以就是,在不同的配置的机器上在一定的时间内,循环运行的次数是不一样的,假设一个精灵会在一帧中走10px,不同机器上每秒跑10帧和跑100帧,那么精灵就会出现在不同的机器上在相同的时间内移动的距离是不同的!这是很严重的!所以,主逻辑有了下面的改进,java while (true) startTime = currentTime; 用户输入监听 逻辑运算 endTime = currentTime; deltaTime = endTime - startTime; if (deltaTime FRAME_LENGTH_PER_SECOND) sleep(deltaTime); 绘制屏幕while (true)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类,java private class UpdateThread extends Thread / = / Constants / = / = / Fields / = / = / Constructors / = public UpdateThread() super(UpdateThread.class.getSimpleName(); / = / Getter & Setter / = / = / Methods for/from SuperClass/Interfaces / = Override public void run() android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority(); try while (true) Engine.this.onTickUpdate(); catch (final InterruptedException e) Debug.d(this.getClass().getSimpleName() + interrupted. Dont worry - this + e.getClass().getSimpleName() + is most likely expected!, e); errupt(); / = / Methods / = / = / Inner and Anonymous Classes / = private class UpdateThread extends Thread/ =/ Constants/ =/ =/ Fields/ =/ =/ Constructors/ =public UpdateThread()super(UpdateThread.class.getSimpleName();/ =/ Getter & Setter/ =/ =/ Methods for/from SuperClass/Interfaces/ =Overridepublic void run()android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority();trywhile (true)Engine.this.onTickUpdate();catch (final InterruptedException e)Debug.d(this.getClass().getSimpleName() + interrupted. Dont worry - this + e.getClass().getSimpleName() + is most likely expected!, e);errupt();/ =/ Methods/ =/ =/ Inner and Anonymous Classes/ =看到了吧,在其run()方法中,就是这个游戏的主循环,而这个主线程是在Engine的构造方法中启动的(可以看代码)问题来了,这只是实现的我们一般游戏的引擎,是有不同配置机器运行效率不同的问题的,当然我们可以靠TimerHandler来大概控制,可是却不是可靠的,那么我们想要的控制帧数的引擎该怎么做呢?其实AndEngine已经为我们实现了,即 LimitedFPSEngine类,从名字上看,这个类实现的功能就是和我们想要的控制帧数是一样的!下面是LimitedFPSEngine类中的onUpdate方法,源码已经很认真的解释了控制帧数的原理,java Override public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException final long preferredFrameLengthNanoseconds = this.mPreferredFrameLengthNanoseconds; final long deltaFrameLengthNanoseconds = preferredFrameLengthNanoseconds - pNanosecondsElapsed; if (deltaFrameLengthNanoseconds = 0) super.onUpdate(pNanosecondsElapsed); else final int sleepTimeMilliseconds = (int) (deltaFrameLengthNanoseconds / NANOSECONDS_PER_MILLISECOND); Thread.sleep(sleepTimeMilliseconds); super.onUpdate(pNanosecondsElapsed + deltaFrameLengthNanoseconds); Overridepublic void onUpdate(final long pNanosecondsElapsed) throws InterruptedExceptionfinal long preferredFrameLengthNanoseconds = this.mPreferredFrameLengthNanoseconds;final long deltaFrameLengthNanoseconds = preferredFrameLengthNanoseconds - pNanosecondsElapsed;if (deltaFrameLengthNanoseconds = 0)super.onUpdate(pNanosecondsElapsed);elsefinal int sleepTimeMilliseconds = (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的支持。再看AndEngine的包结构,在/ui/activity/中,我们会发现BaseActivity,BaseGameActivity,SimpleBaseGameActivity。这些就是AndEngine中为我们做好的Activity的封装,其中继承关系是BaseActivity - BaseGameActivity - SimpleBaseGameActivity当然,从BaseGameActivity中继承的子类不止SimpleBaseGameActivity!在看AndEngineExamples(官方为我们提供的例子),我们会发现,几乎所有的例子都是继承于SimpleBaseGameActivity的。在BaseActivity中,只是定义了一些异步加载资源的方法,并没有做关于和引擎相关的处理。所以,再看BaseGameActivity,粗读源码发现,BaseGameActivity是在Android中使用AndEngine的最基本的类!其中有两个很重要的点,一是Engine(引擎),二是Render(渲染),这是最重要的一部分,我们分开来看!Engine的构造:当然是在Activity的生命周期方法的onCreate()中,也就是说我们在继承BaseGameActivity或者其子类的时候,不论我们重写或者不重写其onCreate(),ps:重写的话调用super.onCreate(),都会调用BaseGameActivity的onCreate()方法,这也就为我们提供了构造Engine的机制。至于Engine的构造java this.mEngine = this.onCreateEngine(this.mEngineOptions);this.mEngine = this.onCreateEngine(this.mEngineOptions);通过调用onCreateEngine(),如果大家试着使用AndEngine写过一些小Demo的话就会很清楚的知道,继承于BaseGameActivity或者其子类,都必须实现3个方法,onCreateEngine()就是其中的一个(当然也可能是onCreateEngineOptions(),如果我们使用默认的Engine引擎而不是其它的引擎的话,我们之需要配置引擎的参数即可)。Render的使用:其中另一个重要的部分就是游戏的绘制了!AndEngine是使用OpenGL来做的,所以就需要调用Android中的OpenGL部分,而Android中OpenGL的基本用法是:1.构造一个实现于GLSurfaceView的类,需要有一个自定义的Render类(见2),用于填充到Activity(通过setContentView()方法,ps:GLSurfaceView也是View的子类)2.自定义一个实现于GLSurfaceView.Render的类,为我们提供渲染的操作看源码BaseGameActivity中的onCreate()方法的最后一行java this.onSetContentView();this.onSetContentView();再看一下onSetContentView()的实现java protected void onSetContentView() this.mRenderSurfaceView = new RenderSurfaceView(this); this.mRenderSurfaceView.setRenderer(this.mEngine, this); this.setContentView(this.mRenderSurfaceView, BaseGameActivity.createSurfaceViewLayoutParams(); protected void onSetContentView()this.mRenderSurfaceView = new RenderSurfaceView(this);this.mRenderSurfaceView.setRenderer(this.mEngine, this);this.setContentView(this.mRenderSurfaceView, BaseGameActivity.createSurfaceViewLayoutParams();哈哈,和我们的分析是一样的!分析完了BaseGameActivity中最重要的两个部分,大家就会明白了,为什么我们只需要继承于BaseGameActivity或其子类,就可以使用Engine和绘制了吧!好了,今天就总结到这儿吧!后续会再丰富一下引擎的更新和绘制的原理的!各位看官早安,欢迎拍砖!(你的拍砖,才是我深入的切入点!谢谢!)AndEngine的第一个程序HelloWorldAndEngine的环境搭建好后,只运行Samples是远远不够的,要想真正了解如何使用这个框架,还是需要自己动手写写代码。先从简单的HelloWorld开始。目标:使用一张图片作为背景,并在屏幕中央显示“Hello World !”文字。1.新建一个Android工程,设置工程属性,让工程引用AndEngine工程。2.让工程的主Activity继承SimpleBaseGameActivity类。并实现基类中的几个方法:javapublic EngineOptions onCreateEngineOptions();public void onCreateResources();public Scene onCreateScene();这个类的全部代码如下:javapackage com.example.testandeng1;import org.andengine.engine.camera.Camera;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;import org.andengine.entity.Entity;import org.andengine.entity.scene.Scene;import org.andengine.entity.sprite.Sprite;import org.andengine.entity.text.Text;import org.andengine.opengl.font.Font;import org.andengine.opengl.font.FontFactory;import org.andengine.opengl.texture.TextureOptions;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;import org.andengine.opengl.texture.region.ITextureRegion;import org.andengine.ui.activity.SimpleBaseGameActivity;import android.graphics.Color;import android.opengl.GLES20;public class MainActivity extends SimpleBaseGameActivity public static final int CAMERA_WIDTH = 800; public static final int CAMERA_HEIGHT = 480; private static final int LAYER_COUNT = 2; private static final int LAYER_BACKGROUND = 0; private static final int LAYER_TEXT = LAYER_BACKGROUND + 1; private Scene mScene; private Font mFont; private BitmapTextureAtlas mBackgroundTexture; private ITextureRegion mBackgroundTextureRegion; private Text mHelloText; public EngineOptions onCreateEngineOptions() Camera mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy( CAMERA_WIDTH, CAMERA_HEIGHT), mCamera); return engineOptions; Override public void onCreateResources() /* Load the font we are going to use. */ FontFactory.setAssetBasePath(font/); this.mFont = FontFactory.createFromAsset(this.getFontManager(), this.getTextureManager(), 512, 512, TextureOptions.BILINEAR, this.getAssets(), GOTHIC.TTF, 32, true, Color.WHITE); this.mFont.load(); BitmapTextureAtlasTextureRegionFactory.setAssetBasePath(img/); /* Load all the textures this game needs. */ this.mBackgroundTexture = new BitmapTextureAtlas( this.getTextureManager(), 800, 480); this.mBackgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory .createFromAsset(this.mBackgroundTexture, this, android.png, 0, 0); this.mBackgroundTexture.load(); Override public Scene onCreateScene() this.mScene = new Scene(); for (int i = 0; i new-project.-Android Application Project点击next设置工程明等参数,例如:MoveBall,为了兼容工程版本,将SDk版本修改为2.1,如图所示:接着下一步,可以随便选择你要的图标然后next .finish就完成了初始工程的创建3.修改原始工程鼠标放在MoveBall项目上,右键选择Build Path-Configure build path然后选择Projects,点击右边的Add.选择上AndEngine点击OK就可以将AndEngine项目添加到工程了打开MoveBall,java,将MoveBall extends Activity修改为MoveBall extends BaseGameActivity.接着写代码:javapackage season.lxx.moveball;import org.andengine.engine.camera.Camera;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.IResolutionPolicy;import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;import org.andengine.entity.scene.Scene;import org.andengine.entity.scene.background.RepeatingSpriteBackground;import org.andengine.entity.sprite.AnimatedSprite;import org.andengine.entity.sprite.TiledSprite;import org.andengine.entity.sprite.vbo.ITiledSpriteVertexBufferObject;import org.andengine.opengl.texture.TextureOptions;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;import org.andengine.opengl.texture.atlas.bitmap.source.AssetBitmapTextureAtlasSource;import org.andengine.opengl.texture.region.ITiledTextureRegion;import org.andengine.opengl.texture.region.TiledTextureRegion;import org.andengine.opengl.vbo.VertexBufferObjectManager;import org.andengine.ui.activity.BaseGameActivity;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.support.v4.app.NavUtils

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论