2012-11-16 22 views
1

我是的新手Android遊戲開發我正在使用AndEngine GLES 2 Java。在這種編碼,我創建2精靈是small_boxbig_box respectively.When我拖累small_boxbig_box或反之,它排斥每個other.This工作正常,但我的問題是,1 small_box和第一個大方塊排斥對方,但第二個small_boxbig_box不排斥。如何解決?我希望所有small_box所有big_box排斥,當我拖到small_box另一個small_box應該重疊,甚至在big_box另一個big_box也........ PLZ人可以通過修改這個代碼或使用示例幫助這個.......Andengine - 如何在Android遊戲中創建Sprite的重疊和碰撞?

public class SampleActivity extends SimpleBaseGameActivity { 
    protected static final int CAMERA_WIDTH = 800; 
    protected static final int CAMERA_HEIGHT = 480; 
    private ITextureRegion Box1, Box2;; 
    private Stack Stack1, Stack2; 
    private Sprite small_box,big_box; 
    //private final Sprite small_box = new Sprite[1]; 

    public EngineOptions onCreateEngineOptions() { 
     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); 
    } 

    public void onCreateResources() { 
     try { 
      ITexture small_box = new BitmapTexture(this.getTextureManager(), 
        new IInputStreamOpener() { 
         public InputStream open() throws IOException { 
          return getAssets().open("gfx/small_box.png"); 
         } 
        }); 
      ITexture big_box = new BitmapTexture(this.getTextureManager(), 
        new IInputStreamOpener() { 
         public InputStream open() throws IOException { 
          return getAssets().open("gfx/big_box.png"); 
         } 
        }); 
      small_box.load(); 
      big_box.load(); 
      this.Box1 = TextureRegionFactory.extractFromTexture(small_box); 
      this.Box2 = TextureRegionFactory.extractFromTexture(big_box); 
      this.Stack1 = new Stack(); 
      this.Stack2 = new Stack(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public Scene onCreateScene() { 
     final Scene scene = new Scene(); 
     scene.setBackground(new Background(1, 1, 1)); 
     for(int i=0;i<2;i++){ 
      small_box = new Sprite(i*300, 100, Box1, this.getVertexBufferObjectManager()) { 
       public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { 
        if (((Sprite) this.getmStack().peek()).getHeight() != this 
          .getHeight()) 
         return false; 
        this.setPosition(pSceneTouchEvent.getX() - this.getWidth() 
          /2, pSceneTouchEvent.getY() - this.getHeight()/2); 
        if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){ 
         checkForCollisionsWithBoxes(); 
        } 
        return true; 
        } 
       private Stack getmStack() { 
        // TODO Auto-generated method stub 
        return Stack2; 
       } 
       }; 
       big_box = new Sprite(i*300, 200, Box2, this.getVertexBufferObjectManager()) { 
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { 
         if (((Sprite) this.getmStack().peek()).getHeight() != this 
           .getHeight()) 
          return false; 
         this.setPosition(pSceneTouchEvent.getX() - this.getWidth() 
           /2, pSceneTouchEvent.getY() - this.getHeight()/2); 
         if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){ 
          checkForCollisionsWithBoxes(); 
         } 
         return true; 
         } 
        private Stack getmStack() { 
         // TODO Auto-generated method stub 
         return Stack1; 
        } 
        }; 
        scene.attachChild(small_box); 
        scene.attachChild(big_box); 
        this.Stack1.add(big_box); 
        this.Stack2.add(small_box); 
       scene.registerTouchArea(small_box); 
       scene.registerTouchArea(big_box); 
       scene.setTouchAreaBindingOnActionDownEnabled(true); 
     } 
     return scene; 
    } 

    private void checkForCollisionsWithBoxes() { 
     if ((big_box.collidesWith(small_box) && (Stack1.size() == 0 || small_box.getHeight() < ((Sprite) Stack1.peek()).getHeight()))) { 
      small_box.setPosition(100+big_box.getWidth()/2, 50+ big_box.getHeight()); 
      big_box.setPosition(300+small_box.getWidth()/2, 250+small_box.getHeight()/2); 
    } 
    } 
} 

回答

0

你只檢查創建的新盒子,這就是爲什麼

我SUG如果您需要例如小盒子只碰撞小盒子而不碰大盒子

這是用於過濾碰撞的鏈接 https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/PhysicsCollisionFilteringExample.java

+0

謝謝你的迴應...我試過這個鏈接,但我沒有得到它...我用數組爲兩個精靈,但它顯示冗長,我想使它簡短....你能幫我... – sam786

+0

@jimmar ...你可以告訴我這個解決方案.....我嘗試了很多,但仍然不知道 – sam786

+0

我使用了陣列的兩個雪碧......我用4個小方塊和4個大方塊通過使用數組...我做了這個編碼,但它的冗長,所以我希望它可伸縮可以any1幫助我...如果any1準備好了以幫助我然後我將共享這個 – sam786