Всем привет! Всё чаще я замечаю, что множество людей хотят создать мультиплеерную игру. Кто-то пытается использовать Delphi, кто-то - Eclipse, но одним из самых лучших вариантов для изучения (ИМХО) является связка GM + 39DLL. Естественно у вас не получится создать "убийцу" ВоВ, но можно без особых проблем написать... ну хотябы простенький онлайн поатформер. Итак, с этого напутствия, я начинаю серию уроков.
Создаём два проекта GM (server, client). Добовляем объекты objClient и objServer соответственно.
objServer create
Code
server = dll39_tcp_listen(12345,32,true) if !server game_end()
Функция dll39_tcp_listen открывает для прослушивания порт 12345, с максимальным кол-вом юзеров онлайн - 32. С помощью одной строчки мы создаём серер:) if !server game_end() Ну это ясно, если не удалось создать сервер (функция dll39_tcp_listen вернула false) вырубаем программу. Можно запустить и полюбоваться сообщением фаерволла:)
objClient create
Code
client = dll39_tcp_connect(127.0.0.1,12345,true) if !client game_end()
Код аналогичен серверу. dll39_tcp_connect подключается к серверу с ip 127.0.0.1 (адрес локального хоста), в случае неудачи игра вырубится. Запускайте и радуйтесь Заметили? Если выключить сервер клиенту глубоко фиолетово Щас исправим!
objClient step
Code
if !dll39_tcp_connected(client) game_end()
dll39_tcp_connected проверяет как там наше подключение, и если вдруг чего, вырубает клиент...
Ну вот собственно и всё, сегодня мы узнали аш 3 новых функции=)
Всем привет, с вами снова я. Сегодня мы попытаемся "оживить" сервер. Начнём-с=)
objServer create (добавляем)
Code
users = 0//переменная отвечает за кол-во юзеров на сервере
objServer step
Code
newuser = dll39_tcp_accept(server,true) if newuser { users += 1 }
Тут догадаться легко. dll39_tcp_accept проверяет наличие новых коннектов к сокету server. И если кто ломится в гости, увеличиваем переменную users.
Ну можно запустить=) Одна проблемка, при отключение юзера, серверу на это глубоко пофиг. Помните функцию из первого урока - dll39_tcp_connected? Она нам и нужно. Попутно объясняю, dll39_tcp_accept возвращает сокет нового игрока, их нужно лишь пролистать и проверить на коннект... Но для начала нужно создать некое хранилище сокетов и прочей инфы о юзере. Лично я использую массивы, но можно и списки.
objServer create
Code
for (i=0;i<32;i+=1) { ulist[i]=-1 }
Создаём массив, из 32 ячеек.
Теперь нам нужно отсортировать наших юзеров, каждому новому дать определённый идентификатор, ID. Создаём скрипт.
_newID
Code
var i for (i=0;i<32;i+=1) { if ulist[i] = -1 return i }
Скрипт перебирает наш массив, и если там есть свободная ячейка, возвращает её номер. Это очень важно, обязательно раздуплите, как это работает!!
Хех=) Мы занесли сокет нашего нового юзера в массив... Осталось перебрать его. Снова скрипт.
_users
Code
u=0 var i for (i=0;i<32;i+=1) { if ulist[i] != -1 {u+=1} } return u
Смотрим сколько у нас не свободных ячеек, возвращаем их кол-во.
Удаляем строку
Code
users += 1
objServer step
Code
users = _users()
Я вас по всей видиости очень утомил... Ничего, чуток осталось=)
Скрипт: _testing
Code
var i for (i=0;i<32;i+=1) { if ulist[i] != -1 { user_state = dll39_tcp_connected(ulist[i]) if !user_state {ulist[i] = -1} } }
Скрипт просматривает список (массив) юзеров, проверяе соединение с помощью dll39_tcp_connected и если проверка неудачна, очищает ячейку массива. Добавляем скрипт в стэп сервера запускаем и та-та-та-да! Работает, разрази меня гром=)
Хех, много за сегодня сделано. Аш целых 3 новых скрипта создано и изучена одна функция. Естественно, этот метод не самый простой, но он один из лучших. Многие создают для каждого нового юзера отдельных объект, и работают через него. Это проще, но производительность, увы, страдает... На последок, скажу - скрипт _testing и _users можно, и нужно объединить.
_users
Code
var i for (i=0;i<32;i+=1) { if ulist[i] != -1 { user_state = dll39_tcp_connected(ulist[i]) if !user_state {ulist[i] = -1} } }
u=0 var i for (i=0;i<32;i+=1) { if ulist[i] != -1 {u+=1} } return u
Как это работает понять не сложно, перечитайте урок, удалите скрипт _testing и строчку (objServer step) _testing().
Всем привет, с вами снова я, мистер биг билл. Сегодня мы рассмотрим запись и отправку данных. В конце урока мы научимся работать с буфером, а также отправлять его содержимое. Целью всего урока является отправка клиенту его ID. Начнём-с=)
Для начала нам нужно уяснить, как работает отправка и приём данных. В общих чертах всё обстоит так:
Сервер записывает данные для отправки в свой буфер
Сервер отправляет клиенту содержимое своего буфера.
Клиент получает сообщение.
Клиент копирует все данные в собственный буфер.
Клиент считывает данные из буфера.
Вроде всё понятно, кроме многократно повторяющегося слова буфер. Буфер - это некое хранилище, причём каждый клиент (как и сервер) имеет собственный буфер. Вся информация которая записана в буфер должна быть считана последовательно, к сожелению 39dll не умеет определять типы данных, всё приходится писать ручками. Кароче кончаю теорию, начинаю практику.
Помните где мы прописывали коннект нового юзера? Пишем под
Code
ulist[newuser_id] = newuser
этот код
Code
dll39_buffer_clear(0)
dll39_buffer_clear(0) - функция очищает буфер с индексом "0" (забыл сказать, имеется возможность юзать несколько буферов). Буфер нужно очищать перед каждым формированием нового пакета! Пишем дальше:
Code
dll39_write_byte(newuser_id,0)
Эта функция записывает байт newuser_id, в буфер "0". Почему именно байт? newuser_id, лежит в регионе от 0 до 31 (помните максимально кол-во юзеров на серве?), а в байте можно разместить цифру от 0 до 255.
Собственно мы выполнили первый пункт нашего коварно плана=)
Quote
Сервер записывает данные для отправки в свой буфер
Всё там же пишем:
Code
dll39_message_send(newuser,0,0,0)
Те кто знакомы с инглишом поймут, что функция отправляет сообщение, на сокет newuser (сокет нового юзера). А дальше фигня какаято идёт=) На первые два ноля забейте, они нам не нужны, 3 нолик - номер буфера который мы отправляем. Хех второй пункт выполнен=))
dll39_message_receive - функция проверяет пришли ли новые сообщения на сокет client(mail.ru - проверить почту ), и вдруг чего копирует в буфер. if newmes > 0 если чтонить пришло.... dll39_read_byte(0) - функция аналог dll39_write_byte, но только считывает данные.
Ну вроде всё ясно. Добавляем в Draw клиента
Code
draw_text(5,5,"ID: "+string(myID))
Запускаем и радуемся
Четвёртый урок, наконец в формате видео. Разрешение: 1024х768 FPS: 10 Битрейт аудио: 32 kbps Размер: 5 мб Формат: exe
Я не понимаю смысла в выкладывании подобных уроков, которые уже на моей памяти обжевывались раз 100, с 10 строками кода и реально бесполезными проектами.
Это все уже много раз обсуждалось, чаще всего все курсы загибались, как только начинали делать что-то действительно нужное в своих уроках.
Если тема будет и дальше развиваться то все ок, т.к уроки подключение клиент/сервер уже видел сотни раз, а толку от них 0...такие мелкие шажки лучше проходить с какими то более значимыми вещами(например обмен данными и, допустим, чат на их основе). Более мощный компьютер глючит быстрее и точнее.
Ну вроде всё расписано... А по технической части я не силён в 39dll) Мне как раз это и нужно. Дамы и господа, я представляю вам человека, которому н-а-с-р-а-т-ь! (с) Доктор Кокс.
Уроки будут продолжаться! Цель всей серии - создать мультиплэерный платформер аля Марио Спс Загё за идею. ps чё вы все на Загё наезжаете? Нормальный мужик Уроки по GM+39DLL.
Очень хочу продолжения. А то это как в программе йоге показали как запутаться что фиг распутаешся, а как распутаться покажут на следующей неделе. П.С. Дето в журнальчике про йогу видел).
Я просто запутался не пойму куда же тут объекты из моей игры пихать)))
Некуда, выкинь их)) (я серьёзно) ps сегодня вечером будет новый урок))
Добавлено (24.07.2011, 21:04) --------------------------------------------- Блин, случайно удалил сорцы=(( Никогда не думал, что буду копировать код из собственных уроков
Добавлено (24.07.2011, 22:09) --------------------------------------------- 3-й УРОК! Читаем, пробуем, комментируем. Народ, ваше мнение важно, ведь кроме похвалы меня ничто не стимулирует ps хотелось бы услышать критику от "Знавцов" 39длл, типа Винченсо, Фил, Ромиксал и т. д.
Переписывании? Я их в первый раз пишу!! ps в дальнейшем уроки будет выкладывать васян, я не хочу бросать начатое pss админы простите меня!!
Добавлено (24.07.2011, 23:42) --------------------------------------------- Ув. Администрация! Честно сознаюсь в своих грехах. Эти уроки писал отчасти для того, чтобы вы меня простили (можите спросить у Загё). Я просто решил, что если Загё простили из-за одного перевода, может и меня простят из-за 6 написанных уроков? Одним словом поступайте сомной как хотите, но учтите, что если пожалеете меня, то уроки будут дописаны.
Vinchensoo, ты вечно всем недоволен) Просто я понял, что уроки нафиг никому не нужны. Кроме того нет ни одного поста от знающго чела. Твои не считаются) Все думают как Tides... Хех, нашол прожку, записывает в хорошем качестве и маленьком размере, правда формат на выходе - exe... А то у фаст-стона на выходе- 30 метров, нисмагу залить...