Суббота, 15 Декабря 2018, 03:11

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » 39dll Передача координат
39dll Передача координат
vampir0305Дата: Воскресенье, 01 Ноября 2015, 20:28 | Сообщение # 1
Unity C# Programmer
Сейчас нет на сайте
Пишу простенькую tds по сети на 39dll. Получается отправить байт и принять его и что-то сделать, но теперь мне нужно отправить переменную серверу, а точнее её значение, а именно координаты игрока.
Как это сделать?
Код:
В Сервере:
в Create
Код
port = get_integer('Your Port', '');
listen = tcplisten(port, 4, 1)

if !listen
{
    show_message('Порт не прослушивается!')
    room_restart();
}
createbuffer();
// buffer 0 - принятие сообщений
// buffer 1 - отправка сообщений
client_list = ds_list_create();

в Step
Код
client = tcpaccept(listen, 1)

if client
{
    if !ds_list_find_index(client_list, client)
    {
        ds_list_add(client_list, client)
    }
}

for(k = 0; k < ds_list_size(client_list); k += 1)
{
    current_client = ds_list_find_value(client_list, k);
    if receivemessage(current_client, 0, 0)
    {
        switch(readbyte(0))
        {
            case 0:
                ds_list_delete(client_list, k);
            break;
        }
    }
}


В Клиенте:
в Create:
Код
port = get_integer('Your Port', '');
host = get_integer('Your IP', '')

server = tcpconnect(host, port, 2)

createbuffer();
//buffer 0 - принятие сообщений
//buffer 1 - отправка сообщений

в Step
Код
if receivemessage(server, 0, 0)
{
    switch(readbyte(0))
    {
        case 0:
            show_message('Сервер отключился!')
            game_end();
    }
}


P.S Делал по этому уроку

Добавлено (01 ноября 2015, 13:04)
---------------------------------------------
Чё никто не знает?

Добавлено (01 ноября 2015, 20:28)
---------------------------------------------
Up

Сообщение отредактировал vampir0305 - Суббота, 31 Октября 2015, 21:42
maksim1221232Дата: Воскресенье, 01 Ноября 2015, 23:36 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
vampir0305,
1. Когда сокет отключается, receivemessage возвращает значение меньше 0.
2. Если получилось отправить простую переменную, то почему не получается отправить x,y? :\

Клиент:
Код
clearbuffer(1)//Чистим буфер 1
writebyte(1,1)//Записывает id пакета в буфер 1
writeshort(x,1)//Записывает x в буфер 1
writeshort(y,1)//Записывает y в буфер 1
sendmessage(server,"",0,1)//Отправляем всё серверу из буфера 1. Где "" и 0, не трогай, это для UDP.


Сервер:
Код
size = receivemessage(current_client)
if size<0 {show_message("Клиент отключился :O");}
if size!=0 //Если что то пришло...
{
  switch(readbyte())//Читаем id пакета из буфера.
  {
  case 1://Если id пакета 1, то читаем координаты...
   x=readshort()
   y=readshort()
  break;
  
  case 2:
   //Если id пакета 2, то что то ещё...
  break;
  }
}


3. В Create сервера после room_restart ставь ещё exit что бы не натворить лишнего.
vampir0305Дата: Понедельник, 02 Ноября 2015, 16:36 | Сообщение # 3
Unity C# Programmer
Сейчас нет на сайте
maksim1221232, спасибо! помог!

Добавлено (02 ноября 2015, 13:03)
---------------------------------------------
Люди! Появился вопрос! Теперь при подключении двух игроков и более, их спрайты становятся прозрачными. Где-то видел на форуме(возможно не на этом) уже задавался такой же вопрос, но я не смог его найти. Помогите плиз!

Добавлено (02 ноября 2015, 16:36)
---------------------------------------------
Чё опять никого из знающих не найдётся?


Сообщение отредактировал vampir0305 - Понедельник, 02 Ноября 2015, 16:36
maksim1221232Дата: Понедельник, 02 Ноября 2015, 17:49 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
image_alpha=1
vampir0305Дата: Понедельник, 02 Ноября 2015, 17:57 | Сообщение # 5
Unity C# Programmer
Сейчас нет на сайте
maksim1221232, дело вообще не в этом. Если подключился один игрок, то спрайт нормально отображается, а если подключается 2 игрока и более то у всех спрайты становятся полупрозрачными и мигают, иногда исчезают.

Сообщение отредактировал vampir0305 - Понедельник, 02 Ноября 2015, 18:13
maksim1221232Дата: Понедельник, 02 Ноября 2015, 18:18 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Неправильно принимаешь данные игроков.
vampir0305Дата: Понедельник, 02 Ноября 2015, 18:27 | Сообщение # 7
Unity C# Programmer
Сейчас нет на сайте
maksim1221232, а как тогда надо? я сделал принятие координат и угла поворота объекта. но вот проблема в этом мигании.
maksim1221232Дата: Понедельник, 02 Ноября 2015, 20:11 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Напиши мне код как ты отправляешь и как принимаешь данные о игроке.
vampir0305Дата: Вторник, 03 Ноября 2015, 12:26 | Сообщение # 9
Unity C# Programmer
Сейчас нет на сайте
maksim1221232, вот он:
КЛИЕНТ:
в Create игрока пишу:
Код
global.xx = x
global.yy = y
angle = 0

в Step игрока пишу:
Код
image_angle=point_direction(x,y,mouse_x,mouse_y)

angle = image_angle

global.xx = x
global.yy = y

