TimKruz, V1talik30, то о чём вы мечтаете - НЕРЕАЛЬНО! Гипотетически, система сможет самообучаться и использовать свои знания, но на практике... Уроки по GM+39DLL.
Все хотят=)) Progem100, есть опыт в программировании? Если нет, бери Game Maker, делай простенькую 2Д игруху. Коли прогер, бери Unity3D Уроки по GM+39DLL.
Аминь И поэтому каждый везде себя считает непревзойденным критиком. "Ты не правильно сделал это..." "Вот здесь чуть-чуть по другому давай..." "ФУ! Что это? Если бы я умел - я бы сделал в 100 раз лучше". LOL!
Ну чувак, ты загибаешь... От например, я не мастер флэша, но мне не нравиться, что у тебя в ЯК кнопочки плохо работают. Я не могу тебе это сказать? А Ферамон, что вообще не должен критиковать?
Добавлено (20.07.2011, 00:08) --------------------------------------------- Другое дело, когда чел нагло ....... распускает язык...
Всем привет! Всё чаще я замечаю, что множество людей хотят создать мультиплеерную игру. Кто-то пытается использовать 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))
Запускаем и радуемся
Йо-хо-хо! Урок номер 3! Уроки будут продолжаться! Цель всей серии - создать мультиплэерный платформер аля Марио Уроки по GM+39DLL.
Сообщение отредактировал MrBigBill - Воскресенье, 24 Июля 2011, 22:05