2015-03-10 14 views
0

Я довольно новичок в многопользовательском дизайне и изо всех сил пытаюсь найти информацию, которую мне нужно продолжать в моем синхронном режиме (вы не можете отключиться и продолжить позднее, подобно очагу), поверните pvp-карточная игра. Я использую AS3 (flash) в качестве моей клиентской стороны и node.js с javascript + mysql для обработки на стороне сервера.Подход XMLSocket для игры с многопользовательской картой/домашним животным

В этой игре карты создаются самими игроками. Это importnat отметить, что эти «карты» собираются из отдельных строительных блоков (библиотеки swf-файлов); База данных отслеживает, как эти карты создаются/собираются. Потому что на одного игрока может быть сотни карт с одинаковым успехом, мне нужен хороший способ загрузить информацию о них по требованию для сражений в пвп или для создания моддинга/палубы.

Что я достиг до сих пор:

  • я успешно отправлены данные на сервер и отправил данные обратно на флэш над XMLSocket.
  • Я успешно собрал одну «карточку» из базы данных.

Какие вопросы мне действительно нужно ответить:

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

  • Для глобального класса мессенджера подхода, я не уверен, как получить полностью загруженные данные из мессенджера по потоку коды (as3 продолжает выполнение, даже если данные Isnt есть) или как обеспечить, что запрос относится к соответствующего вызов

    • я мог бы использовать систему запроса ID для однозначной идентификации запроса сокета
    • я мог бы разработать систему
    • приводимых пользовательские событий я мог породить несколько объектов мессенджеров в каждом классе, что мне нужно на е. < - im склоняется к этому варианту.
  • На подобной ноте, возможно, я должен обрабатывать запросы к базе данных в пределах объектов карты или поджать все данные до начала игры (Это ограничило бы мне только запрос для противника карты и боевые данные на лету). С одним вызовом на один подход к объекту карты я был не уверен, что если на каждую карту на каждый игрок будет подано новое задание, то он перегрузит мой сервер или нет. Node.js очень хорошо масштабируется, но у меня нет сетевых знаний, чтобы понять, будет ли слишком много одновременного запроса на одном порту.

EDIT: Я сильно склоняюсь к использованию синглтона XMLSocket Wrapper или расширенному класса какого-то иметь дело со всеми сетевыми транзакциями, так что кажется интуитивно понятной для меня. Я был бы очень признателен за ваши отзывы о наилучшем подходе к уведомлению моего кода о том, что мессенджер получил и проанализировал запрошенное сообщение (поскольку флеш продолжит выполнение, даже если данные отсутствуют, мне нужен хороший способ сделать это.).Я читал, что использование пользовательских событий не так уж и потрясающе, и есть лучшие способы ... но вот как я подхожу к проблеме.

Например, я могу сделать (псевдокод).

m:Messenger = new Messenger(); //this is my wrapper 
m.addEventListener(new CustomEvent(CustomEvent.EVENTSTRING, parseData)); 
m.sendData(DataObject); //calls 

function parseData(e:CustomEvent) { 
    xml(e.data); 
} 

import flash.net.XMLSocket; 
import globals.*; 
public class Messenger 
{ 
    public static var _Socket:XMLSocket; 
    public var xml:XML; 

    public function Messenger() 
    { 
     _Socket = new XMLSocket(vars._Server, vars._Port); 
     _Socket.addEventListener(Event.CONNECT, onConnect); 
     _Socket.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    } 

    private function onConnect(evt:Event):void { 
     trace("Connected"); 
     _Socket.removeEventListener(Event.CONNECT, onConnect); 
     _Socket.removeEventListener(IOErrorEvent.IO_ERROR, onError); 

     _Socket.addEventListener(DataEvent.DATA, onDataReceived); 
     _Socket.addEventListener(Event.CLOSE, onSocketClose);    
    } 

    private function onDataReceived(evt:DataEvent):void { 
     //trigger correct event here based on data identifier w/ dispatchEvent(EVENTSTRING); 
    } 
} 

ответ

0

О сборке карты - вы должны хранить данные в базе данных, которая не требует перерасчета, поэтому, если карта построена из нескольких «строительных блоков», вы могли бы, например, магазин последовательность блоков в одной строке базы данных, так что, когда информация о карте для противника будет восстановлена, вы получите только select from player_cards where player_id=... and deck_id=..., а затем соберете собранные данные на стороне AS3. Вы не должны ставить эту нагрузку на сервер.

Об асинхронной загрузке - убедитесь, что ваше рукопожатие PVP ожидает, что обе стороны успешно обработают карты как для своей стороны, так и для врага. Вы можете загружать данные асинхронно, но вам лучше делать полную предварительную загрузку при отображении экрана «Загрузка bla-bla» на плеер, а затем работать с полученными данными. Да, вы можете выполнять несколько запросов на свой сервер, и да, вы можете дождаться их успеха до отображения экрана «Battle Start», в то время AS3 будет ждать завершения загрузки. Но о единичном или множественном запросе - я говорю, как можно меньше, потому что каждый добавленный запрос на этапе инициализации потенциально может добавить тысячу запросов на один сервер и потенциально может нанести слишком большой нагрузке на вашей серверной части, что приводит к самоиндуцированному DDoS. Убедитесь, что ваша структура базы данных позволяет оптимизировать работу по чтению данных прямо на стороне клиента, так что ваш сервер не находится под большой нагрузкой от подготовки данных. Но также убедитесь, что вы дважды проверяете, какие клиенты сообщают серверу, поскольку основным правилом клиент-серверных игр является предположение «клиент всегда лежит».

Поскольку вы планируете совершать действия игрока в серверном процессе в середине битвы, вы можете создавать временные таблицы на сервере (на основе SQL) или на объектах состояния (на основе процессов), которые будут содержать текущее состояние игры со ссылками на все способности, которые имеют карты и их состояние (в руке, отброшены, в игре, уничтожены и т. д.), так что, когда действие от игрока происходит, говоря, что «эта карта меняет состояние с А на Б», вы можете легко проверить, в состоянии A, затем переключите его в состояние B, выполняя любые действия, которые являются результатом этого изменения состояния на обеих сторонах сервера и клиента. Обязательно очистите этот набор данных, как только битва закончится. Это требует тщательного планирования вашей серверной части, так что ваш игровой движок не остановит сервер при запуске некоторой последовательности действий из-за избыточных запросов SQL, например.

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

В целом, вопрос очень широкий, и только советы могут быть даны, даже примеры.

+0

большое спасибо за ваш ответ! Я согласен и буду использовать со многими вашими точками в моем коде. Я добавил конкретный вопрос к моему широкому запросу и надеюсь, что если вы сможете его использовать на основе опыта или, возможно, предложите альтернативный подход к обмену данными XMLSocket. – snizkorod

+0

В основном ваш подход выглядит на стороне клиента, насколько я могу судить, читая руководства. Вы устанавливаете соединение, а затем начинаете бросать запросы с обеих сторон, заставляя ваше приложение вести себя по-разному на основе информации, полученной от сервера.Да, для этой цели может использоваться специальная механика, управляемая событиями, но вы должны сделать необходимые изменения на основе того, что игрок делает с его отображаемыми объектами, скажем, если его противник сыграл «выброс» против игрока, и он говорит, отброшен, он должен быть правильно отброшен без остатков пользовательского интерфейса. – Vesper

+0

Благодарим вас за отзыв. Я был обеспокоен тем, что использование событий было бы громоздким из-за постоянного создания объектов событий. Я отправлю свой код, если у кого-то будет аналогичный вопрос в будущем. Большие пальцы, если можно. – snizkorod