Android平衡球项目之andEngine的物理世界开发文档.docx
《Android平衡球项目之andEngine的物理世界开发文档.docx》由会员分享,可在线阅读,更多相关《Android平衡球项目之andEngine的物理世界开发文档.docx(15页珍藏版)》请在冰豆网上搜索。
![Android平衡球项目之andEngine的物理世界开发文档.docx](https://file1.bdocx.com/fileroot1/2023-1/29/4c2f944b-e450-4310-8822-40a707736c98/4c2f944b-e450-4310-8822-40a707736c981.gif)
Android平衡球项目之andEngine的物理世界开发文档
[Android]平衡球项目之andEngine的物理世界开发文档
1.项目概述:
项目名称:
Android平衡球项目之andEngine的物理世界游戏开发。
项目用途:
设计一款简单的平衡球游戏,实现其在智能真机和模拟机上的运行。
2.需求分析:
我们组做的是平衡球项目。
作为一个平衡球,首先让小球实现碰撞,弹性等物理性质。
在重力感应方面android有自己的处理模块,由此我们想到了物理引擎。
在综合一切因素之后,我们决定选用andEngine作为我们的设计支柱。
andEngine是一个基于OpenGLES图形接口和box2d的物理引擎,其包含的物理引擎来自于BOX2D。
3.总体设计:
andEngine引擎的主类必须继承BaseGameActivity,它最终继承类Activity。
主类需要完成四个基本函数的重载,以下的重载顺序也是引擎工作的执行顺序。
(1).onLoadEngine()
负责产生一个镜头和加载一个引擎实体。
记住,你后面在手机上看到的东西都是透过镜头看到的,镜头指定了游戏的解析率,无论你的手机屏幕分辨率多少,引擎都会按照自己指定的分辨率去重造你的屏幕。
设定好镜头以后返回一个以此镜头为标准的引擎实体。
(2).onLoadResource()
加载资源。
其实加载资源多的工作可以放到onLoadScene()里面完成,但是作者既然写了这么个函数,我猜他就是想让代码层次清晰一些,在这里面你可以加载你需要的资源,以便后面加载场景的时候使用。
(3).onLoadScene()
加载场景。
有了镜头,就应该由场景吧,导演一般都是这么想的。
这时候你需要创建一个场景,场景里加载刚才的资源,最后将场景返回,最基本的游戏就可以起来了,此时游戏是没有规则的,但是程序已经可以启动,画面里只有你加载的资源。
(4).onLoadComplete()
这个函数是Option选项,写在其中的代码将在场景加载完毕后执行,相当于善后工作。
4.详细设计:
[Android]平衡球项目之andEngine资源加载
andEngine的资源加载十分简单,大概分为以下几步:
(1).构建实体
andEngine的库里有一个包就是Entity,中文翻译就是实体,Entity类下有很多类,他们都算实体类,可以生成实体,一个简单的举行实体如何定义:
Shaperectangle=newRectangle(0,0,50,50);
参数表明在(0,0)坐标点生成一个宽50高50的矩形,单位是像素,这样,一个实体就构建好了。
(2).加载实体
前面说过,我们看到手机屏幕显示的东西都是透过镜头(Camera)的,镜头看到的永远是场景(Scene),所以实体是加到场景里的,所以可以用如下语句加载实体:
this.scene.getTopLayer().addEntity(rectangle);
因为场景可以分层(Layer),所以我们用getTopLayer()来获取顶层场景。
我们前面谈及了如何在场景里加载实体,下面我们将讲讲我们如何让实体实现物理性质。
[Android]平衡球项目之andEngine的物理世界
很多物理引擎和游戏引擎都会有世界(World)的概念,andEngine也不例外,我们就是通过在场景里设置物理世界使得其中的物体具有物理性质的。
(1).主类中的一个成员变量:
privatePhysicalWorldworld;
(2).创建world实例:
this.world=newFixedStepPhysicsWorld(30,vector,false,8,1);
其中30代表FPS,vector代表了指定的重力加速度矢量,为Vector2类。
(3).这里有一个中间概念,物理对象,加入物理世界的实体通过物理对象赋予物理性质:
PrivatefinalFixtureDefwallFixtureDef=PhysicsFactory.createFixtureDef(1,0.5f,0.5f);
这里的参数决定了物理性质。
(4).为场景里的实体创造body,使其有血有肉:
Bodybody=PhysicsFactory.createBoxBody(world,ball,BodyType.DynamicBody,wallFixtureDef);
其中world指定所在的世界,为ball赋予物理性质,生成一个动态物体,与物理物体关联,产生一样的物理性质。
(5).为实体注册物理世界,这样才能使其具有物理性质:
world.registerPhysicsConnector(newPhysicsConnector(entityBrick,entityBody,true,true,false,false));
为实体entityBrick以entityBody生成物理物体。
至此,一个具有物理性质的实体就创建好了。
5.主要程序说明:
packagead.PW;
importjava.util.ArrayList;
importorg.anddev.andengine.engine.Engine;
importorg.anddev.andengine.engine.camera.Camera;
importorg.anddev.andengine.engine.options.EngineOptions;
importorg.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
importorg.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
importorg.anddev.andengine.entity.primitive.Line;
importorg.anddev.andengine.entity.primitive.Rectangle;
importorg.anddev.andengine.entity.scene.Scene;
importorg.anddev.andengine.entity.shape.Shape;
importorg.anddev.andengine.entity.util.FPSLogger;
importorg.anddev.andengine.extension.physics.box2d.FixedStepPhysicsWorld;
importorg.anddev.andengine.extension.physics.box2d.PhysicsConnector;
importorg.anddev.andengine.extension.physics.box2d.PhysicsFactory;
importorg.anddev.andengine.extension.physics.box2d.PhysicsWorld;
importorg.anddev.andengine.opengl.texture.Texture;
importorg.anddev.andengine.opengl.texture.TextureOptions;
importorg.anddev.andengine.opengl.texture.region.TextureRegion;
importorg.anddev.andengine.opengl.texture.region.TextureRegionFactory;
importorg.anddev.andengine.opengl.texture.region.TiledTextureRegion;
importorg.anddev.andengine.sensor.accelerometer.AccelerometerData;
importorg.anddev.andengine.sensor.accelerometer.IAccelerometerListener;
importorg.anddev.andengine.ui.activity.BaseGameActivity;
importcom.badlogic.gdx.math.Vector2;
importcom.badlogic.gdx.physics.box2d.Body;
importcom.badlogic.gdx.physics.box2d.FixtureDef;
importcom.badlogic.gdx.physics.box2d.BodyDef.BodyType;
publicclassPWActivityextendsBaseGameActivityimplementsIAccelerometerListener{
/**Calledwhentheactivityisfirstcreated.*/
//ForEngine
privateCameracamera;
//ForScene
publicPhysicsWorldworld;
//Gravity
publicVector2vector;
publicfloatGravityX;
publicfloatGravityY;
publicfloatGravityLimit=10;
//Ball
publicTextureballTexture;
publicTiledTextureRegionballTextureRegion;
privateBallball;
//Bricks
privateDoorenterBrick;
privateTextureenterTexture;
privateTextureRegionenterTextureRegion;
privateDoorexitBrick;
privateTextureexitTexture;
privateTextureRegionexitTextureRegion;
publicArrayListbricks;
//Enter
publicArrayListenters;
//createaphysicalobject
privatefinalFixtureDefwallFixtureDef=PhysicsFactory.createFixtureDef(1,0.5f,0.5f);
//createborders
publicLinebottom;
publicLinetop;
publicLineleft;
publicLineright;
publicScenescene;
publicSceneprevScene;
staticScenescene1;
staticScenescene2;
publicEngineonLoadEngine(){
camera=newCamera(10,10,460,320);
returnnewEngine(newEngineOptions(true,ScreenOrientation.LANDSCAPE,newRatioResolutionPolicy(460,320),camera));
}
publicvoidonLoadResources(){
ballTexture=newTexture(128,128,TextureOptions.DEFAULT);
ballTextureRegion=TextureRegionFactory.createTiledFromAsset(ballTexture,this,"silver_ball.png",0,32,2,1);
enterTexture=newTexture(128,128,TextureOptions.DEFAULT);
enterTextureRegion=TextureRegionFactory.createFromAsset(enterTexture,getApplicationContext(),"block_enter.png",0,0);
exitTexture=newTexture(128,128,TextureOptions.DEFAULT);
exitTextureRegion=TextureRegionFactory.createFromAsset(exitTexture,getApplicationContext(),"block_exit.png",0,0);
}
publicSceneonLoadScene(){
scene=newScene
(2);
//scene.setBackground(newColorBackground(256,256,256));
enters=newArrayList();
//createaphysicalworld
vector=newVector2(0,1);
this.world=newFixedStepPhysicsWorld(30,vector,false,8,1);
ball=newBall(5,10,32,32,ballTextureRegion);
Bodyballbody=PhysicsFactory.createCircleBody(world,ball,BodyType.DynamicBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(ball,ballbody,true,true,false,false));
scene.getTopLayer().addEntity(ball);
//create
this.ball.test=this;
this.ball.enterList=enters;
//registeranewFPSLogger
this.mEngine.registerUpdateHandler(newFPSLogger());
//LoadTexture
this.mEngine.getTextureManager().loadTexture(ballTexture);
this.mEngine.getTextureManager().loadTexture(enterTexture);
this.mEngine.getTextureManager().loadTexture(exitTexture);
//createinitialinterfaceenterpoint
enterBrick=newDoor(10,270,50,50,enterTextureRegion);
BodyenterBody=PhysicsFactory.createCircleBody(world,enterBrick,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(enterBrick,enterBody,true,true,false,false));
scene.getTopLayer().addEntity(enterBrick);
enters.add(enterBrick);
exitBrick=newDoor(410,270,50,50,exitTextureRegion);
BodyexitBody=PhysicsFactory.createCircleBody(world,exitBrick,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(exitBrick,exitBody,true,true,false,false));
scene.getTopLayer().addEntity(exitBrick);
enters.add(exitBrick);
//createborders
bottom=newLine(0,320,460,320);
bottom.setColor(0,256,0);
BodybottomBody=PhysicsFactory.createBoxBody(this.world,bottom,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(bottom,bottomBody,true,true,false,false));
scene.getTopLayer().addEntity(bottom);
top=newLine(0,10,460,10);
top.setColor(0,256,0);
BodytopBody=PhysicsFactory.createBoxBody(this.world,top,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(top,topBody,true,true,false,false));
scene.getTopLayer().addEntity(top);
left=newLine(10,0,10,320);
left.setColor(0,256,0);
BodyleftBody=PhysicsFactory.createBoxBody(this.world,left,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(left,leftBody,true,true,false,false));
scene.getTopLayer().addEntity(left);
right=newLine(460,0,460,320);
right.setColor(0,256,0);
BodyrightBody=PhysicsFactory.createBoxBody(this.world,right,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(right,rightBody,true,true,false,false));
scene.getTopLayer().addEntity(right);
this.enableAccelerometerSensor(this);
scene.registerUpdateHandler(this.world);
this.ball.enterList=enters;
this.ball.scene=this.scene;
prevScene=scene;
returnscene;
}
publicvoidonLoadComplete(){}
publicvoidloadLevel1(){
scene1=newScene
(2);
enters=newArrayList();
//createaphysicalworld
vector=newVector2(0,1);
this.world=newFixedStepPhysicsWorld(30,vector,false,8,1);
ball=newBall(200,10,32,32,ballTextureRegion);
Bodyballbody=PhysicsFactory.createCircleBody(world,ball,BodyType.DynamicBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(ball,ballbody,true,true,false,false));
scene1.getTopLayer().addEntity(ball);
//create
this.ball.test=this;
this.ball.enterList=enters;
//registeranewFPSLogger
this.mEngine.registerUpdateHandler(newFPSLogger());
//LoadTexture
this.mEngine.getTextureManager().loadTexture(ballTexture);
this.mEngine.getTextureManager().loadTexture(enterTexture);
this.mEngine.getTextureManager().loadTexture(exitTexture);
//createinitialinterfaceenterpoint
enterBrick=newDoor(10,270,50,50,enterTextureRegion);
BodyenterBody=PhysicsFactory.createCircleBody(world,enterBrick,BodyType.StaticBody,wallFixtureDef);
world.registerPhysicsConnector(newPhysicsConnector(enterBrick,