On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





Пост N: 726
Зарегистрирован: 20.04.07
Откуда: Россия))), Питер
ссылка на сообщение  Отправлено: 02.09.08 18:05. Заголовок: Перевод туториала по 39dll


Winsock тутор с использование 39dll которую создал 39ster (честь и хвала ему) и перевел я, FatPir, мне тоже честь и хвала
Пример создания игры на 2 игроков Pong.
В этой тренировке я буду учить вас, как использовать 39длл для создания онлайн игр. Я буду использовать «Понг» как пример.
Примечание переводчика:
В туторе это не указано, но сначала нужно загрузить скрипты.
Инициирования ДЛЛ.
Для функционирования ДЛЛ вы должны связать функции из ДЛЛ с вашей игрой. Чтобы сделать это просто поместите этот код в первую комнату:
dllinit(0, true, false);
Если первый параметр является номером длл, будет загружена "39dll.dll". Первый параметр может является названием Длл, например, если первый параметр "sock.dll", тогда длл должен называться "sock.dll" и он будет загружен используя это имя файла.
Второй параметр принимает значение true, если вы хотите использовать winsock(Интерфейс который дает возможность связи с Интернетом независимо от компонентов аппаратуры). В данном случае мы будем использовать его. Третий параметр должен принимать значения true, только если вы хотите использовать функции из файла. В данном примере это не требуется, поэтому мы не будем загружать их из ДЛЛ.
Настройка сервера.
Чтобы создать онлайн игру, человеку нужен компьютер, который будет держать сервер и на который будут подключаться другие люди.
Чтобы организовать сервер, используя 39dll в первую очередь нужно создать объект, который будет контролировать организацию сервера и принимать новые подключения. Нужно создать меню с двумя кнопками. Первая кнопка с надписью "Host" и вторая с надписью "Connect". Сделайте так, чтобы когда пользователь нажимает на кнопку «host», выполнялся этот код "global.master = true;" и поставьте изменение комнаты на комнату с названием "rmWaiting". Создайте новый объект и назовите его "objWait". В «Creating event» вставьте этот код:

listen = tcplisten(14804, 2, true);
if (listen <= 0)
{
show_message("Failed to listen on port 14804");
game_end();
}

Этот код создает ожидание сигнала, он будет ожидать какого-либо входящего соединения на порт 14804. Номер порта поставь тот, который нужен тебе, но я использую порт 14804. Второй параметр это максимальное разрешенное количество подключений в листе ожидания. Это не максимальное количество людей в игре. Когда кто-то пытается подключиться, он помешается в лист ожидания подключения до того, как сервер примет его. Последний параметр установлен true, потому что мы хотим, чтобы отсутствие подключений замораживало игру. Скрипт будет возвращать идентификационный номер подключения, который больше 0, если подключение успешно. Номер, который <= 0 возвращается, если происходит ошибка.
Следующая строка проверяет, удачно ли мы подключились к порту 14804. Если идентификационный номер подключения (идентификатор), меньше или равен 0, происходит ошибка и игра выключается.
Принятие новых подключений.
Для принятия новых подключений в вы должны прописать «step event» для объекта "objWait", который мы создали. В step event добавьте:

client = tcpaccept(listen, true);
if(client <= 0) exit;
global.otherplayer = client;
room_goto(rmGame);

Первая строка проверяет лист ожидающих, чтобы следить подключается ли кто-нибудь для ожидания ответа. Если никто не пробует подключиться, то эта команда возвращает значение меньше 1. Если кто-то подключился, тогда этот скрипт создает новое подключение и возвращает его идентификационный номер. Это подключение будет использоваться для отсылки и получения сведений от человека, который подключился. Второй параметр в tcpaccept означает, что подключение не будет заблокированным. В данном случае, когда вы пытаетесь получить сообщение, игра не будет замораживаться, если нету сообщения для получения.
Вторая строка проверяет, не возвращает ли tcpaccept ошибку. Если это произойдет, тогда выполнится скрипт выхода.
Третья и четвертая строки будут выполняться только, если не произойдет ошибки. Третья строка устанавливает глобальную проблему "global.otherplayer"
для идентификационного номера подключения, который tcpaccept() вернула.
Четвертая строка отправляет в игровую комнату (кстати, вам нужно создать эту комнату).
Подключение к серверу.
Для подключения к многопользовательской игре нужно подключиться к серверу. В комнате, в которой мы имеем кнопку "Host" и кнопку "Connect", сделайте, чтобы когда игрок щелкает по кнопке"Connect", выполнялся скрипт:

