Вторник, 16 Апреля 2024, 10:02

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

Меню сайта
Категории каталога
Создание игр [355]
Статьи об общих понятиях связанных с созданием игр.
Программирование [82]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [145]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [16]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [161]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [129]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Сколько часов подряд вы обычно играете?
Всего ответов: 1431
Главная » Статьи » Разное

Клиент-серверное приложение на Faucet Networking. ч.2

И так, не медлим и приступаем. В прошлой статье я не создал буфер для отправки/принятия сообщений. Сделаем это сейчас т.к. он нам пригодится. Заходим в клиент и сервер, в событии создания обьета control дописываем:
Код

globalvar buff;
buff_write = buffer_create();
buff_read = buffer_create();

Теперь определим константы в обоих приложениях:
PLAYER_REG = 0
PLAYER_LOG = 1
PLAYER_REG_0 = 2
PLAYER_REG_1 = 3
PLAYER_LOG_0 = 4
PLAYER_LOG_1 = 5
PLAYER_LOC = 6
PLAYER_OUT = 7
PLAYER_NEW = 8

Еще создайте два спрайта кнопки: реигстрации и авторизации

Регистрация
Left Released:
Код

var name, pass, pass2;

name = get_string("Введи ник","");
pass = get_string("Введи пароль","");
pass2 = get_string("Повтори пароль","");

if (pass != pass2)
{
  show_message("Пароли не совпадают");
  exit;
}

if (string_length(name) < 3 || string_length(name) > 15)
{
  show_message("Никнейм должен быть от 3 до 15 символов!");
  exit;
}

if (string_length(pass) < 3 || string_length(pass) > 20)
{
  show_message("Пароль должен от 3 до 20 символов!");
  exit;
}

buffer_clear(buff_write);
write_ubyte(buff_write, PLAYER_REG);
write_string(buff_write, name);
write_string(buff_write, pass);
write_buffer(server, buff_write)
socket_send(server);  


Авторизация
Код

var name, pass;

name = get_string("Введи твой ник", "")
pass = get_string("Введи твой пароль", "")

if (string_length(name) < 3 || string_length(name) > 15)
{
  show_message("Никнейм должен быть от 3 до 15 символов!");
  exit;
}

if (string_length(pass) < 3 || string_length(pass) > 20)
{
  show_message("Пароль должен от 3 до 20 символов!");
  exit;
}

buffer_clear(buff_write);
write_ubyte(buff_write, PLAYER_LOG);
write_string(buff_write, name);
write_string(buff_write, pass);
write_buffer(server, buff_write)
socket_send(server);


Теперь по сложнее, напрягите мозги
Результат сервера
Переходим в control Step:
Код

var msg, act, err;

