За последние 24 часа нас посетил 15851 программист и 1665 роботов. Сейчас ищут 963 программиста ...

а вот как вам такая реализация обработки событий в браузерной онлайн игре?

Тема в разделе "PHP для новичков", создана пользователем aprofen, 24 янв 2018.

  1. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    на локации может быть до 30 чел. Локация разделена на клетки, по которым можно ходить.

    Для каждой локации свой отдельный кэш-файл на диске сервера

    Игрок ходит персонажем на другую клетку - >

    Это событие записывается в кэш-файл ->

    У других игроков long polling - как только обновляется дата изменения кэш-файла на диске сервера, скрипт читает этот файл и выдает параметры (ид игрока, который сходил, его новая клетка) клиентам других игроков ->

    JavaScript клиентов других игроков получает ответ от скрипта сервера и перемещает игрока на новую клетку ->

    Запись в файле стирается и все по новой

    под клиентом имеется ввиду браузер
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    рекомендую познакомиться с centrifugo
    потрать пару дней и обретёшь счастье
     
  3. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    а чем мой способ плох?
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen а если игроки походят одновременно?
     
  5. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr, ну да, тоже думал об этом, в таком случае, переход одного из игроков останется без внимания, а его перемещение будет видно только при обновлении страницы с игрой...

    а можно как-то эту проблему решить без загрузки и подключения каких-то сторонних дополнительных модулей?
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen типа так: каждый пользователь при движении обращается к своему файлу т.е. 30 файлов открыто пользователями для записи. Но жс скрипт может их читать.
    если с пыхом то попроще,- пользователь обращается к пыху, пых пишет изменения в файл.
     
  7. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr 30 файлов - конечно, можно, только вот скрипт Long Polling на стороне сервера работает только с одним файлом, как-то не очень понятно - серверу для клиента держать на проверке все 30 файлов?
     
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen игра на пыхе? если да то скрипт просто смотрит файл с гет параметром, а этот гет параметр записывается в файл, можно даже в самого себя таким образом при запросе к файлу пользователь одновременно сообщает своё положение и получает чужое.
     
  9. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr да, игра на php, пожалуй, лучше код покажу

    Вот пользователь сходил:
    PHP:
    1. //параметры, которые нужно записать в кэш-файл: type (тип действия, в данном случае-перемещение), идентификатор персонажа, новые координаты, картинка персонажа
    2. $cache_position = 'type|goCagePers||pers_id|'.$mypers_row['id'].'||coordinats|'.$cageId.'||img|'.$mypers_row['img'].'||';
    3. //функция записывает эти данные в файл  
    4. mozg_create_cache('/locations_position/location_'.$mypers_row['dislocation'], serialize($cache_position));
    а вот другой php-файл: он проверяет, изменился ли кэш-файл:

    PHP:
    1. //вот дата обновления кэш-файла изменилась, и скрипт начинает выполнять код
    2. $row = unserialize(mozg_cache('/locations_position/location_'.$locid));          
    3.                     $ParamResult = xfieldsdataload($row);
    4.                     if($row):
    5.                         $res = array(
    6.                             'type' => $ParamResult['type'],
    7.                             'pers_id' => $ParamResult['pers_id'],
    8.                             'coordinats' => $ParamResult['coordinats'],
    9.                             'img' => $ParamResult['img']
    10.                         );
    11.                         $data['data'] = $res;
    12.                     endif;
    13. //код выполняется, и клиенту возвращаются параметры в JSON формате: тип действия, ид персонажа, координаты, картинка персонажа
    а сам скрипт проверяет только файл конкретной локации - той локации, на которой персонаж находится
     
  10. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen не я имел в виду что яс будет открывать файл для чтения с гет параметром типа XMLHttpRequest=.open("GET", мой.игра.пхп?йа=тута, false);
    а файл мой.игра.пхп будет обрабатывать этот запрос и после обработки записывает изменения в себя же т.е. после закрывающегося тега ?>, в случае если запись не удалась тупо ждем пару мс

    чую я тебе знатный велосипед помогу собрать DDDDDDDDDDDd
     
  11. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr а Java Script у меня он вообще вот таким образом работает

    Код (Javascript):
    1. function update_game(last_time){
    2.     $.ajax({
    3.         url: "/update_game.php",
    4.         type: "POST",
    5.         dataType: 'json',
    6.         data: {
    7.             last_time: last_time
    8.         },
    9.         cahce: false,
    10.         timeout: 0,
    11.         async: true,
    12.         success:function(d){
    13.             if(!d.err){
    14.                 if(d.data){
    15.                     var row = d.data;
    16.                     //исполняемый код
    17.                    
    18.                     if(row.type == 'goCagePers'){
    19.                         $('#pers_'+row.pers_id).remove();
    20.                         $('#cage_'+row.coordinats+'').html('<img id="pers_'+row.pers_id+'" width="100" style="position: absolute;" src="'+row.img+'">');
    21.                     } else if(row.type == 'destroingPers'){
    22.                         $('#pers_'+row.pers_id).remove();
    23.                     }
    24.                    
    25.                 }
    26.                 setTimeout(function(){
    27.                     update_game(d.last_time);
    28.                 }, 2000);
    29.             } else if(d.err == 1)
    30.                 update_game(d.last_time);
    31.             else if(d.err == 2)
    32.                 update_game(d.last_time);
    33.             else
    34.                 return false;
    35.         }
    36.     });
    37. }
    38. update_game(null);
     
  12. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen ну тогда
    url:"/update_game.php?йа=тута"
    а в update_game.php fopen __FILE__ w
     
  13. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr что-то как-то не совсем понятна мне твоя идея... update_game.php ничего не записывает, он только смотрит, произошло ли какое-то событие, а при переходе пользователя по клеткам выполняется другая функция из другого файла, и она пишет в кэш, что юзер перешел, и её проблема в том, что она может писать только одного юзера
     
  14. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen ну идея сводилась к тому чтобы работать только с одним файлом и при помощи одного запроса и получать данные и читать их. К примеру
    пользователь походил
    яс обращается к пыху на чтение файла пых?мои_новые_координаты
    пых получает новые координаты и изменяет себя же те скрипт который получил координаты записал их в себя же а затем отдал пользователю обновлённую базу

    имеем один файл и один запрос
     
  15. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr не, все равно недопонимаю,может, на примере моего кода покажешь?
     
  16. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen не мне лень счас думать)))) что именно не понимаешь? часть с яваскриптом или часть с пыхом?
     
  17. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr часть с явой вроде понял - жабаскрипт обращается на пхп файл и передает ему новые координаты игрока, который решил перейти на другую клетку.

    а вот с пхп файлами... как-то не догоняю
     
  18. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen ну смотри пхп может писать в любой файл в том числе и в себя.
    допустим у нас ессть файл зефайл.пхп он открывает для записи файл зефайл.пхп то есть себя же
    далее файл обрабатывает параметры и пишет их в конец файла, что и выводится
    типа
    Код (Text):
    1. <?пхп
    2. опен __FILE__,W+)
    3. обработать весь код
    4. ?>
    5. игрок1=чото
    6. игрок2=чото
    то есть то что после ?> передастся жабе
     
  19. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr а, то есть писать в файл не одного игрока, как я делаю, а сколько угодно?
     
  20. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen эммм я думал что у тебя кэшфайл типа базы данных где всегда можно получить актуальную инфу... ну и как бы да, мб у юзера инет глюканёт и он пропустит парочку подключений, игра будет вести себя не адекватно же тогда
     
  21. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr нее, кэш файл у меня только одного игрока в себе содержит, который последним сделал ход по клетке
     
  22. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen лучше всех, и как нить компактно, а то прикинь я в автобусе играю с тела, автобус въехал в тонель и при выезде я вижу лишь один ход, получается вижу картинку прошлого хотя игра шевелится, так и проиграть недолго
     
  23. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr ну, записать всех это не трудно, только вот потом как их вывести и по полю разместить... короче, наверное, надо всё игровое поле обновлять, а не отдельных персонажей
     
  24. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @aprofen необязательно, жабаскрипт пусть сравнивает полученные данные с имеющимися, и обновляет лишь расхождения.
     
  25. aprofen

    aprofen Активный пользователь

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @abrdabr может все 30 клеток в файл писать, а потом туда игроков, а жабаскрипт смотрит - есть игрок в клетке - показать, исчез игрок с клетки - убрать ?