Фон прокрутки игры для Android - PullRequest
4 голосов
/ 04 февраля 2011

Я просто пытаюсь выяснить лучший подход для запуска скроллинг фона на устройстве Android. Метод, который у меня есть до сих пор .... его довольно отстает. Я использую темы, которые я считаю не лучшим выбором для платформ Android

@Override
    public void run() {
        // Game Loop
        while(runningThread){
            //Scroll background down
            bgY += 1;

            try {
                this.postInvalidate();
                t.sleep(10);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

где postinvalidate в функции onDraw просто опускает фоновое изображение вниз

canvas.drawBitmap(backgroundImage, bgX, bgY, null);

Заранее спасибо


UPDATE

Я определил проблему. И это факт, что мой игрок обновляет ту же скорость, что и фоновые прокрутки (что делает его нестабильным). сверху вниз. Это потому, что оба рисуются в одной и той же функции. Я не совсем уверен, как справиться с этим, и был бы благодарен за любую помощь. т.е. чтобы движение игрока обрабатывалось отдельно от прокрутки карты

Также, как я могу контролировать скорость вызова onDraw (canvas)?

Заранее спасибо.

Однако я собрал воедино другой цикл выполнения для тех, у кого возникла такая же проблема. Это частично из примера Джетбой на Google.

Ниже мой внутренний класс в моем виде поверхности

class MapThread extends Thread{
    private Map map;
    private SurfaceHolder holder;
    private boolean run = false;

    public MapThread(Map map, SurfaceHolder holder){
        this.holder = holder;
        this.map = map;
        setRunning(true);
    }

    public void setRunning(boolean run){
        this.run = run;
    }

    @Override
    public void run(){
        while(run){
            try{
                Canvas c = null;

                 try {
                       c = holder.lockCanvas(null);
                       synchronized (holder) {
                            map.onDraw(c);
                     }
                 } finally {

                     if (c != null) {
                         holder.unlockCanvasAndPost(c);
                     }
                 }
        }
    }
}

РЕШЕНИЕ

https://gamedev.stackexchange.com/questions/8127/android-game-scrolling-background

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Используйте на экране рисование реализации SurfaceView .Это позволяет вам лучше контролировать, что рисовать и когда.

SurfaceView - это специальный подкласс View, который предлагает выделенную поверхность для рисования в иерархии View.Цель состоит в том, чтобы предложить эту поверхность рисования вторичному потоку приложения, чтобы приложению не приходилось ждать, пока иерархия представления системы будет готова к рисованию.

Основной дизайн состоит в том, чтобы иметьвид поверхности, который рисует непрерывно в цикле while.Затем добавьте оператор if, условие которого должно быть истинным, если поток таймера сообщает вам, что пора рисовать.Скажем, каждые 30 мс нарисуйте растровое изображение.Это даст вам около 33 кадров в секунду.

Теперь у вас также может быть другой поток таймера, который сообщает вам, когда обновлять значения bgX или bgY.Скажем, каждые 60 мс будет устанавливаться логическое updateFlag = true;Затем в главном потоке у вас есть оператор if, который проверяет этот флаг, устанавливает его в false и обновляет значения bgX и bgY.Точно контролируя таймер и приращения bgX / bgY, вы сможете создавать плавные анимации.

Было бы неплохо взглянуть на исходный код LunarLander, предоставленный Google.

0 голосов
/ 22 февраля 2012

Я использую этот метод на втором уровне моей игры SpaceQuestAlpha.Это делает безудержный свиток.

Я использовал две строки ниже, чтобы установить исходное положение.

              moony=0;
              moon2y=-(heighty); 

Затем эти строки увеличивают обе версии фонового изображения.Один начинается с 0, а другой начинается с отрицательной высоты экрана.Каждый раз, когда одно из изображений опускается ниже нижней части экрана, оно сдвигается вверх вдвое по высоте, чтобы переместить его обратно в нужное положение.Я использую вид поверхности без задержек.

              moony+=5;
              moon2y+=5;


                 if(moon2y>=heighty) {moon2y=moon2y-(heighty*2);}
                     canvas.drawBitmap(lavabackground, 0, moon2y, null); 
                 if(moony>=heighty){moony=moony-(heighty*2);}
                     canvas.drawBitmap(lavabackground, 0, moony, null);
0 голосов
/ 04 февраля 2011

Нужно иметь в виду, что сон очень неточный. Чтобы обойти это, вы можете точно отслеживать, сколько времени прошло во время сна, и обновлять, насколько вы соответственно двигаете вещи.

Код не понятен из вашего кода, но вы должны убедиться, что все обновления вашего пользовательского интерфейса происходят в потоке пользовательского интерфейса.

Вам необходимо настроить время вне потока пользовательского интерфейса, потому что в противном случае пользовательский интерфейс никогда не обновится. Существуют и другие методы синхронизации, например, использование Handler , которое может быть немного чище, но я думаю, что накладные расходы на них могут быть слишком большими для того, что вы пытаетесь сделать. Я думаю, что простой поток имеет наименьшее количество накладных расходов.

...