39dylib
| |
zzzzza | Дата: Вторник, 28 Мая 2013, 00:50 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Всем привет) Делаю мморпг. Сервер-клиент сделал, регистрацию и вход тоже сделал. Дошел до отправки координат клиента на сервер и тут возникла проблема. Просто отправлять координаты клиента на сервер и отображение игрока в тех же координатах, где и клиент в сервере - это легко сделать. Когда подключается один клиент, на сервере игрок отображается хорошо - проблем нет. А вот когда подключается два и более клиентов, игроки на сервере начинают отображаться плохо - 1)спрайт игрока становится тусклым(почти прозрачным), 2)спрайт игрока(любого, то есть рандомно как-то выбирается) исчезает, потом может через некоторое время появится:D Попробовал кучу способов, которые в голову приходили, но ничего так и не исправилось. Пробовал через айди(разными способами), но тоже не получилось( Вопрос: Как можно осуществить передачу или прорисовку(может быть в прорисовки проблема, хотя вряд ли) координат, чтобы все хорошо отображалось?) P.S: Показать момент, когда спрайты становятся тусклыми не могу, почему не хочет скринить фрапс и принт скрин - на скрине видно только одного игрока( Если увидите ошибки или некорректно написанный текст, извиняйте, уже час ночи)) http://s47.radikal.ru/i117/1305/3f/179483930ff5.png http://i065.radikal.ru/1305/66/2c2127b6692d.png http://s56.radikal.ru/i152/1305/be/19b3f13d482d.png
Сообщение отредактировал zzzzza - Вторник, 28 Мая 2013, 01:05 |
|
| |
WfalconW | Дата: Вторник, 28 Мая 2013, 01:52 | Сообщение # 2 |
участник
Сейчас нет на сайте
| А с каким игроком проблема-то начинается? Т.е. когда подключается второй - исчезает и глючит первый игрок или как раз второй. И что происходит когда третий? Может быть проблема в последнем подключившимся. Скорее всего проблема в самом коде. После скринов появилось ощущение, что у тебя один объект бегает по всем координатом поочереди, которые приходят на сервер от клиентов. Вообщем - ты либ конкретнее углубись в поиск ошибки. Сделай, что бы каждый игрок разный цвет имел. Текст-боксы поставь в код, который ВОЗМОЖНО не работает или который НЕ должен работать. Либо кинь исходники, если у тебя там не супер-скретный код)
[2D] Paths of the rails v 1.1.0 [2D] Reflelight girl (Gamiron #4)
Сайт-блог разработок...
|
|
| |
XDominator | Дата: Вторник, 28 Мая 2013, 09:53 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Цитата (zzzzza) 1)спрайт игрока становится тусклым(почти прозрачным), 2)спрайт игрока(любого, то есть рандомно как-то выбирается) исчезает, потом может через некоторое время появится:D
Это как в медицине - глупо думать что 2 редких симптома, появившихся в 1 момент, могут относиться к 2-м разным редким заболеваниям... Я так думаю что проблема в обоих пунктах одна и та же - твой спрайт не становится прозрачным\тусклым, а начинает моргать(исчезать\появляться, каждый шаг) - в первом случае. Во втором случае, при выполнении ряда неких условий(приходит некий кейс, меняется некая переменная) - спрайт исчезает, и возвращается при возврате начального состояния системы. Скорее всего, ты где то намудрил со строками visible = true\false, возможно ты их ставишь как 1\0 при получении кейса с координатами, или что то в этом роде.
Вообще, тебе стоило начинать именно с системы движения массива игроков, потому что тут просто огромна куча подводных камней. Я в свое время тоже игрался с этой либой, и у меня тоже постоянно возникали подобные проблемы. рекомендую посетить сайт школы 39длл и скачать там пример basicmmorpg. Самой первой версии(0.7 вроде), тебе с головой хватит чтобы понять принципы построения кода в таких вещах. Лично я брал этот пример как основу, и уже к нему дописывал свой собственный код.
Кстати моя теория объясняет и то, почему фрапс не скринит твоего "призрака" Удачи)
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
zzzzza | Дата: Вторник, 28 Мая 2013, 13:44 | Сообщение # 4 |
участник
Сейчас нет на сайте
| XDominator, visible не использую. Условий в принятие координат нет.(кроме того, где проверяется a=0, ну это специально сделал, чтобы создавался один объект) obj_system-step: Код if (a=0) { player_id=instance_create(0,0,obj_player); a=1; } player_id.player_x=readshort(0); player_id.player_y=readshort(0); clearbuffer(0); Спасибо за пример, посмотрю его потом))
|
|
| |
XDominator | Дата: Вторник, 28 Мая 2013, 14:35 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Хм, а зачем ты пользуешь переменные player_x, player_y?Есть же встроенные x,y, их, вроде, для всего более чем достаточно...Или у тебя уже какая то система сглаживания?
Еще совет - отойди от объектов игроков, и сделай отдельный объект, который просто ничего не делающий спрайт будет. Тогда тебе будет более ясно, где у тебя ошибка. Судя по этому куску кода, ошибка у тебя именно в объекте игрока.
Дополнительно советую заменить а на instance_number(), которая возвращает кол-во инстанций объекта... В твоем случае условие бы выглядело так: if instance_number(obj_player) < 1 { }
Дополнительная рекомендация - создание объекта другого игрока и прием его координат должно храниться в разных кейсах. И дело даже не в том что так будет более оптимально, и что при таком подходе гораздо меньше неконтролируемого кода(в твоем случае это потенциальное зацикленное создание объектов при каждом приеме кейса) - дело даже в том, что в будущем, когда ты будешь усложнять игру, ты наверняка будешь вместе с созданием игрока присылать некоторые параметры для его создания - индекс спрайта, ники, еще какую нибудь сатану. Ты же не будешь их присылать в каждом пакете вместе с координатами, правда?
Чем больше у тебя вариантов "пакетов", тем лучше, имхо, и к тому же дает тебе большую наглядость кода, которая становится очень актуальной проблемой на 2-3 день разработки.
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Abel399 | Дата: Среда, 29 Мая 2013, 05:21 | Сообщение # 6 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Хотел бы еще добавить... ГДЕ ID игроков?!! Они не просто нужны... они ОБЯЗАТЕЛЬНЫ! Нужно хранить игроков в массиве. Например - players[id]. В этом массиве будет храниться индекс объекта. И при обращении к нему, ты обратишься к объекту. Вот пример кода, как все должно быть: Код a = readbyte(); switch(a) //Распределяем сообщения по кейсам. { case 0: //Здесь мы получим от сервера свой id. global.myid = readbyte(); obj_player.alarm[0] = 1; //Разрешаем игроку отправлять свои данные через определенный промежуток времени break;
case 1: //Пускай будет создание игрока. ind = readbyte(); //Считываем его айди user = instance_create(spawn.x,spawn.y,obj_player_other); user.name = readstring(); user.pid = ind; //Зададим игроку его айди. //Ну и здесь можно задавать любую начальную информацию. players[ind] = user; break;
case 2: //Обновление позиций и информации ind = readbyte(); user = players[ind]; user.x = readshort(); user.y = readshort(); user.sprite_index = readshort(); //Я у себя лично использую не спрайты, а статусы (бег, стойка и т.д.). user.image_index = readbyte\readshort(); // На твое усмотрение //Ну и дальше можно продолжать. break;
case 3: //Игрок ушел ind = readbyte(); user = players[ind]; with(user) instance_destroy(); players[ind] = -1; break; } Ну это поминимуму. Сервер думаю сообразишь как написать (мне просто это все с техи не удобно печатать). В общем, думаю понятно. Переменная a - это индекс сообщения. Если я правильно понял, то у тебя это тоже индекс.. Удачи)
P.S. А я выучил всю 39dll из примера Kirby Online
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Среда, 29 Мая 2013, 05:22 |
|
| |
XDominator | Дата: Среда, 29 Мая 2013, 09:12 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Кстати о сетевых библиотеках, весьма интересно как в гмстудии будут реализованы сетевые технологии, и придется ли под каждый отдельный вид соединения(3g, wi-fi, bt) писать разный код...
Но судя по примеру на их сайте, различий в типе коннекта не будет. Вот только на мобильных устройствах, судя по всему, придется клиент и сервер объединять в одно приложение... Не больно то удобно конечно
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Abel399 | Дата: Среда, 29 Мая 2013, 09:34 | Сообщение # 8 |
Surpass your limits. Right now.
Сейчас нет на сайте
| XDominator, А зачем на мобильнике иметь сервер? Разве он выдержит?... Да даже если и выдержит, то это не логично) Легче сервер делать под PC, а клиент на нужную платформу. Если вид связи одинаковый, то проблем возникать не должно)
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
krap | Дата: Среда, 29 Мая 2013, 13:49 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| Abel399, Цитата Хотел бы еще добавить... ГДЕ ID игроков?!! Они не просто нужны... они ОБЯЗАТЕЛЬНЫ! Нужно хранить игроков в массиве. Например - players[id]. В этом массиве будет храниться индекс объекта. И при обращении к нему, ты обратишься к объекту. Вот пример кода, как все должно быть: Код a = readbyte(); switch(a) //Распределяем сообщения по кейсам. { case 0: //Здесь мы получим от сервера свой id. global.myid = readbyte(); obj_player.alarm[0] = 1; //Разрешаем игроку отправлять свои данные через определенный промежуток времени break;
case 1: //Пускай будет создание игрока. ind = readbyte(); //Считываем его айди user = instance_create(spawn.x,spawn.y,obj_player_other); user.name = readstring(); user.pid = ind; //Зададим игроку его айди. //Ну и здесь можно задавать любую начальную информацию. players[ind] = user; break;
case 2: //Обновление позиций и информации ind = readbyte(); user = players[ind]; user.x = readshort(); user.y = readshort(); user.sprite_index = readshort(); //Я у себя лично использую не спрайты, а статусы (бег, стойка и т.д.). user.image_index = readbyte\readshort(); // На твое усмотрение //Ну и дальше можно продолжать. break;
case 3: //Игрок ушел ind = readbyte(); user = players[ind]; with(user) instance_destroy(); players[ind] = -1; break; }
Ну это поминимуму. Сервер думаю сообразишь как написать (мне просто это все с техи не удобно печатать). В общем, думаю понятно. Переменная a - это индекс сообщения. Если я правильно понял, то у тебя это тоже индекс.. Удачи)
P.S. А я выучил всю 39dll из примера Kirby Online это плохой стиль написания кода Вместо цифр используют пользовательские константы. Так намного читабельнее код))
|
|
| |
XDominator | Дата: Среда, 29 Мая 2013, 17:36 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Вариант с PC применим для массовых ММО через интернет, но ты же не будешь искать ПК, ставить на нем сервер, настраивать wi-fi сеть, и делать кучу других действий, если захочешь поиграть с друзьями во что то посредством wi-fi? В том то и фича студии - то что она работает, и, судя по всему, позволяет создать сервер на мобильных устройствах - например для игры на уроках\лекциях по сети для определенного контингента лиц
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Abel399 | Дата: Среда, 29 Мая 2013, 19:04 | Сообщение # 11 |
Surpass your limits. Right now.
Сейчас нет на сайте
| XDominator, В данной ситуации, я с вами полностью согласен) krap, Ну, у каждого свой стиль написания, а то что ваш стиль читабельней спорить не стану) Просто я научился использовать по 1 байту для распределения сообщений и привык к этому) А на счет констант, немного не понял.. Если можно, объясните, тогда и сам наверняка буду использовать ваш более читабельный способ) Спасибо за понимание
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Четверг, 30 Мая 2013, 13:32 |
|
| |
krap | Дата: Четверг, 30 Мая 2013, 10:32 | Сообщение # 12 |
почетный гость
Сейчас нет на сайте
| Abel399, оо видно сразу что не в теме... Константа- это переменная которая инициализируется числовым значением обычно в начале кода программы. Изменять их нельзя. Кароче, зайди в ресурсы затем жмякай define constants. Пиши константу, например Player_new и просвой ей какоето значение. Все. Теперь вместо циферок пишешь константы)
Сообщение отредактировал krap - Четверг, 30 Мая 2013, 10:32 |
|
| |
First | Дата: Четверг, 30 Мая 2013, 12:14 | Сообщение # 13 |
Уолтер Брайт
Сейчас нет на сайте
| MMOPRG != GM
|
|
| |
Abel399 | Дата: Четверг, 30 Мая 2013, 13:35 | Сообщение # 14 |
Surpass your limits. Right now.
Сейчас нет на сайте
| krap, То, что константы инициализируются в начале программы и изменять их нельзя - это я то знаю с самого первого знакомства с Pascal) А вот как ты имел ввиду их использовать, я не мог понять) Да и в ГМ ими как-то не пользовался) Зато спасибо за информацию, принцип я понял
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Четверг, 30 Мая 2013, 13:37 |
|
| |
XDominator | Дата: Четверг, 30 Мая 2013, 13:39 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| 2д сессионку вполне можно написать, или например кооператив на 2-10 человек
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
zzzzza | Дата: Четверг, 30 Мая 2013, 20:19 | Сообщение # 16 |
участник
Сейчас нет на сайте
| Спасибо за ответы))
Добавлено (30.05.2013, 20:19) --------------------------------------------- Как в basic mmorpg передаются координаты так и не понял, но зато придумал свой способ и все прекрасно работает:)
Сообщение отредактировал zzzzza - Четверг, 30 Мая 2013, 20:19 |
|
| |
|