2012-06-16 70 views
0

我是AndEngine的新手,並且有點麻煩。我想在畫面周圍拖動一個精靈,當手指從精靈中擡起時,讓物體落到屏幕的底部。每次觸摸屏幕(但不是精靈)時,都會創建一個新的精靈。我試圖結合PhysicsExample創建形狀,每次你觸摸,然後讓它們落下,TouchDragExample可以讓你在屏幕上拖動一個精靈。我留下的是一個精靈,在最後精靈所在的位置創建並立即移動到屏幕所在的位置。每個精靈都有自己的「引力場」或其他東西。他們不會掉下來,但他們儘可能遠離彼此。另外,當創建我的紋理區域時,我將圖像留在點(0,0)處。如何將圖像加載到紋理區域,但沒有將其顯示到屏幕上?我的代碼如下:在AndEngine中,如何拖動未被觸摸時會掉落的物體?

public class TestGFXActivity extends SimpleBaseGameActivity implements IAccelerationListener, IOnSceneTouchListener{ 
    /** Called when the activity is first created. */ 
    private Camera camera; 
    private static final int Camera_Width = 512; 
    private static final int Camera_Height = 512; 
    int centerX, centerY; 


    private BitmapTextureAtlas backgroundTextureAtlas; 
    private ITextureRegion backgroundTextureRegion, circleTR; 
    private PhysicsWorld mPhysicsWorld; 
    private Scene scene; 
    private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f); 

    @Override 
    public EngineOptions onCreateEngineOptions() { 
     // TODO Auto-generated method stub 
     camera = new Camera(0,0,Camera_Width,Camera_Height); 
     EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, 
       new FillResolutionPolicy(), camera); 

     return engineOptions; 
    } 

    @Override 
    protected void onCreateResources() { 
     // TODO Auto-generated method stub 
     backgroundTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 
       512,512,TextureOptions.DEFAULT); 
     backgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "bluelavabackground2.png",0,0); 
     circleTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "bubble2.png",0,0); 
     backgroundTextureAtlas.load(); 
    } 

    @Override 
    protected Scene onCreateScene() { 
     this.mEngine.registerUpdateHandler(new FPSLogger()); 
     centerX = (int) ((Camera_Width - this.backgroundTextureRegion.getWidth())/2); 
     centerY = (int) ((Camera_Height - this.backgroundTextureRegion.getHeight())/2); 

     scene = new Scene(); 
     this.scene.setOnSceneTouchListener((IOnSceneTouchListener) this); 
     scene.setBackground(new Background(1,1,1)); 
     this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); //Sets x and y acceleration 

     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_Height, 2, vertexBufferObjectManager); 
     final Rectangle left = new Rectangle(0, 0, 2, Camera_Height, vertexBufferObjectManager); 
     final Rectangle right = new Rectangle(Camera_Height - 2, 0, 2, Camera_Width, 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.scene.attachChild(ground); 
     this.scene.attachChild(roof); 
     this.scene.attachChild(left); 
     this.scene.attachChild(right); 

     this.scene.registerUpdateHandler(this.mPhysicsWorld); 




     final Sprite background = new Sprite(centerX,centerY,this.backgroundTextureRegion, getVertexBufferObjectManager()); 
     scene.attachChild(background); 
     return scene; 
    } 

    @Override 
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
     final Sprite face; 
     final Body body; 
     if(this.mPhysicsWorld != null) { 
      if(pSceneTouchEvent.isActionDown()) { 
       face = new Sprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), this.circleTR, this.getVertexBufferObjectManager()) { 
        @Override 
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
         this.setPosition(pSceneTouchEvent.getX() - this.getWidth()/2, pSceneTouchEvent.getY() - this.getHeight()/2); 
         return true; 
        } 
       }; 
       body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF); 

       face.setScale((float) .25); 
       scene.attachChild(face); 
       scene.registerTouchArea(face); 
       scene.setTouchAreaBindingOnActionDownEnabled(true); 
       this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true)); 
       return true; 
      }else if(pSceneTouchEvent.isActionDown()){ 
       scene.setTouchAreaBindingOnActionDownEnabled(false); 
      } 
     } 
     return false; 
    } 

    @Override 
    public void onAccelerationAccuracyChanged(AccelerationData pAccelerationData) { 
     // 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); 
    } 

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

     this.enableAccelerationSensor(this); 
    } 

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

     this.disableAccelerationSensor(); 
    } 
} 

回答

1

嘗試使用onClick(not in onSceneTouchEvent)註冊觸摸區域。要執行此操作只需執行onClickLisener。爲了讓你的雪碧掉落,你可以很容易地使用PhysicsBox(只需設置重力)。或者,您可以選擇創建PhysicsHandler並設置速度。

相關問題