global.master = false;
server = tcpconnect("127.0.0.1", 14804, true);
if(server <= 0)
{
show_message("Unable to connect to server");
game_end();
}
global.otherplayer = server;
room_goto(rmGame);

Первая строка устанавливает глобальную переменную "master" на значение false, потому что мы не хотим создать сервер. Мы — клиент, который подключается к серверу. Вторая строка создает фактическое подключение.
Первый параметр tcpConnect это ip адрес, к которому вы хотите подключиться. Если вы просто тестируете игру на компьютере, используйте адрес "127.0.0.1".
Второй параметр номер порта для подключения. Третий аргумент устанавливает, использовать ли блокирующий или не блокирующий способ. Мы устанавливаем его true, что значит не блокирующий. Благодаря этому, когда мы пытаемся посылать или принимать сообщения игра не замораживается до выполнения операции. Если tcpConnect удачно подключилось и было принято сервером, переменная «server» должна контролировать идентификационный номер подключения. Если происходит ошибка, значение < 1 будет возвращено.
Следующая линия выполняет проверку совершения ошибки. Может произойти ошибка, если сервер не существует или не принимает нас. Если произойдет ошибка, игра закроется.
Если не происходит ошибки, тогда "otherplayer" становиться идентификационным номером подключения, который задается переменной "server" . Игра начинается, когда выполняется room_goto().
Отправка и принятие сообщений.
Для того чтобы твоя игра работала, мы должны знать y позицию ракетки, которую контролируют другой игрок и клиент должен знать x и y позиции мяча, который будет контролироваться сервером.
Отправка сообщений.
В ракетке, которая контролируется тобой, ты доджен создать скрипт отправки у координаты другому игроку, чтобы он мог видеть твою ракетку в том месте, где она находится на самом деле. Чтобы сделать это, помести этот код при событии нажатия кнопки UP и при событии нажатии кнопки DOWN:

clearbuffer();
writebyte(0);
writeshort(y);
sendmessage(global.otherplayer);

Перовая строка очищает внутренний буфер, от какой-либо информации. Это используется в случае, если в буфере же содержится что-либо. Вторая строка записывает бит, представляющий собой идентификационный номер(далее просто ID) сообщения. В этой игре сообщение с id 0 будет означать сообщения, относящиеся к Y позиции.
Следующая строка будет записывать действительную Y позицию в буфер. Мы используем информационный тип "short", потому что «short» может иметь любое значение между
-32000 и +32000. «Short» использует 2 бита.Последняя строка отправляет всю информацию во внутренний буфер другому игроку. В данном случае информация представлена Id сообщения битом и двумя битами, используемыми для Y позиции.
Теперь мы должны послать x, y позиции мяча другому игроку, если мы являемся сервером. Чтобы сделать это поместите этот код в step event объекта мяча:

if(!global.master)exit;
clearbuffer();
writebyte(1);
writeshort(x);
writeshort(y);
sendmessage(global.otherplayer);

Первая строка выполняет проверку, являемся ли мы сервером. Если мы НЕ сервер, тогда выполнение этого кода прекращается.
Однако, если мы — сервер, вторая строка отчищает внутренний буфер. Затем пишется Id сообщения "1", которое будет устанавливать, что сообщение относиться к позиции мяча. Затем пишутся short, которые означают x координату и y координату мяча.
Затем просто посылается сообщение другому игроку.
Получение сообщений.
В ракетке которой ты не управляешь, которая контролируется другим игроком, помести этот код в step event:
var size;
while(true)
{
size = receivemessage(global.otherplayer);
if(size < 0) break;
if(size == 0)
{
show_message("The other player left the game");
game_end();
}
messageid = readbyte();
switch(messageid)
{
case 0:
y = readshort();
break;

case 1:
objBall.x = readshort();
objBall.y = readshort();:
break;
}
}

