Всем привет! Всё чаще я замечаю, что множество людей хотят создать мультиплеерную игру. Кто-то пытается использовать 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
Kto_Ya, перед тем как заморачиваться с онлайн игрой, создай хоть простенький чатик. Учи в такой последовательности (ИМХО): html (дней 5 уйдёт) html+css (особо не заморачивайся, пару дней) php (заморачивайся и втыкай недели 3, перед тем как писать чат) про AS забудь, по крайней мере на месяц.... и помни ПРАКТИКА - САМОЕ ВАЖНОЕ;) Сайты по теме: http://htmlbook.ru/ http://php.su Лично я для написания кода использую WINsoft WEBeditor, мне нра, много всяких помощников и т. д. В качестве вирт серва, как писал Винч, лучше всего юзать Denwer. Кста, про сокеты и т. д. не заморачивайся... Сделай шото наподобии vten.ru и других вап браузерок. Ну и как сказал Ферамон - На рынке браузерок сейчас делать нечего Собственно клиентскую ммо делать проще. Намного...
getName, приветствую в юнити) Рекомендую глянуть уроки от огасода, шобы там не говорили, мне оч нра. Весь плюс в том, шо нет возможности копировать-вставлять, надо всё самому писать, всё запоминается)
Еше вопросик, неправильно загружается анимированная модэль, боком. Пробовал в максе повернуть, ваще потом не работает... Использую third person controller.
Вообще это не нубские, это тупые вопросы лентяя не желающего самому хоть немного пошевелить извилинами.
нет, это вопросы человека, который 3 день как поставил юнити, и пытается сделат что-то самостоятельно. И кончайте уже задалбывать, типо иди читай уроки, их я читал, делал, но мне хочется разобраться самому!! zodiak, твой код не пашет... Работает этот: void Update () {