msg = tcp_receive_available(server);
if (msg)
{
write_buffer(buff_read, server)
  act = read_ubyte(buff);
  switch(act)
  {
  case PLAYER_REG_0:
  err = read_string(buff_read, 20);
  show_message(err);
buffer_clear(buff_read)
  break;
   
  case PLAYER_REG_1:
  show_message("Вы успешно зарегестрировались!");
buffer_clear(buff_read);
  break;
   
  case PLAYER_LOG_0:
  err = read_string(buff_read, 20);
  show_message(err);
buffer_clear(buff_read);
  break;

  case PLAYER_LOG_1:
  login_player();
buffer_clear(buff_read);
  break;

  case PLAYER_LOC:
  player_loc();
buffer_clear(buff_read);
   
  case PLAYER_OUT:
  player_out();
buffer_clear(buff_read);
  break;

  case PLAYER_NEW:
  player_new();
buffer_clear(buff_read);
  break;


login_player:
Код

room_goto(game)

var ind, obj, obj_x, obj_y, name;

ind = read_ubyte(buff_read);
name = read_string(buff_read, 15);
obj_x = read_ushort(buff_read)
obj_y = read_ushort(buff_read)
obj = instance_create(obj_x, obj_y, player);
obj.ind = ind;
obj.name = name;
obj.manage = 1;
ds_map_add(map_players, ind, obj);

var count;
count = read_ubyte(buff_read);
for(a = 0; a != count; a += 1)
{
  ind = read_ubyte(buff_read);
  name = read_string(buff_read, 15);
  obj_x = read_ushort(buff_read);
  obj_y = read_ushort(buff_read);
   
  obj = instance_create(obj_x, obj_y, player);
  obj.ind = ind;
  obj.name = name;
  ds_map_add(map_players, ind, obj);
}


player_new:
Код

var ind, name, obj, obj_x, obj_y;

ind = read_ubyte(buff_read);
name = read_string(buff_read, 15);
obj_x = read_ushort(buff_read)
obj_y = read_ushort(buff_read);
obj = instance_create(obj_x, obj_y, player)
obj.ind = ind;

ds_map_add(players, ind, obj);


player_loc:
Код

var ind, obj_x, obj_y, obj;

ind = read_ubyte(buff_read);
obj_x = read_ushort(buff_read)
obj_y = read_ushort(buff_read)

obj = ds_map_find_value(map_players, ind);
obj.x = obj_x;
obj.y = obj_y;


player_out:
Код

var ind, obj;

ind = read_ubyte(buff_read);
obj = ds_map_find_value(map_players, ind);
obj.delete = 1;
ds_map_delete(map_players, ind);


Если вы прочитали код, вы заметили что у нас создается объект player. Давайте создадим его и присвоим какой нибудь спрайт. Теперь зайдем в Create, пишем:
Код

manage = 0;
ind = -1;
name = "";
delete = 0;

Step:
Код

if (delete == 1 && manage == 1) {room_goto(menu); instance_destroy();}
if (delete == 1 && manage == 0) {instance_destroy();}

if (manage == 0) {exit;}

if (keyboard_check(vk_right))
{
  x+=10;
}

if (keyboard_check(vk_left))
{
  x-=10;
}

if (keyboard_check(vk_up))
{
  y-=10;
}

if (keyboard_check(vk_down))
{
  y+=10;
}

buffer_clear(buff_write, );
write_ubyte(buff_write, PLAYER_LOC);
write_ushort(buff_write, x);
write_ushort(buff_write, y);
write_buffer(server, buff_write)
socket_send(server);

Draw:
Код

draw_sprite(sprite_index, -1, x, y);
draw_text(x, y - 20, name);


Функции:
buffer_create() - создает буффер и возвращает индентфификатор
buffer_clear(buff) - чистим буффер
write_xxx(buff_write, val) - записываем в буфер значение
read_xxx(buff_read) - читаем из буфера данные соответственно
socket_send(server) - отправляем серверу данные из буфера
socket_receive_available(server) - читаем все данные из буфера которые нам прислал сервер. Также эта функция возвращает кол-во принятых байт
write_buffer(dest, source) - очень важная функция, стоит понимать как она работает и как пользоваться. Эта функция используется для записи или чтения в буфер данных от сокета.
Принцип действия отправления сокету:
//...Тут записываем что то в буфер
//Например, write_ubyte(buff_write, irndom(255))
write_buffer(server, buff_write)
socket_send(server)
В первом параметре находится сокет сервера. В него мы записываем данные из буфера.
Т.е. первый параметр это есть то куда мы записываем данные для отправления
Второй параметр есть то откуда мы читаем данные.
Если необходимо прочитать данные, то делается аналогично:
msg = tcp_receive_available(socket)
buffer_write(buff_read, socket)
read_ubyte(buff_read)
//...

Вроде ничего не забыл указать, теперь объясняю код, благо мне всеравно делать нефиг smile
При нажатии на кнопку регистрации или входа, мы делаем запрос данных у пользователя. Он их вводит, программа проверяяет правильность ввода и если все ок - отправляет данные серверу.

Далее, смотрим control. Тут мы принимаем ответ сервера. В зависимости от введенных и отправленных данных мы получаем результат. Если произошла какая-то ошибка мы ее выводим. Если все ок, то все ок)

Я поместил авторизацию при тру, принятие координат, и выход игрока в скрипты. Это удобнее, т.к. в случае чего не надо будет копаться во всем коде и переписывать. К тому же так гораздо читабельнее код. Советую и вам так делать.

Обьясняю авторизацию. Если она тру, то принимаем наш индентфикатор от сервера, он не может быть больше 255, затем читаем наш ник, координаты. Создаем наш обьект игрока, присваиваем ему все данные которые мы получили и также устанавливаем флаг управления в 1.
Затем идет, цикл перед которым мы записываем кол-во игроков count. Это делается для того чтобы узнать где находятся другие игроки. Также узнаем их ники.
Ах да, еще мы при создании обьекта игрока добавляем его в карту с ключом индентфикатором. Это необходимо! Чтобы управлять обьектами через control я выбрал такой способ. Он удобен: вам приходит индентификатор ind, вы достаете обьект через инд. И уже можете им как угодно управлять.

Удобность карты можно продемонстрировать также на примере скрипта координат игрока и выхода его из игры. Тут видно, что к нам приходит индентификатор и через него мы достаем обьект того игрока от которого пришло сообщение.

В обьекте player все очень просто: если у нас manage=1 то мы им управляем и передаем координаты, если нет то выходим из скрипта. Также если флаг удаления=1 то удаляем объект. Что еще тут сказать...
Ну драв понятно, рисуем над ним никнейм.
Еще есть такой момент во всех гэйм мейкреах, если вы программно не указали, что вы будете отрисовывать спрайт, а также в драве есть какойто код, то ваш спрайт не будет виден. Потому если есть любой код в рисовании, то указывайте что надо отрисовать спрайт обязательно.

Все, в следующей статье мы продолжим делать наше приложение. В данном случае с клиентом покончено. Так, что будем штурмовать сервер smile

Предыдущая статья: Часть 1
Категория: Разное | Добавил: krap (12 Ноября 2013)
Просмотров: 1935 | Рейтинг: 5.0/5 |
Теги: GM8, мультиплеер, для новичков, faucet networking, приложение, online, faucetnet, Game Maker, многополользовательское, для любознательных
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Клиент-серверное приложение на Faucet Networking. ч.2», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • OpenSpace3D
  • Demoniak3D
  • Apocalyx
  • J2DS
  • Arcade Game Designer
  • Zephyr3d
  • CoolBasic
  • Eclipse Wold
  • Dark BASIC
  • GameGuru MAX
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг