Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Игра на JAVA > Читаю потихоньку исходники..


Автор: Kurt 3.11.2004, 15:42
Вот, читаю потихоньку исходники..
В файле Animation.java натолкнулся на такой код:
Цитата
public synchronized boolean update(long elapsedTime)
    {
        if (frames.size() > 1)
        {
            animTime += elapsedTime;

            if (animTime >= totalDuration)
            {
                animTime = animTime % totalDuration;
                currFrameIndex = 0;
            }

            while (animTime > getFrame(currFrameIndex).endTime)
            {
                currFrameIndex++;
            }
        }
        return false;
    }

Не понимаю, зачем здесь возвращается булевское значение?
Тут всегда возвращается false. Кроме того, я посмотрел по другим файлам - он, вроде, везде вызывается как
someObject.update() - т.е. нигде не проверяется возвращаемое значение.
Резюме - зачем здесь boolean и почему не void?

Автор: Domestic Cat 3.11.2004, 16:14
Animation я брал из Invasion, а тудa этот класс попал ещe откуда-то :) Очевидно, return здесь совсем не нужен. Вот допишу сервер, может дойдут руки подчистить :)

Автор: Kurt 3.11.2004, 23:51
Еще заметил такую фигню:
я запускаю класс Test из консоли.
Так вот, если моя текущая директория - директория, содержащая исходники - все ОК.
Иначе - он не находит map.txt, даже если он лежит в директории, откуда я запускаю.
Добавлено @ 23:53
Хотя это явно чисто тестовый баг, потом надо бы продумать строчку
[code=]parser.parse("map.txt");[/code]
сделать, чтоб искал в classpath и в текущей директории..

Автор: Kurt 4.11.2004, 01:57
Продолжаем..
Мне долго не давала покоя проблемка излишнего расхода ресурсов.
Таракан у меня на экране нет-нет да и моргал.
Предлагаю такое решение:
перед каждой перерисовкой делать небольшую задержку.
Вот, смотрите, я поменял чуток класс AbstractGame.java:
Цитата

..
public abstract class AbstractGame implements Runnable
..
    public void gameLoop()
    {
        long startTime = System.currentTimeMillis();
        currTime = startTime;
        while (isRunning)
        {
        try{
            Thread.currentThread().sleep(50);
        }
        catch(Exception ex){
           
        };
...

Кто заметит задержку в 50 миллисекунд между прорисовкой?
Однако, после добавления этого кода, все стало просто шикарно:
1) таракан ВООБЩЕ не моргает и при этом нормально передвигается;
2) приложение потребляет всего 10% процессорного времени - можно игратьcz и заниматься своими делами. :)
..
Ессно, можно развить эту мысль - например, вычислять необходимую задержку исходя их мощности и загруженности операционной системы, но это детали..

Автор: Domestic Cat 4.11.2004, 02:11
У меня при sleep(50) таракан стал "дергаться", а процессор оказался занят игрой на 60% ...
Маленькая задержка, скажем, в 5 мс вообще никак не влияет :(

К сожалению, при работе с сервером дергается всe куда хуже :)


Kurt, если есть желание, могу добавить тебя в девелоперы. Толькo нужен твой логин на сорсфорж

Автор: Kurt 4.11.2004, 02:15
Цитата
У меня при sleep(50) таракан стал "дергаться", а процессор оказался занят игрой на 60% ...
Маленькая задержка, скажем, в 5 мс вообще никак не влияет

Ну, я ж говорю - нужно считать fps и исходя их этого вычислять fps.
Надо подумать..
Кстати, у тебя вообще-то моргание наблюдалось?

Автор: Domestic Cat 4.11.2004, 02:26
Цитата(Kurt @ 3.11.2004, 17:15)

Кстати, у тебя вообще-то моргание наблюдалось?


Нет. Оно появляется только со sleep, а без негo всe идет очень гладко.

