Я довольно новичок в многопользовательском дизайне и изо всех сил пытаюсь найти информацию, которую мне нужно продолжать в моем синхронном режиме (вы не можете отключиться и продолжить позднее, подобно очагу), поверните 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);
}
}
большое спасибо за ваш ответ! Я согласен и буду использовать со многими вашими точками в моем коде. Я добавил конкретный вопрос к моему широкому запросу и надеюсь, что если вы сможете его использовать на основе опыта или, возможно, предложите альтернативный подход к обмену данными XMLSocket. – snizkorod
В основном ваш подход выглядит на стороне клиента, насколько я могу судить, читая руководства. Вы устанавливаете соединение, а затем начинаете бросать запросы с обеих сторон, заставляя ваше приложение вести себя по-разному на основе информации, полученной от сервера.Да, для этой цели может использоваться специальная механика, управляемая событиями, но вы должны сделать необходимые изменения на основе того, что игрок делает с его отображаемыми объектами, скажем, если его противник сыграл «выброс» против игрока, и он говорит, отброшен, он должен быть правильно отброшен без остатков пользовательского интерфейса. – Vesper
Благодарим вас за отзыв. Я был обеспокоен тем, что использование событий было бы громоздким из-за постоянного создания объектов событий. Я отправлю свой код, если у кого-то будет аналогичный вопрос в будущем. Большие пальцы, если можно. – snizkorod