Четверг, 25 Апреля 2024, 05:19

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » XDominator [389]
Результаты поиска
XDominatorДата: Вторник, 18 Марта 2014, 09:59 | Сообщение # 321 | Тема: Прошу помощи...Плачу 50 рублей вебмани
постоянный участник
Сейчас нет на сайте
А возвращать стандартные иконки пробовал? И как обстоят дела на устройстве?

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Четверг, 13 Марта 2014, 10:15 | Сообщение # 322 | Тема: 39DLL
постоянный участник
Сейчас нет на сайте
Ты можешь пользоваться несколькими буфферами. Например, может возникнуть такая ситуация, что тебе разным клиентам одновременно нужно будет отправить разные наборы данных, но которые будут частично совпадать. Тогда ты можешь просто заполнить несколько буфферов, и отправлять их выборочно нужным игрокам, вместо того чтобы отправлять одному-переписывать-отправлять другому- и так по кругу.

Отправка может начинаться с чего угодно. В 39 ты полностью формируешь структуру пакета, но в FN есть свои особенности, и в их пределах ты ничем не ограничен, начинай хоть со строки.

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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Четверг, 13 Марта 2014, 10:17
XDominatorДата: Среда, 12 Марта 2014, 09:09 | Сообщение # 323 | Тема: Мораторий игры в Game maker studio
постоянный участник
Сейчас нет на сайте
Используй виды(view, настрой port и размер), и соотнеси с размерами комнаты\экрана или как там тебе нужно. Примера готового кода у меня нет, хотя сам реализовывал такую штуку в своем проекте, а подгонять его, особенно в уме, и написать тут - сложновато.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Среда, 12 Марта 2014, 09:10
XDominatorДата: Среда, 12 Марта 2014, 09:07 | Сообщение # 324 | Тема: Управление мышью в Game maker
постоянный участник
Сейчас нет на сайте
Не вдаваясь в подробности, функция point_direction по сути и определяет отношения между x/y координатами(проекциями) через простейшую тригонометрию, просто если это уже нормально реализовано средствами гамака, зачем это делать еще раз? smile

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 11 Марта 2014, 17:27 | Сообщение # 325 | Тема: Как сжать Android игру
постоянный участник
Сейчас нет на сайте
Не вижу смысла уменьшать дистрибутивы, которые по размеру меньше 20 мегабайт, хотя бы. Но фишка в том, что при таком размере, большую часть дистрибутива занимает графика\звук, и соответственно пути решения проблемы становятся очевидны.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 11 Марта 2014, 10:46 | Сообщение # 326 | Тема: Как сжать Android игру
постоянный участник
Сейчас нет на сайте
А собственно - зачем?

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Пятница, 07 Марта 2014, 15:35 | Сообщение # 327 | Тема: Управление мышью в Game maker
постоянный участник
Сейчас нет на сайте
Я мало че понял, но одно могу сказать точно - if это не цикл.

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

Код

object controller:

create event:
action_type = -1 - отвечает за действие, определяемое нашим движение. -1 - необрабатываемое значение
action_enabled = true - блокиратор на управление
xsaved = 0;
ysaved = 0;
angle = 0:

step event

if action_type > -1
{
    switch(action_type)
    {
    case 0:
    show_message("up")
    break;

    case 1:
    show_message("down")
    break;

    case 2:
    show_message("left")
    break;

    case 3:
    show_message("right")
    break;
    }
    action_enabled = true
    action_type = -1
}

global_mouse_pressed:
if action_enabled
{
    action_enabled = false
    xsaved = mouse_x
    ysaved = mouse_y
}

global_mouse_released://представим нашу рабочую область как круг с перекрестием в центре на весь размер круга. Перекрестие образует 4 сектора внутри круга. Определяем сектор, в котором находится курсор, и по нему определяем тип действия:

