2013-05-11 54 views
0

如何在没有重力的情况下保持所有碰撞和加速效果。我想添加一个不会掉落到地面的物体,但是如果没有碰撞附加物保持其位置。andengine mousejoint withouth gravity

public class PhysicsMouseJointExample 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 
    // =========================================================== 
} 

我试图改变重力,但似乎没有任何追加。

this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, -10), false); 

回答

0

没有重力是:

enter code here`this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, 0), false); 

这是反重力或〜1G起来:

this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, -10), false); 

这是〜1G的权利:

this.mPhysicsWorld = new PhysicsWorld(new Vector2(10, 0), false); 
+0

如果我把手机翻过来或左右我的精灵必须保持其位置。更改上面的值精灵仍然下降。 – lucignolo 2013-05-11 20:11:23

+0

然后你只需要第一个。传递给PhysicsWorld的Vector2是指定左或右以及向上或向下的“重力”力。第一个值是左/右。负值会使精灵落在屏幕的左侧,而正值会使屏幕落到屏幕的右侧。第二个值为负值或屏幕顶端为负值,屏幕底端为正值。所以如果你传入新的矢量(0,0),你就是说没有重力。精灵只会因为碰撞而移动,或者如果你允许用户把它们扔掉。 – 2013-05-11 20:27:43

+0

我尝试更改代码,建议 - this.mPhysicsWorld = new PhysicsWorld(new Vector2(0,0),false) - 但精灵仍在下降。当我倾斜或旋转手机时,我希望这个精灵保持静止 – lucignolo 2013-05-11 20:37:15