Пятница, 26 Апреля 2024, 11:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » 39dylib
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 вроде), тебе с головой хватит чтобы понять принципы построения кода в таких вещах. Лично я брал этот пример как основу, и уже к нему дописывал свой собственный код.

Кстати моя теория объясняет и то, почему фрапс не скринит твоего "призрака" wink Удачи)


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 happy


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Среда, 29 Мая 2013, 05:22
XDominatorДата: Среда, 29 Мая 2013, 09:12 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Кстати о сетевых библиотеках, весьма интересно как в гмстудии будут реализованы сетевые технологии, и придется ли под каждый отдельный вид соединения(3g, wi-fi, bt) писать разный код...

Но судя по примеру на их сайте, различий в типе коннекта не будет. Вот только на мобильных устройствах, судя по всему, придется клиент и сервер объединять в одно приложение... Не больно то удобно конечно smile


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? В том то и фича студии - то что она работает, и, судя по всему, позволяет создать сервер на мобильных устройствах - например для игры на уроках\лекциях по сети для определенного контингента лиц wink

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
Abel399Дата: Среда, 29 Мая 2013, 19:04 | Сообщение # 11
Surpass your limits. Right now.
Сейчас нет на сайте
XDominator, В данной ситуации, я с вами полностью согласен)
krap, Ну, у каждого свой стиль написания, а то что ваш стиль читабельней спорить не стану) Просто я научился использовать по 1 байту для распределения сообщений и привык к этому) А на счет констант, немного не понял.. Если можно, объясните, тогда и сам наверняка буду использовать ваш более читабельный способ) Спасибо за понимание happy


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) А вот как ты имел ввиду их использовать, я не мог понять) Да и в ГМ ими как-то не пользовался) Зато спасибо за информацию, принцип я понял happy

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
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » 39dylib
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг