AndEnine学习[Box2d]导入AndEnginePhysicsBox2DExtension扩张插件

今晚学习了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封装的非常好


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值