Автор: Kurt 4.11.2004, 02:40
Поверь мне наслово - у меня все наоборот.
Ладно, разберемся..

Автор: Domestic Cat 4.11.2004, 22:04
Тем не менее, идея помоглa smile я добавил Thread.sleep(100) в update сервера, и стало гораздо лучшe - таракан хотя и "скачет", но намногo плавнее.

Автор: DarkDS 4.11.2004, 22:34
Может попробовать сервер и таракана на разных машинах запустить?

Автор: Domestic Cat 4.11.2004, 22:47
Надо бы, но сначала стоит код причесать и заставить его нормально работать с локальным хостом.
Сегодня еще посмотрю, а затем можно пробовать smile

Автор: Kurt 4.11.2004, 23:02
Цитата
Тем не менее, идея помоглa

smile
Я думаю, на клиентах все же надо будет сделать такую задержку, вот только ее надо вычислать исходя их мощности системы - скорее всего у тебя получились косяки именно из-за разности между ресурсами наших машин - им всем нужны РАЗНЫЕ задержки. Иначе, у тебя все ОК, у меня даже просто мирно отдыхающий таракан постоянно моргает - непорядок..
Предлагаю ввести некоторое фиксированное кол-во fps (желательно, как можно меньше - чтоб меньше ресурсов есть..) и используя таймер и sleep - корректировать это значение, чтоб на всех машинах было одинаково.
Т.е. по событию таймера проверяем сколько было fps за прошедшую секунду и с помощью пропорций корректируем значение sleep.

Цитата
я добавил Thread.sleep(100) в update сервера

К сожалению, с сервером тоже придется сделать похожее - число 100 будет нормально работать на ТВОЕМ компе, не не факт что на более сильной/слабой машине будет все то же.
..
З.Ы. Чтоб поднять настроение и оптимистический настрой:
попробовал запустить в ASPLinux9.0+JVM1.4 - не грузит карту, из какой бы директории я не запускал это горе-приложение.. Надо поработать..
З.Ы.Ы. До этого запускал в OS WinXP SP1.

Автор: Domestic Cat 4.11.2004, 23:25
Цитата
Чтоб поднять настроение и оптимистический настрой:
попробовал запустить в ASPLinux9.0+JVM1.4 - не грузит карту, из какой бы директории я не запускал это горе-приложение.. Надо поработать..


Ох, то ли с путями не то, то ли с рисункамi smile

Цитата
К сожалению, с сервером тоже придется сделать похожее - число 100 будет нормально работать на ТВОЕМ компе, не не факт что на более сильной/слабой машине будет все то же.


И от коннекшнa тожe. Нo я думаю, 30-50 тоже хватит, а это подойдет в люб ом случае. jа доделал сервер, тепер' оn нe отсылаеt координаты объекта, если они nе измеnенились зa циkл.

Попишу ещe доки и выложу попозже.
Цитата
Я думаю, на клиентах все же надо будет сделать такую задержку, вот только ее надо вычислать исходя их мощности системы - скорее всего у тебя получились косяки именно из-за разности между ресурсами наших машин - им всем нужны РАЗНЫЕ задержки. Иначе, у тебя все ОК, у меня даже просто мирно отдыхающий таракан постоянно моргает - непорядок..


А это на лаптопе было?
Цитата
Т.е. по событию таймера проверяем сколько было fps за прошедшую секунду и с помощью пропорций корректируем значение sleep.


Оk, допишу расчет фпс, а там подберем параметры .

Автор: DarkDS 4.11.2004, 23:59
Цитата(Domestic @ 4.11.2004, 23:25)

Ох, то ли с путями не то, то ли с рисункамi

Уже выяснили - с рисунками... Нужно их а соурсейв как бинарики положить smile
У меня такая же ситуация smile

Автор: Domestic Cat 5.11.2004, 00:05
100 мс оказалось слишом много. Сделал 30 - даже не чувствуется, что есть нетворкинг smile smile
Дописываю доки и выкладываю.