if action_enabled = false
{
    angle = point_direction(xsaved, ysaved, mouse_x, mouse_y)
    if angle > 315 or angle <= 45 action_type = 3 - правый сектор
    if angle <= 135 and angle > 45 action_type = 0 - верхний сектор
    if angle <= 225 or angle > 135 action_type = 2 - левый сектор
    if angle <= 315 or angle > 225 action_type = 1 - нижний сектор
}



Могу напутать со знаками, но должно работать. Пробуй.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 07 Марта 2014, 15:37
XDominatorДата: Четверг, 06 Марта 2014, 09:48 | Сообщение # 328 | Тема: Мультитач
постоянный участник
Сейчас нет на сайте
Ну ты и вбросил. Из всей твоей простыни ответ находится в одной строчке:

Код

if (!device_mouse_check_button(device_used,mb_left))
{
//
}


В ГМС используется до 4 устройств. 1 тач проверяется строкой device_mouse_check_button(0,mb_left), второй (который одновременно с первым) device_mouse_check_button(1,mb_left) и так до индекса 3. Но учитывай, что большинство устройств поддерживает максимум 2 тача, так что все 4 использовать не рекомендуется. Соответственно функции возвращают true если есть тач, и false если нет. Удач!


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Среда, 05 Марта 2014, 09:24 | Сообщение # 329 | Тема: Ошибка - Error in code at line...
постоянный участник
Сейчас нет на сайте
with(objPlayer){if(id = other.id){sendmessage(socketid); }}
with(objPlayer){if(id != other.id){sendmessage(socketid); }}

А вот эта конструкция вообще что делает? О_о Судя по всему, она отправляет сообщения всем игрокам, т.е. она эквивалентна записи
Код

with(objPlayer)
{sendmessage(socketid); }


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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 04 Марта 2014, 14:51 | Сообщение # 330 | Тема: Ошибка - Error in code at line...
постоянный участник
Сейчас нет на сайте
Пока будешь делать цикл, переосмыслишь весь свой кусок кода, и скорее всего найдешь косяк. Как минимум из замечаний - очень много бесполезных массмвов. Почему ты не можешь хранить все данные об игроке в отдельном объекте, или, еще лучше - в самом объекте игрока на сервере? А если тебе нужно будет добавить еще что то?

Код

obj_player
obj_playerinfo  - наши объекты связанные с игроком



При инициализации игрока(его создание видимо, в каком то объекте, пусть условно это будет obj.ctrl

Код

//Инициализация самого ctrl
maxplayers = 10 - максимум игроков
actual_player = 0 - максимальный ид для оптимизации цикла
i = 0
while i<maxplayers - инициализируем массив игроков и информаций
{
players[i] = -1 - наше "общепринятое" пустое значение
players_info[i] = -1
i += 1;
}
//Конец инициализации ctrl

newobj = instance_create(obj_player, 0, 0)
newobj_info = instance_create(obj_playerinfo , 0, 0)

newobj_info.player = newobj - ссылка на прямой доступ ко всем данным игрока-родителя

index = -1;
index = find_free_id() - скрипт, который будет находить первый свободный индекс в массиве players[]. Не возвращает если все занято

if index >= 0
{
players[index] = newobj;
players_info[index] = newobj_info;
newobj.array_index = index;
}

Вот по примерно такой схеме я строил у себя данные. При этом я даже не примешивал дополнительные объекты, а харнил вообще всю инфу тупо в объектах игроках. Но если у тебя расширенная статистика, которую ты можешь обрабатывать даже для вылетевших\дисконнектнутых игроков - тогда пользуй это.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Вторник, 04 Марта 2014, 14:51
XDominatorДата: Вторник, 04 Марта 2014, 13:41 | Сообщение # 331 | Тема: Online TBS на GM
постоянный участник
Сейчас нет на сайте
а какая разница, пошаговая или нет? Это пример который позволит ознакомиться со всеми гранями базы создания игр. А уже после этого можно начинать что то делать и придумывать свое. Если ты не можешь реализовать такое - то о какой разработке чего бы то ни было вообще можно вести речь?

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 04 Марта 2014, 10:06 | Сообщение # 332 | Тема: Online TBS на GM
постоянный участник
Сейчас нет на сайте
Это верно, в сеть лучше не лезть пока не сможешь делать базовые вещи геймплея с помощью одного лишь спинного мозга. Я бы тебе порекомендовал последовать примерно такому плану реализации:

1)Сделать какой нибудь объект в комнате.К примеру, танк. Научить его ездить по нажатию стрелочек.
2)Добавить еще танков, сделать систему выделения одного танка, чтобы ездил только он
3)научить танк ездить не только по стрелочкам, но и в точку указанную мышью
4)научить танки стрелять один в другой по команде, пока тот который в цели не взорвется
5)разбить танки на 2 команды, таким образом получится мультиплеер на 2-х человек, с поочередным выбором
6) - ну и так далее в том же духе.

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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 04 Марта 2014, 09:55 | Сообщение # 333 | Тема: Ошибка - Error in code at line...
постоянный участник
Сейчас нет на сайте
Воспользуйся циклами вместо такого огорода, и проблема скорее всего исчезнет сама собой smile

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Вторник, 04 Марта 2014, 09:50 | Сообщение # 334 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
Лично я рекомендую ее и использовать)) Она не выдавала глюков, но структура там немного другая, придется курить стандартные примеры. С тайлами тоже самое, что и с объектами, только их число получить через instance_number уже не получится, а в целом принцип тот же.