Сначала этот код создает бесконечный цикл, используя оператор while(true). Первая строка цикла получает какие-либо сообщения от другого игрока и устанавливает переменную "size" на значение равное количеству битов, которое мы получили. Вторая строка делает проверку на случай, если мы не получили ни какого сообщения. Если не было получено какого-либо сообщения, то код останавливает данный бесконечный цикл. Выполняет проверку на случай, если другой игрок отключился от сервера. Если значение size == 0 — это означает что игрок покинул игру.
Если игрок покинул игру, то она закончится. Если же мы получили сообщение, вся информация из него помещается во внутренний буфер.
Мы можем использовать скрипты буфера, для того чтобы вернуть информацию из сообщений. Первая часть возвращает ID сообщения.
Используйте оператор switch() для определения ID пакета. Если ID сообщения 0 это значит что сообщения для другого игрока у координаты. Мы просто используем readshort(), чтобы вернуть y позицию. Запомните, что, так как мы записали у позицию как short, теперь мы должны прочитать её из сообщения как short.
Если ID сообщения равно 1, что означает x, y позицию, используйте readshort() чтобы мячик устанавливался в правильную х и у позицию.
Добавлено переводчиком:
При создание движения ракеток нужно произвести проверку являемся мы 1 игроком (host'ом) или 2 (conect'oм). Для этого нужно произвести проверку global.master

Очистка ДЛЛ.
Если ты не хочешь неприятных сообщений об ошибке, когда твоя игра кончается, ты должен очистить память от ДЛЛ. Для начала создай объект, который будет в каждой комнате. Затем в game end event просто поставь dllfree().


ЗЫ
Автор урока 39step
Перевод на русский FatPir kudsu@mail.ru 406367154
(с) Рыжов Александр, 2008
Все копирования без разрешения автора запрещены, руки поотрываю! Буду трястись над каждой буквой, я с ГЦ, сдохните кто не доволен!


Умри и разлажись!!!!!!!!!!!!!!!!!!
Зы и поскорее...
Спасибо: 2 
ПрофильЦитата Ответить
Ответов - 4 [только новые]







Пост N: 368
Зарегистрирован: 07.05.07
Откуда: Россия, Орехово-Зуево
ссылка на сообщение  Отправлено: 02.09.08 20:27. Заголовок: FatPir посмотрел - с..


FatPir посмотрел - спасибо большое - будет очень полезно. Правда сегодня уже не стал читать - спать ухожу, но завтра обязательно прочту.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 860
Зарегистрирован: 13.11.06
Откуда: Россия, Астрахань
ссылка на сообщение  Отправлено: 02.09.08 20:34. Заголовок: Я уже, наверное, пят..


Я уже, наверное, пятую версию перевода этого урока вижу))) Мне лично без пользы, т.к. переводил это все добро я сам для себя уже давно, но все равно аффтару +1 .
Пока еще нигде я не видел тутора с обьяснением продвинутых функций 39длл, например, шифрование буфера(зачем и как), хитрые приемы оптимизации траффика и пр. Жаль, мне самому весьма туго во все это вьезжается, хотя может когда нибудь и научусь...

Lets do it! Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1
Зарегистрирован: 08.02.09
ссылка на сообщение  Отправлено: 08.02.09 15:01. Заголовок: FatPir пишет: Автор..


FatPir пишет:

 цитата:
Автор урока 39step

Его ник 39ster

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1773
Зарегистрирован: 03.06.06
Откуда: Россия, Санкт-Петербург

Замечания: То, что тебя приняли в геймдев-студию, ещё не делает тебя профессионалом.
ссылка на сообщение  Отправлено: 08.02.09 23:47. Заголовок: FatPir пишет: Все к..


FatPir пишет:

 цитата:
Все копирования без разрешения автора запрещены, руки поотрываю! Буду трястись над каждой буквой, я с ГЦ, сдохните кто не доволен!


Хаха, это после фигни с миззистиком то... Дурную славу делаешь, не да ладно))





I live! Again! Не пугаемся, когда узнаём что я изменил ник на bL00R)))
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет