0

それで、私はAndEnginePhysicsExampleコードを研究していました。このメソッドの意味は何だろうと思っていました(http://pastebin.com/Day2hciB):

private void addFace(final float pX, final float pY) {
        this.mFaceCount++;
        Debug.d("Faces: " + this.mFaceCount);

        final AnimatedSprite face;
        final Body body;

        if(this.mFaceCount % 4 == 0) {
            face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager());
            body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
        } else if (this.mFaceCount % 4 == 1) {
            face = new AnimatedSprite(pX, pY, this.mCircleFaceTextureRegion, this.getVertexBufferObjectManager());
            body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
        } else if (this.mFaceCount % 4 == 2) {
            face = new AnimatedSprite(pX, pY, this.mTriangleFaceTextureRegion, this.getVertexBufferObjectManager());
            body = PhysicsExample.createTriangleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
        } else {
            face = new AnimatedSprite(pX, pY, this.mHexagonFaceTextureRegion, this.getVertexBufferObjectManager());
            body = PhysicsExample.createHexagonBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
        }

        face.animate(200);

        this.mScene.attachChild(face);
        this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
    }
4

1 に答える 1

5
private void addFace(final float pX, final float pY) {
            this.mFaceCount++;
            Debug.d("Faces: " + this.mFaceCount);

            final AnimatedSprite face;
            final Body body;

            if(this.mFaceCount % 4 == 0) {
                    face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager());
                    body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
            } else if (this.mFaceCount % 4 == 1) {
                    face = new AnimatedSprite(pX, pY, this.mCircleFaceTextureRegion, this.getVertexBufferObjectManager());
                    body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
            } else if (this.mFaceCount % 4 == 2) {
                    face = new AnimatedSprite(pX, pY, this.mTriangleFaceTextureRegion, this.getVertexBufferObjectManager());
                    body = PhysicsExample.createTriangleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
            } else {
                    face = new AnimatedSprite(pX, pY, this.mHexagonFaceTextureRegion, this.getVertexBufferObjectManager());
                    body = PhysicsExample.createHexagonBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
            }

            face.animate(200);

            this.mScene.attachChild(face);
            this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
    }

このコードが行うことは、その形状に応じてボディをスプライトに設定することです。mFaceCountは、面が追加されるたびにそれ自体に1を追加します。この行の機能:

if(this.mFaceCount % 4 == 0)

は、4で割ったときの余りが0(およびその他の場合は1、2、3)に等しいかどうかを確認するためのチェックです。これは、シーンに追加するスプライトを指示するだけです。最初に正方形、次に円、次に三角形、次に六角形を追加していることに気付くでしょう。

実際のコードは次の行にあります。

face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager());
                    body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);

これにより、faceと呼ばれるスプライトが作成され、ボックス本体がアタッチされます。次は円を付けます。次の2つが異なることに気付くでしょう。彼らは、PhysicsFactory.createの代わりにPhysicsExample.createと言います。PhysicsExampleはアクティビティであるため、PhysicsFactoryからではなくPhysicsExample内のメソッドを呼び出しています。createTriangleBodyは実際にこのメソッドを呼び出します(後でコードで):

private static Body createTriangleBody(final PhysicsWorld pPhysicsWorld, final IAreaShape pAreaShape, final BodyType pBodyType, final FixtureDef pFixtureDef) {
    /* Remember that the vertices are relative to the center-coordinates of the Shape. */
    final float halfWidth = pAreaShape.getWidthScaled() * 0.5f / PIXEL_TO_METER_RATIO_DEFAULT;
    final float halfHeight = pAreaShape.getHeightScaled() * 0.5f / PIXEL_TO_METER_RATIO_DEFAULT;

    final float top = -halfHeight;
    final float bottom = halfHeight;
    final float left = -halfHeight;
    final float centerX = 0;
    final float right = halfWidth;

    final Vector2[] vertices = {
            new Vector2(centerX, top),
            new Vector2(right, bottom),
            new Vector2(left, bottom)
    };

    return PhysicsFactory.createPolygonBody(pPhysicsWorld, pAreaShape, vertices, pBodyType, pFixtureDef);
}

これにより、スプライトの周りに三角形が作成されます(方法は聞かないでください。彼がここで使用した数学はわかりませんが、正確にコピーすると、ほぼ正三角形で機能します。頂点全体が多少再生されます。そして、私はベクトルを取得しないでください!!)。createHexagonMethodは、六角形だけで同じことを行います。私が望むあなたの質問に答えますか?何か忘れたら教えてください。

于 2012-07-20T06:22:28.410 に答える