Программирование многопользовательских игр

Я работаю над игрой, в которой несколько игроков должны иметь возможность играть одновременно. Это 2D игра, и все персонажи должны видеть движения друг друга на экране. Как и в игре, теперь все устройства просто отправляют и получают друг друга coordinates на сервер. Это делается путем запуска потоков:

public void StartCoordinatorFetcherThread(final Sprite Object)
{
    Thread CoordinateStarter = new Thread()
    {
        public void run()
        {           
            while(true)
            {
                Object.testing = Object.InternetObject.GetMessages();
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    CoordinateStarter.start();
}

public void StartCoordinatorPosterThread(final Sprite Object)
{
    Thread CoordinatePoster = new Thread()
    {
        public void run()
        {           
            while(true)
            {
                Object.InternetObject.PostCoordinates(Object.x,Object.y);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    CoordinatePoster.start();
}

В любом случае, я бы хотел, чтобы персонажи двигались более плавно, так как это может быть немного "laggy" делать это таким образом. Кто-нибудь знает, как я могу достичь этой цели?

Может быть, мне следует иметь тип стека координат, который просто постоянно получает координаты, а затем извлекает значения по мере запуска игры?

Любая помощь будет высоко оценена.

Привет!


person Araw    schedule 29.03.2012    source источник


Ответы (2)


Ознакомьтесь с методами линейной интерполяции/экстраполяции, чтобы сгладить движение. http://en.wikipedia.org/wiki/Linear_interpolation

вот некоторые ресурсы о том, как реализовать многие числовые алгоритмы на практике http://www.nr.com/

Удачи!

person Marko Hlebar    schedule 29.03.2012
comment
Спасибо, похоже, линейная интерполяция может помочь. Нашел пример на этом racer.nl/tech/multiplayer.html - person Araw; 29.03.2012
comment
Как звучит эта идея: я использую линейную интерполяцию и определяю, на сколько кадров она должна перемещаться при каждом обновлении экрана. Следовательно, если (в этом примере я сосредоточусь только на координате X) предыдущая координата была 40 (место, которое персонаж сейчас занимает на экране), текущая равна 60 (куда персонаж должен двигаться) и интервал обновления кадров составляет 5 координат для каждого обновления. Это означает, что я получу 4 (4*5) обновления до того, как персонаж достигнет 60. Так что я добавлю эти ходы в список событий только для данного персонажа, и запаздывающая часть практически исчезнет :) - person Araw; 30.03.2012
comment
В основном это процесс обработки предыдущих данных (интерполяция) и угадывания того, что произойдет до того, как будет получен следующий набор данных (экстраполяция). Если частота обновления сети составляет 10 кадров в секунду, а ваш цикл обновления составляет 60 кадров в секунду, вы должны экстраполировать (угадать) 5 точек с учетом предыдущего движения, чтобы получить плавные линии обхода. Когда вы получаете следующую точку из сети, вы выполняете интерполяцию фактических данных по предыдущему набору точек, а затем снова экстраполируете (угадываете) следующие 5 точек и так далее. Имеет ли это смысл? - person Marko Hlebar; 30.03.2012
comment
Я думаю, что понимаю, что вы мне говорите :) Но я думаю, что в этом случае мне придется переписать свой код, так как тогда мой образ мышления неверен :-/ - person Araw; 30.03.2012
comment
Я настоятельно рекомендую изучить интерполяцию кубическим сплайном, если вы можете хранить/получать доступ к частным производным первого порядка (ввод, скорость) от текущего и последнего тиков. Я использую это в симуляторе галактики, и это выглядит фантастически даже при рендеринге 50 кадров за тик. - person Philip Guin; 07.07.2013

Я знаю, что это flash, но это хороший туториал для улучшения движения игроков: http://playerio.com/documentation/tutorials/building-flash-multiplayer-games-tutorial/

person goodm    schedule 29.03.2012
comment
Тоже хорошая ссылка, рекомендую! - person Araw; 29.03.2012