2012-06-24 65 views
1

我試圖在AndEngine示例包中複製和粘貼一個物理示例。AndEngine gles2物理

沒有錯誤出現,但是當我運行它時,模擬器顯示「不幸PhysicsActivity已停止」。

仿真器在API 15上,gpu處於打開狀態,磁場支持和加速計也打開。

這裏是代碼:

package physics.jet; 

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.IOnAreaTouchListener; 
import org.andengine.entity.scene.IOnSceneTouchListener; 
import org.andengine.entity.scene.ITouchArea; 
import org.andengine.entity.scene.Scene; 
import org.andengine.entity.scene.background.Background; 
import org.andengine.entity.shape.IAreaShape; 
import org.andengine.entity.sprite.AnimatedSprite; 
import org.andengine.entity.util.FPSLogger; 
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.extension.physics.box2d.util.constants.PhysicsConstants; 
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.TextureOptions; 
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 org.andengine.util.debug.Debug; 

import android.hardware.SensorManager; 
import android.widget.Toast; 

import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.joints.MouseJoint; 
import com.badlogic.gdx.physics.box2d.joints.MouseJointDef; 

/** 
* @author albrandroid 
* @author Nicolas Gramlich 
* @since 10:35:23 - 28.02.2011 
*/ 
public class PhysicsActivity extends SimpleBaseGameActivity implements IAccelerationListener, IOnSceneTouchListener, IOnAreaTouchListener { 
    // =========================================================== 
    // Constants 
    // =========================================================== 

    private static final int CAMERA_WIDTH = 720; 
    private static final int CAMERA_HEIGHT = 480; 