Касательно размера - 30 килобайт это (30*1024)/4 объектов, или чуть больше 7к. Куда тебе столько?) Впрочем значения не имеет, я более чем уверен что данные такого размера отправятся\прочитаются без проблем. По крайней мере на 2к объектов у меня проблем не возникало даже с 3г-модемом в виде телефона.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Вторник, 04 Марта 2014, 09:53
XDominatorДата: Понедельник, 03 Марта 2014, 13:37 | Сообщение # 335 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
Что такое alldata? Впрочем, врядли дело в этом.
Давай, еще раз, по порядку.
1)Чистим буфер clearbuffer(0);
2)Пишем некую инфу(идентификатор отправителя, скажем, 0 - это сервер) - writebyte(0);
3)Пишем идентификатор типа данных - например 1- тип данных _карта_ - writebyte(1);
Берем наши объекты. тут 2 варианта может быть. Если это статические объекты(какие нибудь неразрушаемые стены скажем, которые просто тупо всегда стоят на месте) - тогда используем простую конструкцию:
Код

writeshort(instance_number(obj_bl_Stone)); - количество существующих инстансов нашего отправляемого объекта.
with(obj_bl_Stone)     
{     
       writeshort(x);     
       writeshort(y);
}
send;


Приемник для нашей конструкции будет выглядеть так:
Код

if readbyte(0) = 0 - определили отправителя как сервер
     {
     if readbyte(0) = 1 - определили тип пакета как _карта_
       {
       i = 0;
       count = readshort(0) - считает строку writeshort(instance_number(obj_bl_Stone)) - количество объектов, оно же - количество наших циклов
       while i<= count    
        {
          a = instance_create(obj_bl_Stone, readshort(0), readshort(0)) - создаем наш принятый объект с пришедшими x и y
          i += 1;
        }
       }
      }


Само собой, что если ты планируешь в будущем этими объектами управлять, например если это АИ - то нужно создавать массивы, и синхронизировать какие либо заданные тобой идентификаторы наших объектов на сервере и клиентах. Это уже другое дело, и тут, конечно, без 100 грамм не разобраться, но я успешно у себя в проекте это реализовал и оно работает. Так что мозгуй smile

