2012-05-24 2 views
1

Ребята, полный новичок в AndEngine. Я хотел использовать обработчик физики и прошел через примеры 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 в Launcher есть физический интерфейс JumbExpress. Это в основном делает объект прыгающим, если вы его касаетесь, поэтому я думаю, что он близок к тому, что вы хотите.

Вот часть кода из этого файла, чтобы сделать стены:

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