1

スプライト オブジェクトを移動する領域をこの領域のみに制限したい (たとえば、領域のサイズが 200x200 の場合)。

スプライトがこの領域でのみ移動できる box2D 200x200 を作成します

どうやってそれをしますか?

@Override
public Scene onCreateScene() {
    this.mEngine.registerUpdateHandler(new FPSLogger());

    final Scene scene = new Scene();
    scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

    final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegionLetterOne
            .getWidth()) / 2;
    final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegionLetterOne
            .getHeight()) / 2;
    final Sprite letterOne = new Sprite(centerX - centerX / 2, centerY
            - centerY / 2, this.mFaceTextureRegionLetterOne,
            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;
        }


    };

    final Sprite letterTwo = new Sprite(centerX - centerX / 2, centerY,
            this.mFaceTextureRegionLetterTwo,
            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);
            //int count = scene.getChildCount();
            //for(int i = 0; i < count; i++) {

            IEntity entity = scene.getChildByIndex(1);
            if (entity instanceof Sprite) {
                if (entity.getUserData().equals("sprite"))
                    if (((Sprite) entity).collidesWith(letterOne))
                        Log.v("colission", "face_box is collised on google plus -> letterTwo on letterOne");
            }
            //}
            return true;
        }
    };
    letterTwo.setUserData("sprite");

    final Sprite boxArea = new Sprite(centerX, centerY,
            this.mFaceTextureRegionBox, this.getVertexBufferObjectManager());
    letterOne.setScale(2);
    scene.attachChild(letterOne);
    scene.registerTouchArea(letterOne);


    letterTwo.setScale(2);
    scene.attachChild(letterTwo);

    scene.registerTouchArea(letterTwo);

    boxArea.setScale(2);
    scene.attachChild(boxArea);

    scene.setTouchAreaBindingOnActionDownEnabled(true);

    return scene;
}

ありがとうございました。

4

3 に答える 3

0

box2D はわかりませんが、通常、スプライトのエッジが領域のエッジと重なっていない場合は、移動ごとにスプライトのエッジを確認します。

スプライトが Rectangle で表され、移動できる領域も Rectangle で表される場合、これは簡単に実行できます。

しかし、最初に box2D API を確認してください。おそらく、このタスクを容易にするいくつかのヘルパー メソッドが既に含まれている可能性があります。

obect.overlaps(object)
于 2012-08-17T11:16:08.050 に答える
0

あなたのコードでは、スプライトとの衝突チェックをしようとしているようです?!

物理体なしで何かをしようとすると、複雑で良くありません。それでは、スプライトで物理ボディを使用しましょう。

ただし、領域 (スプライトを含む) にソリッド ボックス ボディを作成しないでください。4 つの分離したボディ ウォール (左、上、右、下) を使用して閉じたボックスを形成します。ゲーム エンジンは、ソリッド シェイプとの衝突しかチェックできないためです。

参照用のコードは次のとおりです。

/**
 * @param pScene
 *      Sence of the game, get from class member
 * @param pWorld
 *      physics world of the game, get from class member
 */
public void CreateSprites(final Scene pScene, final PhysicsWorld pWorld)
{
    final FixtureDef mFixtureDef = PhysicsFactory.createFixtureDef(10, 1.1f, 0.0f);//should be placed as member of class
    final Sprite letterTwo = new Sprite(centerX - centerX / 2, centerY, 
            this.mFaceTextureRegionLetterTwo,
            this.getVertexBufferObjectManager());

    final Body letterTwoBody = PhysicsFactory.createBoxBody(pWorld, letterTwo, BodyType.DynamicBody, mFixtureDef);
    letterTwo.setUserData(letterTwoBody); // for later sprite-body attachment access

    pScene.attachChild(letterTwo);
    pWorld.registerPhysicsConnector(new PhysicsConnector(letterTwo, letterTwoBody, true, true));
}

/** Create the walls, in these boudaries sprites will move */
public void InitBoxWalls(Scene pScene, PhysicsWorld pWorld)
{
    final float WALL_MARGIN_WIDTH = 5f;
    final float WALL_MARGIN_HEIGHT = 10f;
    final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();

    mWallGround = new Rectangle(-WALL_MARGIN_WIDTH, mCameraHeight + WALL_MARGIN_HEIGHT - 2, mCameraWidth + 2*WALL_MARGIN_WIDTH, 2, vertexBufferObjectManager);
    mWallRoof = new Rectangle(-WALL_MARGIN_WIDTH, -WALL_MARGIN_HEIGHT, mCameraWidth + 2*WALL_MARGIN_WIDTH, 2, vertexBufferObjectManager);
    mWallLeft = new Rectangle(-WALL_MARGIN_WIDTH, -WALL_MARGIN_HEIGHT, 2, mCameraHeight + 2*WALL_MARGIN_HEIGHT, vertexBufferObjectManager);
    mWallRight = new Rectangle(mCameraWidth + WALL_MARGIN_WIDTH - 2, -WALL_MARGIN_HEIGHT, 2, mCameraHeight + 2*WALL_MARGIN_HEIGHT, vertexBufferObjectManager);

    PhysicsFactory.createBoxBody(pWorld, mWallGround, BodyType.StaticBody, mWallFixtureDef);
    PhysicsFactory.createBoxBody(pWorld, mWallRoof, BodyType.StaticBody, mWallFixtureDef);
    PhysicsFactory.createBoxBody(pWorld, mWallLeft, BodyType.StaticBody, mWallFixtureDef);
    PhysicsFactory.createBoxBody(pWorld, mWallRight, BodyType.StaticBody, mWallFixtureDef);

    pScene.attachChild(mWallGround);
    pScene.attachChild(mWallRoof);
    pScene.attachChild(mWallLeft);
    pScene.attachChild(mWallRight);
}

そして最後にすべきことは、AndEngine の例で Physics/MouseJoint の例を調べることです。

于 2012-08-23T03:26:45.533 に答える
0

200X200 の Rectangle を作成してから、Box2D Physics を使用して長方形の本体を作成する必要があります。また、四角形のフィクスチャ定義では、スプライトが四角形の境界と衝突したときにそれに応じてスプライトが処理されるように、密度、弾力性、および摩擦を設定できます。

Rectangle を作成するには、Andengine の例を参照できます。

于 2012-08-22T06:20:44.680 に答える