В объекте obj_system(это во всех случаях объект, отвечающий за соединение, передачу, отправку данных и т.д) в Клиенте идёт отправка этих переменных серверу в Alarm:
Код
clearbuffer(1)
writebyte(3, 1)
writeshort(global.xx, 1)
writeshort(global.yy, 1)
writeshort(obj_player.angle, 1)
sendmessage(server, 0, '', 1)

alarm[0] = 1

Естественно Alarm я запускаю и в создании объекта.

Теперь Сервер:
объект obj_system
в Create:
Код
xx = 0
yy = 0
angle = 0

В Step:
Код
client = tcpaccept(listen, 1)

if client
{
    if !ds_list_find_index(client_list, client)
    {
        ds_list_add(client_list, client)
        ds_list_add(nick_list, 'Connecting')
        
        clearbuffer(1);
        writebyte(1, 1);
        sendmessage(client, 0, '', 1)
    }
}

for(k = 0; k < ds_list_size(client_list); k += 1)
{
    current_client = ds_list_find_value(client_list, k);
    if receivemessage(current_client, 0, 0)
    {
        switch(readbyte(0))
        {
            case 0:
                ds_list_add(message_list,'Игрок ' +string(ds_list_find_value(nick_list, k)) + ' вышел');
                clearbuffer(1)
                writebyte(2, 1)
                send_string('Игрок ' +string(ds_list_find_value(nick_list, k)) + ' вышел')
                send_to_all()
                ds_list_delete(client_list, k);
                ds_list_delete(nick_list, k);
                pl.dest=1
            break;
            
            case 1:
                ds_list_replace(nick_list, k, read_string());
                ds_list_add(message_list,'Игрок ' +string(ds_list_find_value(nick_list, k)) + ' вошёл');
                pl = instance_create(xx,yy,obj_player)
                clearbuffer(1)
                writebyte(2, 1)
                send_string('Игрок ' +string(ds_list_find_value(nick_list, k)) + ' вошёл')
                send_to_all()
            break;
            
            case 2:
                message = read_string();
                ds_list_add(message_list, string(ds_list_find_value(nick_list, k)) + ' : ' +string(message));
                clearbuffer(1)
                writebyte(2, 1)
                send_string(string(ds_list_find_value(nick_list, k)) + ' : ' +string(message))
                send_to_all()
            break;
            
            case 3:
                xx = readshort();
                yy = readshort();
                angle = readshort();
                
                /*for(j = 0; j <= ds_list_size(client_list); j += 1)
                {
                    clearbuffer(1)
                    writebyte(4, 1)
                    writeshort(xx)
                    writeshort(yy)
                    sendmessage(ds_list_find_value(client_list, j), 0, '', 1)
                }*/
            break;
        }
    }
}

именно case 3 отвечает за принятие координат

Теперь создаю объект игрока, ставлю ему тот же спрайт,
но управления у него нету(сервер же)
и в Step пишу
Код
x = obj_system.xx
y = obj_system.yy

image_angle=obj_system.angle


Вот как-то так.

Добавлено (03 ноября 2015, 12:26)
---------------------------------------------
UP

Сообщение отредактировал vampir0305 - Понедельник, 02 Ноября 2015, 20:31
XDominatorДата: Вторник, 03 Ноября 2015, 13:49 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Вот никак не возьму в толк - что заставляет людей до сих пор юзать game maker вместе с дырявой dll, когда уже больше года есть GMS с БЕСПЛАТНОЙ полной версией под винду с нормальным Networking?

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
vampir0305Дата: Вторник, 03 Ноября 2015, 16:07 | Сообщение # 11
Unity C# Programmer
Сейчас нет на сайте
XDominator, ну например то, что у меня почему-то с их офф сайта GMS не скачивается. Так помогите мне кто-нибудь, пожалуйста.
martukДата: Вторник, 03 Ноября 2015, 16:10 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
vampir0305, через steam можно.
vampir0305Дата: Вторник, 03 Ноября 2015, 16:19 | Сообщение # 13
Unity C# Programmer
Сейчас нет на сайте
Уже не надо) У меня как-то получилось скачать с офф сайта. Ни кто не подкинет мануальчиков-уроков по онлайну в GMS. Кому не трудно)
maksim1221232Дата: Вторник, 03 Ноября 2015, 23:47 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
Тебе надо создать в сервере у каждого игрока переменную uid.
Код
uid=irandom_range(1,65000)

Потом когда отправляешь данные с сервера, посылать и uid.
Вот принятие данных клиентом.
Код
var xx,yy,vuid,suc;
vuid=readushort();
xx=readshort();
yy=readshort();
suc=0;
with obj_player
{
if uid=vuid
{
x=xx
y=yy
suc=1
}
}
if suc=0
{
with instance_create(xx,yy,obj_player)
{
uid=vuid
}
}


Цитата vampir0305 ()
Ни кто не подкинет мануальчиков-уроков по онлайну в GMS. Кому не трудно)
Клик

vampir0305Дата: Четверг, 05 Ноября 2015, 17:32 | Сообщение # 15
Unity C# Programmer
Сейчас нет на сайте
maksim1221232, ничего не изменилось(

Добавлено (04 ноября 2015, 08:56)
---------------------------------------------
Кароче вот исходники сервера и клиента: тык

Добавлено (04 ноября 2015, 22:13)
---------------------------------------------
UP

Добавлено (05 ноября 2015, 17:32)
---------------------------------------------
Чё никто не знает?

Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » 39dll Передача координат
  • Страница 1 из 1
  • 1
Поиск:

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