2012-05-24 51 views
1

你是AndEngine的新手。我想使用物理处理程序并通过引擎的例子。所以在我的情况下,我有一个“球”精灵,我可以通过触摸来移动,第二个“方形”动画精灵,我希望墙壁反弹。但它只是离开屏幕。帮我...PhysicsHandler没有按预期工作 - AndEngine

package com.Escapo; 

    import org.anddev.andengine.engine.Engine; 
    import org.anddev.andengine.engine.camera.Camera; 
    import org.anddev.andengine.engine.handler.physics.PhysicsHandler; 
    import org.anddev.andengine.engine.options.EngineOptions; 
    import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation; 
    import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
    import org.anddev.andengine.entity.scene.Scene; 
    import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; 
    import org.anddev.andengine.entity.scene.background.ColorBackground; 
    import org.anddev.andengine.entity.sprite.AnimatedSprite; 
    import org.anddev.andengine.entity.sprite.Sprite; 
    import org.anddev.andengine.entity.util.FPSLogger; 
    import org.anddev.andengine.input.touch.TouchEvent; 
    import org.anddev.andengine.opengl.texture.TextureOptions; 
    import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; 
    import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; 
    import org.anddev.andengine.opengl.texture.region.TextureRegion; 
    import org.anddev.andengine.opengl.texture.region.TiledTextureRegion; 
    import org.anddev.andengine.ui.activity.BaseGameActivity; 

    import android.view.Display; 



    public class EscapoActivity extends BaseGameActivity { 

private Camera mCamera; 
private Scene mMainScene; 

//main ball variables 
private BitmapTextureAtlas mBitmapTextureAtlas; 
private TextureRegion mPlayerTextureRegion; 
private Sprite player; 
//square 
private BitmapTextureAtlas mBitmapTextureAtlas2; 
private static final float DEMO_VELOCITY = 100.0f; 
private TiledTextureRegion mFaceTextureRegion; 
private static int cameraWidth; 
private static int cameraHeight; 
private Sprite square; 
@Override 
public void onLoadComplete() { 


} 

@Override 
public Engine onLoadEngine() { 

    final Display display = getWindowManager().getDefaultDisplay(); 

     cameraWidth = display.getWidth(); 

     cameraHeight = display.getHeight(); 



     mCamera = new Camera(0, 0, cameraWidth, cameraHeight); 



     return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, 

      new RatioResolutionPolicy(cameraWidth, cameraHeight), mCamera)); 

} 

@Override 
public void onLoadResources() { 



      mBitmapTextureAtlas = new BitmapTextureAtlas(512, 512, 

       TextureOptions.BILINEAR_PREMULTIPLYALPHA); 

      //square 
      mBitmapTextureAtlas2 = new BitmapTextureAtlas(512, 512, 

        TextureOptions.BILINEAR_PREMULTIPLYALPHA); 


      BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); 



      mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory 

       .createFromAsset(this.mBitmapTextureAtlas, this, "ball.png", 

       0, 0); 

      //square 
      this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas2, this, "square.png", 0, 0, 1, 1); 

      mEngine.getTextureManager().loadTextures(mBitmapTextureAtlas,mBitmapTextureAtlas2); 




} 

@Override 
public Scene onLoadScene() { 

    mEngine.registerUpdateHandler(new FPSLogger()); 



     mMainScene = new Scene(); 

     mMainScene 

      .setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f)); 


     final int PlayerX =(int) ((mCamera.getWidth() - mPlayerTextureRegion 

       .getWidth())/2); 
     final int PlayerY = (int) ((mCamera.getHeight() - mPlayerTextureRegion 

      .getHeight())/2); 



     player = new Sprite(PlayerX, PlayerY, mPlayerTextureRegion) { 

       public boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) { 

        this.setPosition(pSceneTouchEvent.getX()- this.getWidth()/2, pSceneTouchEvent.getY()- this.getHeight()/2); 




        return true; 

       } 

      }; 
      mMainScene.registerTouchArea(player); 

       mMainScene.setTouchAreaBindingEnabled(true); 

     mMainScene.attachChild(player); 
     //square 
     final Ball ball = new Ball(2, 2, this.mFaceTextureRegion); 
     final PhysicsHandler physicsHandler = new PhysicsHandler(ball); 
     ball.registerUpdateHandler(physicsHandler); 
     physicsHandler.setVelocity(DEMO_VELOCITY, DEMO_VELOCITY); 

     mMainScene.getLastChild().attachChild(ball); 

     return mMainScene; 

} 


private static class Ball extends AnimatedSprite { 
    private final PhysicsHandler mPhysicsHandler; 

    public Ball(final float pX, final float pY, final TiledTextureRegion pTextureRegion) { 
      super(pX, pY, pTextureRegion); 
      this.mPhysicsHandler = new PhysicsHandler(this); 
      this.registerUpdateHandler(this.mPhysicsHandler); 
    } 

    @Override 
    protected void onManagedUpdate(final float pSecondsElapsed) { 
      if(this.mX < 0) { 
        this.mPhysicsHandler.setVelocityX(DEMO_VELOCITY); 
      } else if(this.mX + this.getWidth() > cameraWidth) { 
        this.mPhysicsHandler.setVelocityX(-DEMO_VELOCITY); 
      } 

      if(this.mY < 0) { 
        this.mPhysicsHandler.setVelocityY(DEMO_VELOCITY); 
      } else if(this.mY + this.getHeight() > cameraHeight) { 
        this.mPhysicsHandler.setVelocityY(-DEMO_VELOCITY); 
      } 

      super.onManagedUpdate(pSecondsElapsed); 
    } 
} 




} 

我刚才想整合移动高尔夫球例如http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/MovingBallExample.java 我在哪里去了?

回答

1

我不确定PhysicsHandler会解决你的问题,因为我认为它只是为了帮助你移动你的实体。

尝试Box2d扩展到AndEngine。

从AndEngine示例中,有一个PhysicsJumpExample.java(在启动器中称为“组合物理和触摸”),如果你触摸它,基本上会使对象跳跃,所以我猜它接近你想要的。

下面是该文件的一些代码,使墙面:

//onCreateScene 
    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); 

使物体跳跃,只设置一组速度重力负。重力在最终达到0后拉回:

final Vector2 velocity = Vector2Pool.obtain(this.mGravityX * -50, this.mGravityY * -50); 
    faceBody.setLinearVelocity(velocity); 
    Vector2Pool.recycle(velocity);