2

なんとかtmxマップをロードできたので、スプライトが移動できない障害物を作成したいので、次のように障害物を回復しました。

try {
        final TMXLoader tmxLoader = new TMXLoader(this, this.mEngine.getTextureManager(), TextureOptions.BILINEAR_PREMULTIPLYALPHA, new ITMXTilePropertiesListener() {
            @Override
            public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties<TMXTileProperty> pTMXTileProperties) {
                /* We are going to count the tiles that have the property "cactus=true" set. */
                if(pTMXTileProperties.containsTMXProperty("obstacle", "true")) {
                    //TMXTiledMapExample.this.mCactusCount++;
                    //coffins[coffinPtr++] = pTMXTile.getTileRow() * 15 + pTMXTile.getTileColumn();

                }
            }
        });

プレイヤーが障害物(壁のように)を通り抜けるのを防ぐために、障害物との衝突をどのように処理しますか?

4

2 に答える 2

2

あなたが求めているのは、衝突処理をどのように実装するかということだと思います。明確にするために:衝突検出は、何かが他の何かと衝突(重複)していると判断するステップです。衝突処理とは、たとえば、それらの1つを移動して、重なり合わないようにすることです。この場合、「onTMXTileWithPropertiesCreated」というメソッドを使用しているため、衝突検出を通過して衝突処理に進んでいると想定しています。これは、プレーヤーがそのようなタイル上にいることを意味していると思います。簡単に言えば、ここにアイデアがあります。

ここに画像の説明を入力してください

プレーヤー(または他のスプライト)の動きが原因で、スプライトが通過できないようにしたいスプライトと衝突していることを検出した場合、つまり「本物」の場合は、オーバーラップを防ぐ距離をスプライトバックします。

長方形でこれを行うのは非常に簡単です。他の形状でそれを行うと、もう少し複雑になります。TMXタイルマップを使用しているため、今のところ長方形が機能する可能性があります。これが長方形の基本的な例です。

public boolean adjustForObstacle(Rect obstacle) {
    if (!obstacle.intersect(this.getCollisionRect())) return false;

    // There's an intersection. We need to adjust now.
    // Due to the way intersect() works, obstacle now represents the
    // intersection rectangle.

    if (obstacle.width() < obstacle.height()) {
        // The intersection is smaller left/right so we'll push accordingly.
        if (this.getCollisionRect().left < obstacle.left) {
            // push left until clear.
            this.setX(this.getX() - obstacle.width());
        } else {
            // push right until clear.
            this.setX(this.getX() + obstacle.width());
        }
    } else {
        if (this.getCollisionRect().top < obstacle.top) {
            // push up until clear.
            this.setY(this.getY() - obstacle.height());
        } else {
            // push down until clear.
            this.setY(this.getY() + obstacle.height());
        }
    }
    return true;
}

これが行っているのは、重なり合う長方形を計算し、重なり合う最小の寸法に沿って、重なり合わなくなる量だけスプライトを移動することです。AndEngineを使用しているので、IShapeのcollidesWith()メソッドを利用できます。これは、上記のアプローチよりもエレガントに衝突を検出します。

于 2013-02-18T23:51:22.960 に答える
1

これを使っているので

if(pTMXTileProperties.containsTMXProperty("obstacle", "true")) {
                    //TMXTiledMapExample.this.mCactusCount++;
                    //coffins[coffinPtr++] = pTMXTile.getTileRow() * 15 + pTMXTile.getTileColumn();
                    //initRacetrackBorders2();
                     // This is our "wall" layer. Create the boxes from it
                        final Rectangle rect = new Rectangle(pTMXTile.getTileX()+10, pTMXTile.getTileY(),14, 14);
                        final FixtureDef boxFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 1f);
                        PhysicsFactory.createBoxBody(mPhysicsWorld, rect, BodyType.StaticBody, boxFixtureDef);
                        rect.setVisible(false);
                        mScene.attachChild(rect);
                }

楽しむ !

于 2013-03-06T14:55:48.240 に答える