1

私はAndroidゲーム開発に不慣れで、 AndEngine GLES2Javaを使用しています。このコーディングでは、それぞれsmall_boxbig_boxの2つのスプライトを作成しました.small_boxbig_boxに、またはその逆にドラッグすると、互いに反発します。これは正常に機能しますが、私の問題は、1番目のsmall_boxと1番目のbigboxが互いに反発することです。 2番目のsmall_boxbig_boxは反発しません。どうすれば解決できますか?すべてのsmall_boxをすべてのbig_boxからはじき、 small_boxを別のsmall_boxにドラッグするとそれはオーバーラップする必要があり、big_box内でも別のbig_boxに........ Plzこのコードを変更するか、例を使用することで、誰でもこれを支援できます.......

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);
    }
    }
}
4

1 に答える 1

0

作成された新しいボックスをチェックするだけです。それが理由です

これにはbox2Dを使用することをお勧めします。たとえば、小さなボックスを小さなボックスとのみ衝突させ、大きなボックスとは衝突させないようにする必要がある場合は、box2Dでの衝突とフィルター処理された衝突の例がすでにあります。

これは、衝突をフィルタリングするためのリンクです https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/PhysicsCollisionFilteringExample.java

于 2012-11-17T23:02:43.040 に答える