0

Androidでユーザーが描いた線上に一連の正方形のスプライトを配置しようとしています。

指を下に向ける/指を上に向けるポイントのx/y座標は次のとおりです。

Vector2[] points = { new Vector2(mFingerStartX, mFingerStartY), new Vector2(mFingerEndX, mFingerEndY) };

との距離があります:

float distance = points[0].dst(points[1]);

回線に必要なブロック数(64x64px):

int blockNumber = (int) Math.floor(distance / 64);

でもここからどこへ行けばいいのかわからない!私の最終的な目標は、正方形のスプライトの線を並べ、それぞれを線の方向に回転させて、滑らかな線を形成することです。

私が想像しているのは、必要なブロックごとに、ブロックを線上の点に配置し、正しい方向に回転させ、線を64ピクセル下に移動し、必要な数のブロックが配置されるまで繰り返します。

要約:回転の程度と、スプライトを配置する必要のあるポイントを取得するにはどうすればよいですか?

編集:これは私がどこまで得たかです。回転はうまくいきましたが、スプライトを正しく並べることができないようです。誰かが私がどこで間違っているのかわかりますか?

            float mFingerEndX = pSceneTouchEvent.getX();
            float mFingerEndY = pSceneTouchEvent.getY();

            Vector2[] points = { new Vector2(mFingerStartX, 800 - mFingerStartY), new Vector2(mFingerEndX, 800 - mFingerEndY) };
            float distance = points[0].dst(points[1]);

            int blockNumber = (int) Math.floor(distance / 64);  //get the number of ice blocks needed to fill the area

            double angle = Math.atan2(points[0].x - points[1].x, points[0].y - points[1].y);
            double degrees = Math.toDegrees(angle);

            Debug.d("Degrees: " + String.valueOf(degrees));

            for (int i = 0; i < blockNumber; i++) {
                double deltaX = Math.cos(degrees) * 32;
                double deltaY = Math.sin(degrees) * 32;

                float xLocation = (float) ((i * deltaX) + mFingerStartX);
                float yLocation = (float) ((i * deltaY) + mFingerStartY);
                final Sprite iceSprite = new Sprite(xLocation, yLocation, this.mIceBlockRegion, this.getVertexBufferObjectManager());
                iceSprite.setRotation((float) (180 - Math.abs(degrees)));
                mScene.attachChild(iceSprite);
            }
4

1 に答える 1

2

それぞれについてblockNumber、ユーザーが描いた線のその部分の一方の端からもう一方の端までの相対回転を計算します。これは直角三角形の斜辺であり、そのセグメントの垂直距離と水平距離もあるので、いくつかの基本的な三角関数を使用して垂直から角度を遠ざけることができます。スプライトをその角度に回転させて配置します(下部の中央を下部のポイントに合わせます)。一番上に到達するまで、ライン上のすべてのスプライトに対してこれを繰り返します。

ユーザーが描く線があまり滑らかでない場合、スプライトはシームレスになりませんが、それはまったく別の問題です。

于 2012-08-09T16:54:25.583 に答える