на локации может быть до 30 чел. Локация разделена на клетки, по которым можно ходить. Для каждой локации свой отдельный кэш-файл на диске сервера Игрок ходит персонажем на другую клетку - > Это событие записывается в кэш-файл -> У других игроков long polling - как только обновляется дата изменения кэш-файла на диске сервера, скрипт читает этот файл и выдает параметры (ид игрока, который сходил, его новая клетка) клиентам других игроков -> JavaScript клиентов других игроков получает ответ от скрипта сервера и перемещает игрока на новую клетку -> Запись в файле стирается и все по новой под клиентом имеется ввиду браузер
@abrdabr, ну да, тоже думал об этом, в таком случае, переход одного из игроков останется без внимания, а его перемещение будет видно только при обновлении страницы с игрой... а можно как-то эту проблему решить без загрузки и подключения каких-то сторонних дополнительных модулей?
@aprofen типа так: каждый пользователь при движении обращается к своему файлу т.е. 30 файлов открыто пользователями для записи. Но жс скрипт может их читать. если с пыхом то попроще,- пользователь обращается к пыху, пых пишет изменения в файл.
@abrdabr 30 файлов - конечно, можно, только вот скрипт Long Polling на стороне сервера работает только с одним файлом, как-то не очень понятно - серверу для клиента держать на проверке все 30 файлов?
@aprofen игра на пыхе? если да то скрипт просто смотрит файл с гет параметром, а этот гет параметр записывается в файл, можно даже в самого себя таким образом при запросе к файлу пользователь одновременно сообщает своё положение и получает чужое.
@abrdabr да, игра на php, пожалуй, лучше код покажу Вот пользователь сходил: PHP: //параметры, которые нужно записать в кэш-файл: type (тип действия, в данном случае-перемещение), идентификатор персонажа, новые координаты, картинка персонажа $cache_position = 'type|goCagePers||pers_id|'.$mypers_row['id'].'||coordinats|'.$cageId.'||img|'.$mypers_row['img'].'||'; //функция записывает эти данные в файл mozg_create_cache('/locations_position/location_'.$mypers_row['dislocation'], serialize($cache_position)); а вот другой php-файл: он проверяет, изменился ли кэш-файл: PHP: //вот дата обновления кэш-файла изменилась, и скрипт начинает выполнять код $row = unserialize(mozg_cache('/locations_position/location_'.$locid)); $ParamResult = xfieldsdataload($row); if($row): $res = array( 'type' => $ParamResult['type'], 'pers_id' => $ParamResult['pers_id'], 'coordinats' => $ParamResult['coordinats'], 'img' => $ParamResult['img'] ); $data['data'] = $res; endif; //код выполняется, и клиенту возвращаются параметры в JSON формате: тип действия, ид персонажа, координаты, картинка персонажа а сам скрипт проверяет только файл конкретной локации - той локации, на которой персонаж находится
@aprofen не я имел в виду что яс будет открывать файл для чтения с гет параметром типа XMLHttpRequest=.open("GET", мой.игра.пхп?йа=тута, false); а файл мой.игра.пхп будет обрабатывать этот запрос и после обработки записывает изменения в себя же т.е. после закрывающегося тега ?>, в случае если запись не удалась тупо ждем пару мс чую я тебе знатный велосипед помогу собрать DDDDDDDDDDDd
@abrdabr а Java Script у меня он вообще вот таким образом работает Код (Javascript): function update_game(last_time){ $.ajax({ url: "/update_game.php", type: "POST", dataType: 'json', data: { last_time: last_time }, cahce: false, timeout: 0, async: true, success:function(d){ if(!d.err){ if(d.data){ var row = d.data; //исполняемый код if(row.type == 'goCagePers'){ $('#pers_'+row.pers_id).remove(); $('#cage_'+row.coordinats+'').html('<img id="pers_'+row.pers_id+'" width="100" style="position: absolute;" src="'+row.img+'">'); } else if(row.type == 'destroingPers'){ $('#pers_'+row.pers_id).remove(); } } setTimeout(function(){ update_game(d.last_time); }, 2000); } else if(d.err == 1) update_game(d.last_time); else if(d.err == 2) update_game(d.last_time); else return false; } }); } update_game(null);
@abrdabr что-то как-то не совсем понятна мне твоя идея... update_game.php ничего не записывает, он только смотрит, произошло ли какое-то событие, а при переходе пользователя по клеткам выполняется другая функция из другого файла, и она пишет в кэш, что юзер перешел, и её проблема в том, что она может писать только одного юзера
@aprofen ну идея сводилась к тому чтобы работать только с одним файлом и при помощи одного запроса и получать данные и читать их. К примеру пользователь походил яс обращается к пыху на чтение файла пых?мои_новые_координаты пых получает новые координаты и изменяет себя же те скрипт который получил координаты записал их в себя же а затем отдал пользователю обновлённую базу имеем один файл и один запрос
@abrdabr часть с явой вроде понял - жабаскрипт обращается на пхп файл и передает ему новые координаты игрока, который решил перейти на другую клетку. а вот с пхп файлами... как-то не догоняю
@aprofen ну смотри пхп может писать в любой файл в том числе и в себя. допустим у нас ессть файл зефайл.пхп он открывает для записи файл зефайл.пхп то есть себя же далее файл обрабатывает параметры и пишет их в конец файла, что и выводится типа Код (Text): <?пхп опен __FILE__,W+) обработать весь код ?> игрок1=чото игрок2=чото то есть то что после ?> передастся жабе
@aprofen эммм я думал что у тебя кэшфайл типа базы данных где всегда можно получить актуальную инфу... ну и как бы да, мб у юзера инет глюканёт и он пропустит парочку подключений, игра будет вести себя не адекватно же тогда
@abrdabr нее, кэш файл у меня только одного игрока в себе содержит, который последним сделал ход по клетке
@aprofen лучше всех, и как нить компактно, а то прикинь я в автобусе играю с тела, автобус въехал в тонель и при выезде я вижу лишь один ход, получается вижу картинку прошлого хотя игра шевелится, так и проиграть недолго
@abrdabr ну, записать всех это не трудно, только вот потом как их вывести и по полю разместить... короче, наверное, надо всё игровое поле обновлять, а не отдельных персонажей
@aprofen необязательно, жабаскрипт пусть сравнивает полученные данные с имеющимися, и обновляет лишь расхождения.
@abrdabr может все 30 клеток в файл писать, а потом туда игроков, а жабаскрипт смотрит - есть игрок в клетке - показать, исчез игрок с клетки - убрать ?