2

誰かが私を正しい方向に向けることができるのだろうか.

弾丸のようなオブジェクトを静的な位置から画面上の任意の領域にアニメーション化できるようにしたいと考えています。

単純な水平および垂直の動きには問題ありません。つまり、x +/- 1 または y +/- 1 です。しかし、弾丸のようなオブジェクトに関しては、どの程度でも移動/アニメーション化できるため、アニメーションを滑らかに見せる方法がよくわかりません。たとえば、18、45、または 33 度の角度では、y+1、x+1、y+1..... のようなアルゴリズムでは、アニメーションが非常にスムーズになりません。

前もって感謝します

Ps たぶん、すでにいくつかのドキュメントが公開されているのではないでしょうか?


アップデート

返信してくれたみんなに感謝します。

これは、あなたのコメントに基づいてこれまでに作成したコードです。

package com.bullet;

//imports go here

public class canvas extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback{

    private Bitmap bullet;
    private int bulletStartX, bulletStartY;
    private int bulletX, bulletY;
    private int bulletEndX = -1;
    private int bulletEndY = -1;
    private int incX = 0;
    private int incY = 0;

    private SurfaceHolder holder;
    private Thread t;


    public canvas(Context context) {
        super(context);

        this.setBackgroundColor(Color.WHITE);
        setFocusable(true);
        setFocusableInTouchMode(true);
        setOnTouchListener(this);

        bulletStartX = 0;
        bulletStartY = 0;

        bulletX = bulletStartX;
        bulletY = bulletStartY;

        bullet = BitmapFactory.decodeResource(getResources(), R.drawable.bullet);

        holder = getHolder();
        holder.addCallback(this);
    }

    public void onDraw(Canvas canvas){
        if(bulletEndX != -1 && bulletEndY != -1){
            Log.e("here", "drawing bullet");
            Log.e("here", "x: " + bulletX + ", y: " + bulletY);
            canvas.drawBitmap(bullet, bulletX, bulletY, null);
        }
    }

    public void updateBullet(){

        Log.e("here", "inc bullet");

        bulletX += incX;
        bulletY += incY;

        if(bulletX > bulletEndX){
            bulletEndX = -1;
        }

        if(bulletY > bulletEndY){
            bulletEndY = -1;
        }

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int[] coordinates = {(int) event.getX(), (int) event.getY()};
        int motion = event.getAction();


        switch(motion){
            case MotionEvent.ACTION_DOWN:

                break;
            case MotionEvent.ACTION_MOVE:

                break;
            case MotionEvent.ACTION_UP:
                bulletX = bulletStartX;
                bulletY = bulletStartY;
                bulletEndX = (int) event.getX();
                bulletEndY = (int) event.getY();
                incX = (int) bulletEndX / 50;
                incY = (int) bulletEndY / 50;
                Log.e("here", "touch up");
                break;
        }


        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        t = new GameThread(this, holder);
        t.start();  
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    //Thread class
    class GameThread extends Thread{
        private canvas canvas;
        private SurfaceHolder holder;
        private boolean run = false;
        long delay = 70;

        public GameThread(canvas canvas, SurfaceHolder holder){
            this.holder = holder;
            this.canvas = canvas;
            startThread(true);
        }

        public boolean isRunning(){
            return this.run;
        }

        private void startThread(boolean run){
            this.run = run;
        }

        public void stopThread(){
            this.run = false;
        }

        @Override
        public void run(){
            while(run){
                    Canvas c = null;
                     try {
                           //lock canvas so nothing else can use it
                           c = holder.lockCanvas(null);
                           synchronized (holder) {
                                //clear the screen with the black painter.
                                //This is where we draw the game engine.
                                //Log.e("drawthread", "running");
                                if(bulletEndX != -1 && bulletEndY != -1){
                                    updateBullet();
                                    canvas.postInvalidate();
                                }
                                canvas.onDraw(c);

                                //Log.e("drawthread", "ran");
                                try {
                                    sleep(32);
                                    //Log.e("slept", "sleeping");
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                         }
                     } finally {
                         // do this in a finally so that if an exception is thrown
                         // during the above, we don't leave the Surface in an
                         // inconsistent state
                         if (c != null) {
                             holder.unlockCanvasAndPost(c);
                         }
                     }
            }
        }
    }
}

描画はうまく機能しますが、2 つの問題があります。

1.描画はかなり遅くてびくびくしています...このJavaの例のようなものと比較してhttp://www.youtube.com/watch?v=-g5CyPQlIo4

2.クリックが Y = 0 に近い位置にある場合、ENDY / FRAME の値が 1 より小さいため、切り上げが 0 になり、弾丸が画面の上部を横切って移動することを意味します。 Y の時折の増分。

@ SyntaxT3rr0rあなたの権利、それはおそらく最善の方法です。しかし、このようなものを実装するためのドキュメントを知っていますか?

返信してくれたすべての人にもう一度感謝します

4

3 に答える 3

2

Android でのアニメーションに固有の実装の詳細について質問するのではなく、フレームごとに弾丸を移動する x&y ピクセル数を決定する方法を質問していると理解しています。

短い答え: Math :P で攻撃する 箇条書きの例:

-「アニメーションを 100 フレームに分割し、できるだけ速く再生する」または「約 2 秒でアニメーションを再生し、その 2 秒間でできるだけ多くのフレームを粉砕する」ように、アニメーションを切り刻むことができます。前者について説明します。それはあなたがやろうとしていることのように聞こえるからです。

X と Y の開始と X と Y の終了から始めます。0,0 から 200,400 まで移動したいと考えて、アニメーションの約 100 フレームでそれを実行したいとします。

X 軸に沿って移動した合計距離をフレーム数で割ります。Y 軸に沿った合計距離についても同じことを行います。これで、各フレームの x & y の移動距離がわかりました。この例では、弾丸を 1 フレームあたり 2 ピクセル (200 ピクセル / 100 フレーム) 横に移動させ、1 フレームあたり 4 ピクセル (400 ピクセル / 100 フレーム) 縦に移動させます。したがって、すべてのフレームで x +=2、y+=4 を追加します。

于 2011-06-13T23:44:58.673 に答える
1

以下の記事を読むことをお勧めします。

ビュー アニメーションプロパティ アニメーション

于 2011-06-13T23:26:49.033 に答える
1

これは今の形では答えられないと思います。まず、アニメ化はどうですか?グラフィックAPIを使用していますか?GL?そしてエンジン?

グラフィック API の場合、キャンバスを適切な角度だけ回転させ、弾丸を y 軸に沿って上に移動します。

GL でも同じことができます。

およびエンジンについては、チュートリアルを参照してください。

于 2011-06-13T23:27:44.877 に答える