LINUX.ORG.RU

Как сделать красивое меню в игре (Android java)

 ,


0

1

Хотелось бы что-то похожее на Angry Birds , мог бы и сам написать но столкнулся с проблемой - как остановить перерисовку и вызывать её своей функцией. То есть что-то похожее на QWidget::update() в Qt, вызывать его тогда когда на моей кнопке есть изменения(например человек нажал, но не отпустил , то что в CSS :active;) Готовые(родные) кнопки не использую, потому что установить для них картинку в качестве фона не получается(IDE говорит что это новая функция для API 19 , правда в XML это работает и на android 2.3)

Собственно про меню: для выбора уровня хочу использовать круглые «кнопки», есть три «карты» на которых по 15 уровней. Со старта приложения три рисунка карты, при нажатии на карту показывается 15 кружочков. Также хотелось бы при выборе уровня куда-то добавить рекламу.

★★★

Последнее исправление: abs (всего исправлений: 1)

Ответ на: комментарий от crowbar

SurfaceView

Его и использую. Но не получается, вот пример кода

class DrawThread extends Thread {

            public boolean running = false;
            public boolean update = false;
            private SurfaceHolder surfaceHolder;

            public DrawThread(SurfaceHolder surfaceHolder) {
                this.surfaceHolder = surfaceHolder;
            }

            public void setRunning(boolean running) {
                this.running = running;
            }
            public void update() {this.update = true;//this.running = true;
                this.run();
                Log.e("" , "2");}

            @Override
            public void run() {
                Log.e("" , "2.5");
                Canvas canvas;
                while (running || update) {
                    canvas = null;
                    try {
                        canvas = surfaceHolder.lockCanvas(null);
                        if (canvas == null)
                            continue;

                        update = false;
                        Log.e("" , "3");
                        curTime = System.currentTimeMillis() - timeout;
                        timeout = System.currentTimeMillis();


                        if(pauseGame){
                            Log.e("" , "4");

Я делаю drawThread.running = false; А потом при событиях тача(нажатие, движение, отпуск) drawThread.update();

abs ★★★
() автор топика
Ответ на: комментарий от crowbar

Так вот, Log.e(«» , «2.5»); это не срабатывает.

abs ★★★
() автор топика
Ответ на: комментарий от crowbar

Смысл его для небольшой 2д игры тащить?

Вот-вот, даже на 3 летнем телефоне, 60 ФПС на SurfaceView.

Так все-таки, как решить проблему? Можно ссылку на описание как правильно сделать меню на SurfaceView ?

abs ★★★
() автор топика
Ответ на: комментарий от abs

У меня цикл в методе run работает непрерывно и после отрисовки всех анимаций засыпает. Любое внешнее событие его будит для дальнейшей отрисовки.

Я делал по аналогии с примером LunarLander из SDK, только добавил оптимизацию чтобы не перерисовывать экран если ничего не изменилось.

Как-то так: http://pastebin.com/Fq6cwyBS

crowbar
()
Ответ на: комментарий от crowbar

SurfaceView очень странно себя ведет, я не использовал твой код, но немного переписал свой, теперь я никогда не останавливаю поток рисования, но перестаю рисовать что-либо и вызываю «сон»

if(pauseGame){

    if(update){
        Log.e("" , "4");
        update = false;
        // My Menu draw;
    }else{
        try {
            Thread.sleep(160);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}else{
   //My Game draw;
}

Проблема в том, что после этого, я вижу странные вещи, состояние меняется из меню в игру. Иногда игра продолжает медленно «игратся». А иногда просто отрисовывается. Изображение «блымает» туда-сюда между двумя состояниями.

abs ★★★
() автор топика
Ответ на: комментарий от crowbar

До меня только сейчас дошло что это возможно двойная буферизация. Но разве она должна себя так вести в моем случае? Как её отключить?

П.С. создается чувство что здесь она тройная.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Таки да, проблема была в двойной(или более) буферизации, исправил перестав вызывать lockCanvas()/unlockCanvasAndPost() когда не нужно обновление.

abs ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.