    private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); 

    // =========================================================== 
    // Fields 
    // =========================================================== 

    private BitmapTextureAtlas mBitmapTextureAtlas; 

    private TiledTextureRegion mBoxFaceTextureRegion; 
    private TiledTextureRegion mCircleFaceTextureRegion; 

    private Scene mScene; 

    private PhysicsWorld mPhysicsWorld; 
    private int mFaceCount = 0; 

    private MouseJoint mMouseJointActive; 
    private Body mGroundBody; 

    // =========================================================== 
    // Constructors 
    // =========================================================== 

    // =========================================================== 
    // Getter & Setter 
    // =========================================================== 

    // =========================================================== 
    // Methods for/from SuperClass/Interfaces 
    // =========================================================== 

    @Override 
    public EngineOptions onCreateEngineOptions() { 
     Toast.makeText(this, "Touch the screen to add objects.", Toast.LENGTH_LONG).show(); 

     final 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 
    public void onCreateResources() { 
     BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); 

     this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 64, TextureOptions.BILINEAR); 
     this.mBoxFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "face_box_tiled.png", 0, 0, 2, 1); // 64x32 
     this.mCircleFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "face_circle_tiled.png", 0, 32, 2, 1); // 64x32 
     this.mBitmapTextureAtlas.load(); 
    } 

    @Override 
    public Scene onCreateScene() { 
     this.mEngine.registerUpdateHandler(new FPSLogger()); 

     this.mScene = new Scene(); 
     this.mScene.setBackground(new Background(0, 0, 0)); 
     this.mScene.setOnSceneTouchListener(this); 
     this.mScene.setOnAreaTouchListener(this); 

     this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); 
     this.mGroundBody = this.mPhysicsWorld.createBody(new BodyDef()); 

     final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager(); 
     final Rectangle ground = new Rectangle(0, CAMERA_HEIGHT - 2, CAMERA_WIDTH, 2, vertexBufferObjectManager); 
     final Rectangle roof = new Rectangle(0, 0, CAMERA_WIDTH, 2, vertexBufferObjectManager); 
     final Rectangle left = new Rectangle(0, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); 
     final Rectangle right = new Rectangle(CAMERA_WIDTH - 2, 0, 2, CAMERA_HEIGHT, vertexBufferObjectManager); 

     final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); 
     PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef); 
     PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef); 
     PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef); 
     PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef); 

     this.mScene.attachChild(ground); 
     this.mScene.attachChild(roof); 
     this.mScene.attachChild(left); 
     this.mScene.attachChild(right); 

     this.mScene.registerUpdateHandler(this.mPhysicsWorld); 

     return this.mScene; 
    } 

    @Override 
    public void onGameCreated() { 
     this.mEngine.enableVibrator(this); 
    } 

    @Override 
    public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { 
     if(this.mPhysicsWorld != null) { 
      switch(pSceneTouchEvent.getAction()) { 
       case TouchEvent.ACTION_DOWN: 
        this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); 
        return true; 
       case TouchEvent.ACTION_MOVE: 
        if(this.mMouseJointActive != null) { 
         final Vector2 vec = Vector2Pool.obtain(pSceneTouchEvent.getX()/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, pSceneTouchEvent.getY()/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT); 
         this.mMouseJointActive.setTarget(vec); 
         Vector2Pool.recycle(vec); 
        } 
        return true; 
       case TouchEvent.ACTION_UP: 
        if(this.mMouseJointActive != null) { 
         this.mPhysicsWorld.destroyJoint(this.mMouseJointActive); 
         this.mMouseJointActive = null; 
        } 
        return true; 
      } 
      return false; 
     } 
     return false; 
    } 

    @Override 
    public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
     if(pSceneTouchEvent.isActionDown()) { 
      final IAreaShape face = (IAreaShape) pTouchArea; 
      /* 
      * If we have a active MouseJoint, we are just moving it around 
      * instead of creating a second one. 
      */ 
      if(this.mMouseJointActive == null) { 
       this.mEngine.vibrate(100); 
       this.mMouseJointActive = this.createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY); 
      } 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public void onAccelerationAccuracyChanged(final AccelerationData pAccelerationData) { 

    } 

    @Override 
    public void onAccelerationChanged(final AccelerationData pAccelerationData) { 
     final Vector2 gravity = Vector2Pool.obtain(pAccelerationData.getX(), pAccelerationData.getY()); 
     this.mPhysicsWorld.setGravity(gravity); 
     Vector2Pool.recycle(gravity); 
    } 

    @Override 
    public void onResumeGame() { 
     super.onResumeGame(); 

     this.enableAccelerationSensor(this); 
    } 

    @Override 
    public void onPauseGame() { 
     super.onPauseGame(); 

     this.disableAccelerationSensor(); 
    } 

    // =========================================================== 
    // Methods 
    // =========================================================== 

    public MouseJoint createMouseJoint(final IAreaShape pFace, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
     final Body body = (Body) pFace.getUserData(); 
     final MouseJointDef mouseJointDef = new MouseJointDef(); 

     final Vector2 localPoint = Vector2Pool.obtain((pTouchAreaLocalX - pFace.getWidth() * 0.5f)/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, (pTouchAreaLocalY - pFace.getHeight() * 0.5f)/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT); 
     this.mGroundBody.setTransform(localPoint, 0); 

     mouseJointDef.bodyA = this.mGroundBody; 
     mouseJointDef.bodyB = body; 
     mouseJointDef.dampingRatio = 0.95f; 
     mouseJointDef.frequencyHz = 30; 
     mouseJointDef.maxForce = (200.0f * body.getMass()); 
     mouseJointDef.collideConnected = true; 

     mouseJointDef.target.set(body.getWorldPoint(localPoint)); 
     Vector2Pool.recycle(localPoint); 

     return (MouseJoint) this.mPhysicsWorld.createJoint(mouseJointDef); 
    } 

    private void addFace(final float pX, final float pY) { 
     this.mFaceCount++; 
     Debug.d("Faces: " + this.mFaceCount); 

     final AnimatedSprite face; 
     final Body body; 

     if(this.mFaceCount % 2 == 0) { 
      face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager()); 
      body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF); 
     } else { 
      face = new AnimatedSprite(pX, pY, this.mCircleFaceTextureRegion, this.getVertexBufferObjectManager()); 
      body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF); 
     } 
     face.setUserData(body); 
     face.animate(200); 

     this.mScene.registerTouchArea(face); 
     this.mScene.attachChild(face); 

     this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true)); 
    } 

    // =========================================================== 
    // Inner and Anonymous Classes 
    // =========================================================== 
} 
+0

郵政調試日誌運行呢? – Geobits

回答

0

您必須對設備造成AndEngineGles2不起作用絲毫模擬器

+3

我可能錯了,但我相信這不再是真的。我可以使用Google API 16在4.0.3上運行AndEngine示例,並啓用GPU仿真。這不能在虛擬機中完成。 –