今晚学习了AndEngine的扩张插件AndEnginePhysicsBox2DExtension,所以记录一下。
首先,下载好AndEnginePhysicsBox2DExtension,zip压缩包,然后解压放在AndEngine目录下,打开Eclipse,导入这个项目。请看一下步骤:
File -->New ---> Project ---:> Android Project from Existing Code 会看到以下界面
选择好相应的目录下的这个包,点击Finish即可,记得勾上Copy project into workespace复选框,因为没有勾上这个复选框你是直接导入这个项目,当你删除时,会把整个项目文件删除,所以要勾上,以免不必要的麻烦,还是勾上,不用再去下载了或解压多一次。
导入项目完毕后,项目还是会出现错误,是因为这个项目缺少了AndEngine库的缘故,所以我们还需要给项目添加andengine库。
请看以下步骤:
点击项目右键build path ------>Configure Build Path
会看到这个界面。在Project中,点击Add按钮会出现这个界面
选择AndEngine勾上,点击OK即可
然后错误就消失了~~~so~~最基本的导入包步骤结束。
接下来就可以开始写项目了~开始我们的项目吧~~
首先,将andengine.jar和andenginephysicsbox2dextension.jar,放入项目的libs目录中,点击右键build path,导入库。
有个非常重要的地方要注意:导入后,会发现运行会出错!所以必须到Andenginephysicsbox2dextension项目中拿到so文件请看一下截图
就在libs里,最好将全部复制过你的项目libs中去,这样运行项目就不会出错了!!!!!请注意!!
项目名称:PhysicsDemo,详细解释已经在代码中注释了。
package com.oraclegutest.physicstest;
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.primitive.Rectangle;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.extension.physics.box2d.PhysicsConnector;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.extension.physics.box2d.PhysicsWorld;
import org.andengine.extension.physics.box2d.util.Vector2Pool;
import org.andengine.input.sensor.acceleration.AccelerationData;
import org.andengine.input.sensor.acceleration.IAccelerationListener;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.TiledTextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import android.hardware.SensorManager;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.FixtureDef;
/**
* 首先继承SimpleBaseGameActivity,然后实现IAccelerationListener和IOnSceneTouchListener接口
* IAccelerationListener接口是一个重力加速器继承这个接口会实现两个方法onAccelerationAccuracyChanged(AccelerationData arg0)
* 和onAccelerationChanged(AccelerationData pAccelerationData)方法,主要我们在onAccelerationChanged(AccelerationData pAccelerationData)方法中
* 实现相关代码。
*
*/
public class PhysicsDemo extends SimpleBaseGameActivity implements IAccelerationListener,IOnSceneTouchListener{
private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
//屏幕高宽
private static final int CAMERA_WIDTH = 854;
private static final int CAMERA_HEIGHT = 480;
//声明图片集
private BitmapTextureAtlas mBitmapTextureAtlas;
//声明平铺纹理范围
private TiledTextureRegion mTiledTextureRegion;
//声明物理世界
private PhysicsWorld mPhysicsWorld;
//声明场景
private Scene mScene;
@Override
public EngineOptions onCreateEngineOptions() {
Camera camera = new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT);
return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
}
@Override
protected void onCreateResources() {
//加载相关资源
this.mBitmapTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 64, 128);
this.mTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "face_box_tiled.png", 0, 0, 2, 1);
this.mBitmapTextureAtlas.load();
}
@Override
protected Scene onCreateScene() {
this.mScene = new Scene();
this.mScene.setBackground(new Background(0.954f,0.556f,0.2654f));
//场景设置一个监听
this.mScene.setOnSceneTouchListener(this);
//实例化物理世界对象,第一个参数为一个向量对象,第二个参数为是否休眠,我们填入false不进行休眠
this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);
final VertexBufferObjectManager mVertexBufferObjectManager = new VertexBufferObjectManager();
//然后创建出屏幕四个矩形,这是作为一个包围盒使用
final Rectangle ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2, mVertexBufferObjectManager);
final Rectangle roof = new Rectangle(0, 0, CAMERA_WIDTH, 2, mVertexBufferObjectManager);
final Rectangle left = new Rectangle(0, 0, 2, CAMERA_HEIGHT, mVertexBufferObjectManager);
final Rectangle right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT, mVertexBufferObjectManager);
//创建一个FixtureDef对象。
final FixtureDef mFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
//用PhysicsFactory工厂类可以创建各种刚体,里面设置有4个参数,第一个是物理世界对象,
//第二个你创建的矩形皮肤,第三个参数是刚体的属性状态,是静态还是动态的,第四个参数是FixtureDef对象
PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, mFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, mFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, mFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, mFixtureDef);
//创建好后,添加进场景中
this.mScene.attachChild(ground);
this.mScene.attachChild(roof);
this.mScene.attachChild(left);
this.mScene.attachChild(right);
//然后开启物理世界PhysicsWorld
this.mScene.registerUpdateHandler(mPhysicsWorld);
return this.mScene;
}
//这是添加刚体方法,在监听器中调用,点击屏幕会添加一个精灵刚体
public void addFace(final float pX,final float pY){
final Sprite face = new Sprite(pX, pY, this.mTiledTextureRegion, this.getVertexBufferObjectManager());
Body body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
this.mScene.attachChild(face);
//其实这个类似开始模拟物理世界
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
}
@Override
public boolean onSceneTouchEvent(Scene arg0, TouchEvent arg1) {
//点击屏幕位置,就会添加一个刚体
if(arg1.isActionDown()){
this.addFace(arg1.getX(), arg1.getY());
return true;
}
return false;
}
@Override
public void onAccelerationAccuracyChanged(AccelerationData arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAccelerationChanged(AccelerationData pAccelerationData) {
//这个方法内获取一个向量对象,要记得拿到后,要回收一次。
final Vector2 gravity = Vector2Pool.obtain(pAccelerationData.getX(), pAccelerationData.getY());
this.mPhysicsWorld.setGravity(gravity);
Vector2Pool.recycle(gravity);
}
}
总结:开始的时候,一头雾水,直接导入包,拿到jar文件马上开始编写代码,没考虑到还需要镜像文件,以后遇到第三方包要注意这些细节,以免搞的头都大。。。。
今晚就写到这,其实代码很清晰明了,主要是AndEngine封装的非常好