Поток объектов Java / Android Bullet - PullRequest
2 голосов
/ 14 июня 2011

Интересно, кто-нибудь может указать мне правильное направление?

Я хочу иметь возможность анимировать объект, как пуля, из статического положения в любую область на экране.

Iне имеет проблем с простыми горизонтальными и вертикальными движениями.Т.е. 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);
                         }
                     }
            }
        }
    }
}

Рисунок работает довольно хорошо, но есть две проблемы.

1. чертеждовольно медленный и нервный ... по сравнению с чем-то вроде этого примера java http://www.youtube.com/watch?v=-g5CyPQlIo4

2. Если щелчок находится на позиции, близкой к Y = 0, то из-за значенияесли ENDY / FRAME меньше 1, это означает, что округление до 0 и пуля проходит через верхнюю часть экрана, а не случайное увеличение Y.

@ SyntaxT3rr0r по праву, то естьлучший способ сделать это.Но знаете ли вы какую-либо документацию для реализации чего-то подобного?

Еще раз спасибо всем, кто ответил

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Насколько я понимаю, вы спрашиваете, как определить количество пикселей x & y для перемещения маркера на кадр, а не спрашивать о деталях реализации, специфичных для анимации на Android.

Краткий ответ: Атакуй его с помощью Math: P На примере пули:

-Можно разделить анимацию как «разделить анимацию на 100 кадров, воспроизвести их как можно быстрее» или «Воспроизвести анимацию за 2 секунды, разбить столько кадров за эти 2 секунды, сколько сможете «. Я собираюсь объяснить первое, потому что это звучит как то, что вы пытаетесь сделать.

Начните с начальных X & Y и конечных X & Y: представим, что вы хотите перейти с 0,0 на 200 400 и хотите сделать это примерно за 100 кадров анимации.

Разделите общее расстояние, пройденное вдоль оси X, на количество кадров. Сделайте то же самое с общим расстоянием вдоль оси Y. Теперь у вас есть расстояние, чтобы пройти x & y для каждого кадра. В этом примере вы хотите, чтобы маркер перемещался на 2 пикселя на кадр (200 пикселей / 100 кадров) вбок и на 4 пикселя на кадр (400 пикселей / 100 кадров) по вертикали. Таким образом, каждый кадр, добавьте x + = 2, y + = 4.

1 голос
/ 14 июня 2011

Я не думаю, что на это можно ответить в его текущей форме. Во-первых, как вы оживляете? Вы используете графический API? GL? AndEngine

Если бы это API графики, я бы повернул холст на соответствующую степень и переместил бы маркер вверх по оси Y.

Для GL вы можете сделать то же самое.

Информация о двигателе приведена в руководствах .

1 голос
/ 14 июня 2011

Предлагаю вам прочитать следующие статьи:

Просмотр анимации и Свойство анимации

...