Кстати, через некоторое время я таки слез с 39dll и перешел на faucet Networking dll. Рекомендую сделать тебе тоже самое, потому что в 39 иногда возникают тупняки на ровном месте, тк либа крайне древняя, а faucet намного новее, хотя и тоже уже древняя. Но с GM 8.0 работает без каких либо проблем, свой проект написал на ней.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Понедельник, 03 Марта 2014, 13:42
XDominatorДата: Пятница, 28 Февраля 2014, 15:16 | Сообщение # 336 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
Не знаю, возможно ты просто неправильно запрогал? Я честно в твой код не вникал, а написал свой алгоритм, проще которого придумать врядли возможно, который работал у меня без каких либо проблем в том числе с мобильным и любым другим интернетом. Пакет не может прийти неполностью, ты его мог только неправильно сформировать\прочитать. И TCP и UDP стандарты следят за целостностью пакетов.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Пятница, 28 Февраля 2014, 15:07 | Сообщение # 337 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
4/110 = 0.03 сек smile

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Пятница, 28 Февраля 2014, 15:04 | Сообщение # 338 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
У тебя не сами объекты отправляют координаты. Ты формируешь единый пакет вида

кол-во объектов:
x
y
x
y
x
y

кол-во объектов
x
y
x
y
x
y

...

dll39_buffer_send();

таким образом от сервера уходит 1 пакет размером 1200*4 байт, или, иначе, чуть больше 4кб.

Добавлено (28.02.2014, 15:04)
---------------------------------------------
Цитата maksim1221232 ()
Мне нужно написать цикл который делает так:
Если в координате 0 и 0 объект obj1 создаём переменную objnumb=1
если в координате 32 и 0 объект obj1 то прибавляет к objnumb+=1
если в координате 64 и 0 объект obj1 то прибавляет к objnumb+=1
и т.д
И если например в координатах 256 и 64 не попался obj1, то ничего не прибавляем а отправляем переменную objnumb и координаты которые были когда objnumb был 0

А клиент принимает, и с координат который пришли от сервера ставит определённые объекты.


Ты складываешь все в одну кучу. Как ты это вообще потом разбираешь на стороне клиента?

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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 28 Февраля 2014, 15:05
XDominatorДата: Пятница, 28 Февраля 2014, 14:57 | Сообщение # 339 | Тема: Определить координаты, точек с которых можно попасть в опред
постоянный участник
Сейчас нет на сайте
Не нужен. Ему нужны проверки с учетом гравитации. Универсальный алгоритм тут сложно сказать, тем более что непонятно как этот лифт движется, или является статичным пока игрок на него не прыгнет. Или еще какие то особенности движения этого лифта есть. Список возможных координат тут вообще неприменим, тем более если лифт динамичен и постоянно меняет положение. Скорее всего тут нужно использовать простое приближение, завязанное на разности высот лифта и игрока и горизонтальной скорости игрока, и, конечно, банальное расстояние между игроком и лифтом. Если карта сложная и возможны коллизии по пути, тогда нужно создавать фантомные объекты и эмулировать их движение на несколько шагов вперед заранее.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
XDominatorДата: Пятница, 28 Февраля 2014, 14:37 | Сообщение # 340 | Тема: 39DLL - Передача объектов в комнате
постоянный участник
Сейчас нет на сайте
Все очень просто, на самом деле. У тебя есть определенный набор объектов на карте. Для каждого из этих объектов(либо с наворотами, если у них есть общий родитель) в отправителе создаешь примерно такую конструкцию:

Код

39dll_buffer_clear(0);
39dll_write_byte(pack_id, 0); //идентификатор типа пакета

39dll_write_short(instance_number(some_object), 0); - количество передаваемых объектов нашего типа
with(some_object)
{
   39dll_write_short(some_object.x, 0);
   39dll_write_short(some_object.y, 0);
}

39dll_write_short(instance_number(some_object_2), 0);
with(some_object_2)
{
   39dll_write_short(some_object_2.x, 0);
   39dll_write_short(some_object_2.y, 0);
}

...



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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 28 Февраля 2014, 14:39
Форум игроделов » Записи участника » XDominator [389]
Поиск:

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