Вызов функции в соответствии с системным временем - PullRequest
1 голос
/ 29 декабря 2010

У меня проблемы с правильным вызовом функции по системному времени. Моя главная цель - улучшить эффект движения моего объекта «Бомбермен». К сожалению, это ведет себя странно. Я считаю, что есть маленькая глупая ошибка, но я не могу найти из-за бессонных 30 часов. Вот мой код:

                if (System.currentTimeMillis() % 600 <= 200) {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up3.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up3.gif");
                    }
                } else if (System.currentTimeMillis() % 600 <= 400) {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up2.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up2.gif");
                    }


                } else if (System.currentTimeMillis() % 600 >= 400)
                {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up1.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up1.gif");
                    }
                }

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

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

1 Ответ

2 голосов
/ 29 декабря 2010

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

Было бы лучше создать очередь элементов для рисования с заданным временем обновления, поскольку ваш код будет становиться все более и более сложным, если вы просто будете использовать множество операторов if вместо абстракций OO.

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

Так что яBomberMan должен реализовать интерфейс с методом draw ( Graphics2D g, long time ), который реализуют все анимированные элементы, и иметь методы get и set вместо открытого поля isImmune.Методы get и set изменяют значение массива изображений для спрайта, поэтому коду не нужно знать ни о каком другом состоянии, в котором находится бомбардировщик.

...