Автор: DarkDS 5.11.2004, 00:06
зы. нужно поменять ключ у имеджей на -kb и перезалить

Автор: Domestic Cat 5.11.2004, 00:24
ок, сделаю следующий раз

Автор: Kurt 5.11.2004, 00:24
Да я уже догадался - собственно, зашел на форум отписать, что лажанулся с загрузкой. Сорри - надеюсь, мне, как новичку, простительно. smile
Однако, теперь другая фигня.
Запускаю клиент, сервер.
Появляется таракан, но при клике в любом месте таракан остается на месте, а в консоли появляется следующее:
Цитата
java.lang.ClassCastException
        at Receiver.doReceive(Receiver.java:147)
        at Receiver.access$100(Receiver.java:11)
        at Receiver$1.run(Receiver.java:105)

..
Цитата
А это на лаптопе было?

Моргание наблюдается на лаптопе и на "обычном" компе..

Автор: Domestic Cat 5.11.2004, 00:46
Цитата
Появляется таракан, но при клике в любом месте таракан остается на месте, а в консоли появляется следующее:


Хмм... Когда я сливал, все работало. Ну да ладно, я сейчас все равно пределываю и думаю через полчаса выложить новую версию smile

Автор: Sun 24.11.2004, 11:42
У меня есть замечание по классу SimpleFood.
1. Там нет смысла использовать массив анимаций. Достаточно одной.
2. В методе draw не нужно делать разворотов. Так-же еда не должна перемещатся и соответственно иметь направление.
Код

   public void draw(Graphics g, final Rectangle viewPort)
   {
       g.drawImage(getImage(),
               (int)Math.ceil(getX() - viewPort.x),
               (int)Math.ceil(getY() - viewPort.y),
               getWidth(),
               getHeight(),
               null);
   }

3. Нужно добавить конструктор с передачей имени файла который содержит анимацию и колличество кадров
Код

   public SimpleFood(String fileName, int frameCount)
   {
       Animation a  = new Animation();
       a.loadStripImageArray(IMAGE_DIR + fileName, frameCount);
       setAnimation(a);
   }

4. В методе eat() вызывать update. Или может добавить в класс Animation безусловный переход к следующему кадру. Число кадров в анимации должно соотвествовать числу фаз поеданий данного фуда.
5. Не имеет смысл делать статусов для еды. Когда последняя часть еды съедена - нужно удалять еду из списка объектов игры.

Автор: Domestic Cat 24.11.2004, 16:29
Цитата
1. Там нет смысла использовать массив анимаций. Достаточно одной.


Согласен.

Цитата
В методе draw не нужно делать разворотов. Так-же еда не должна перемещатся и соответственно иметь направление.


тоже согласен, но что если еда будет несимметричной ? Все время будет одинаково рисоваться.

Цитата
В методе eat() вызывать update. Или может добавить в класс Animation безусловный переход к следующему кадру. Число кадров в анимации должно соотвествовать числу фаз поеданий данного фуда.


Хорошая идея.
Цитата
Не имеет смысл делать статусов для еды. Когда последняя часть еды съедена - нужно удалять еду из списка объектов игры.


Ты имеешь в виду DEAD - ALIVE? Статуs удобен тем, что можно в 1 цикле будет перебрать все игровые объекты и тe что DEAD, удалить. А бez статуса nужно будет это в разных местах делать.

Автор: Sun 24.11.2004, 16:36
Цитата(Domestic @ 24.11.2004, 13:29)
Ты имеешь в виду DEAD - ALIVE? Статуs удобен тем, что можно в 1 цикле будет перебрать все игровые объекты и тe что DEAD, удалить. А бez статуса nужно будет это в разных местах делать.

Да, я это и имел в виду. На счет перебора объектов, пожалуй ты прав. Тогда у еды должно быть два статуса ALIVE и DEAD, и несколько фаз поедания.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)