Player.IO. Пошаговые игры

Глубокое погружение в разработку сетевых игр мы начнем с самого простого типа игр — это пошаговые онлайн игры.

Давайте представим, что у нас есть два компьютера, связанные друг с другом, например, через провод. Впрочем, способ связи в нашем примере не имеет большого значения. Мы знаем одно — у соедененных компьютеров нет возможности узнать о том, что происходит, кроме как через этот провод.

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

Вот у нас есть два игрока, которые играют в шашки. Второй игрок решает ударить шашку первого игрока, но по какой-то причине сообщение о том, что второй игрок нанес удар не дошло до первого игрока. И теперь первый игрок совершенно не подозревает о том, что одна из его шашек была съедена. То есть на его экране ничего не изменилось. И это только начало большой беды.

Настала очередь первого игрока и теперь он пытается ударить шашку второго игрока.

Второй игрок видет, что его шашка убивается сама по себе и скорее всего заподозрит неладное. Тут возникает еще одна проблема и в будущем она породит еще больше проблем, что в итоге приведет к полному разрушению игрового процесса.

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

Но вы не можете отправить все данные, или отправлять изменения постоянно. Это просто не разумно! Вы должны посылать только ту информацию, которую должен знать игрок о текущем состоянии игры.

Например, если игрок нажал кнопку «прыжок», то вы должны отправить эту информацию на сервер, потому что иначе другим игрокам не возможно узнать о том, что произошло. Однако не следует отправлять информацию о том, где игрок приземлился или вовсе разбился. Из информации, которую вы отправили о прыжке, остальное должно быть уже известно.

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

В общем, следует отправлять только ключевую информацию о каких-либо действиях, сделанных игроком в игре. При этом следует игнорировать отправку тех данных, которые другие клиенты могут рассчитать сами. 

И так, мы имеем всего два повода для отправки данных другим клиентам: когда выполнено какое-либо действие игроком или когда происходит событие, которое не может быть предсказано, или зависит от игрового процесса независимо от самого игрока.

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

Чтобы объяснить еще понятнее, давайте рассмотрим пример. Представьте, что мы играем в шашки и первый игрок хочет двигаться от A2 до C4.

Чтобы сообщить об этом другому игроку, мы должны послать ключевые данные: откуда и куда происходит перемещение фигурки. Самый простой способ сделать это — это отправить координаты начальной и конечной клетки: [1,2] и [3,4]. Итого у нас получается всего четыре значения, код для отправки которых может выглядить следующим образом:

connection.send("move", 1, 2, 3, 4);

Помимо действий игрока могут возникать и какие-либо другие события или действия, которые важны для всех остальных. Мало какая игра обходится без генерации случайных значений, которые могут быть важны для остальных игроков. И в случае возникновения таких случайных данных, их так же необходимо отправить другим игрокам, чтобы случайные данные, которые важны в игровом процессе — для всех были идентичны. Например, если игрок получил некий произвольный урон, то необходимо сообщить об этом так же всем остальным игрокам.

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

Что ж, теперь мы перейдем к решению более интересных задач. Как вы думаете где происходит основной игровой процесс? Уверен, вы подозреваете, что игра протекает одновременно на всех компьютерах игроков. Но на деле все совсем не так...

Это вольный перевод статьи: «Building Flash Multiplayer Games — Turn Based Games»

Содержание

  1. Как создать онлайн игру? Анонс
  2. Player.IO. Введение
  3. Player.IO. Основы или первая онлайн игра
  4. Player.IO. Пошаговые игры
  5. Player.IO. Сетевые архитектуры
  6. Player.IO. Безопасность в онлайн играх
  7. Player.IO. Пример пошаговой игры
  8. Player.IO. Онлайн игры в реальном времени
  9. Player.IO. Синхронизация игроков
  10. Player.IO. Интерполяция или удивительный мир обмана
  11. Player.IO. Решение проблемы задержек
  12. Player.IO. Советы и рекомендации

 


Индикаторы: Уроки, Action Script 3
Постоянная ссылка

 

 

Круть , спасибо за урок !!!

Алексей
16 Октября 2012
— 22:36
#

Спасибо, ждем продолжения :)

Pavel
16 Октября 2012
— 23:10
#

Спасибо ! Ждем дальше =))

Rokzero
17 Октября 2012
— 00:53
#

Спасибо, жду продолжения!

Wily
17 Октября 2012
— 07:36
#

Привет Антон!
Я смотрю вы тоже начали разрабатывать игру под PlayerIO :)
Не пиара ради, а просто для маленькой заметки (вдруг у вас появятся идеи или вопросы) - заканчиваю свою игру которая тоже основана на PlayerIO. Прямую ссылку давать не буду, но вы легко найдете игру если вобьете в Вконтакте "Рубилово". Во всю использую gameFS, BigDB, errorLog.
Если вдруг захотите со мной связаться пишите: izmy.work на yandex.ru

Izmy
17 Октября 2012
— 15:17
#

Спасибо за урок!
И кстате этот солдат с зомботрона намного круче той картинки что была ранее)

SumBit
17 Октября 2012
— 16:22
#

...игра протекает на сервере.

Статья хорошая, но ИМХО почти бесполезная.

killer
17 Октября 2012
— 17:50
#

В оригинале статьи 14 шаг -

http://playerio.com/documentation/tutorials/building-flash-multiplayer-games-tutorial/example-real-time-interpolated

Виден только не работающий чат. wtf?

Neim
17 Октября 2012
— 18:36
#

@Izmy, нет я сейчас не занимаюсь разработкой сетевой игры. Но тема мне интересна и возможно пригодится в будущих проектах. Спасибо за предложение! :)

Ant.Karlov
17 Октября 2012
— 19:52
#

@killer, может быть вы не поняли, но суть статьи заключается в том что необходимо отправлять только ключевые данные, а не все подряд. В следующих статьях данная тема еще немного будет дополнена.

Ant.Karlov
17 Октября 2012
— 20:01
#

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

Ant.Karlov
17 Октября 2012
— 20:02
#

Антон, огромнейшее спасибо за уроки.
Сетевые игры давно были чем-то притягательным для меня. Хотелось как-нибудь собраться с силами и разобраться. Теперь же есть все шансы :) После прочтения первых уроков клиент-серверная архитектура уже не так пугает меня.

И подача материала небольшими порциями, но с короткими промежутками - весьма удачное решение.
Не пугает объем новой информации, но и не успеваешь забыть о чем речь шла в прошлом уроке.

Спасибо.

Андрей
19 Октября 2012
— 17:06
#

Добрый вечер!
Я хотел бы уточнить у автора. Написание кода программы под сервер Player.IO намертво привязывает данное приложение именно к этому ресурсу/серверу. Либо же отказ в пользу использования другого сервера не так категоричен и это, в принципе, не такое уж трудоемкое занятие?

П.С. Ваш блог просто офигителен, именно то, что я искал. С головой вчитываюсь в статью по таувер дефенсу в данный момент. Спасибо за Ваш труд!

Shaak
28 Октября 2012
— 22:00
#