Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблема взаимодействия Flash и MySQl (http://www.flasher.ru/forum/showthread.php?t=107451)

xAnthony 01.02.2008 19:16

Проблема взаимодействия Flash и MySQl
 
Разрабатываю онлайн игру во Flash. Действия в игре проходят в реальном времени. Игра работает по принципу постоянного обмена данными между флешем и базой данных MySQL. Запись и загрузка данных в БД обеспечивается отдельными php-скриптами.
Герой бегает по полю, а его координаты постоянно сохраняются в БД. Если перезапустить игру и снова зайти в нее, его координаты должны считаться из БД и герой должен оказаться на том же месте, при котором он был когда вышел из игры.
Сначала все идет нормально. Когда игрок бегает по полю, координаты успешно сохраняются в БД. Но когда я перезапускаю страницу и вновь захожу в игру, то герой почему-то оказывается на той позиции на которой был и при предыдущем входе в игру.
Допустим по умолчанию герой находится в координатах 100;100. Я перевожу его в координаты 200;100. Проверив БД я могу убедится что в ней сохранились координаты 200;100.
Но когда я перезапускаю страницу и вновь захожу в игру, игрок снова стоит в координатах 100;100. Перевожу героя в другие координаты, выхожу, захожу опять, а герой снова стоит в координатах 100;100. Однако если повторно зайти в игру через некоторое время (например через 10 минут), то координаты считаются из БД успешно и герой станет в позиции, где я его оставил.

Протестировал работу php-скриптов. Открыл их на отдельных вкладках браузера. Запустил скрипт записи, передав ему произвольные переменные координат. Сразу после этого запустил скрипт считывания. Выводятся только что внесенные мной координаты. Могу повторять эту операцию сколько угодно раз. На уровне скриптов все работает как и должно. Зашел в игру и передвинул игрока в какие-либо координаты. Вновь запустил скрипт считывания, а он вернул мне те самые переменные которые были до того как я передвинул героя.
Вновь пытаюсь записать данные в игру, обратившись отдельно к скрипту записи. Запись проходит успнешно. Запускаю скрипт считывания, а он опять возвращает уже не новые, а прежние координаты. Тоесть как только в записи данных поучаствывал флеш, скрипт считывания перестает работать.
Делаю следующую операцию: просто обновляю страницу со скриптом считывания. После обновления он наконец возвращает нововнесенные координаты и начинает работать правильно. Сразу же после этого захожу в игру. Игрок становится в позиции соответствующую координатам, которые находятся в БД. Однако если передвинуть его, пролема повторяется в вновь, до тех пор пока я не запущу скрипт считывания на отдельной вкладке или если он уже открыт обновлю страницу.

Надеюсь, я обьяснил все доходчиво :)
Обьясните пожалуйста, почему происходит такая ошибка и как мне ее избежать. Заранее благодарен!

Fernando Costa 01.02.2008 20:40

а когда вы запускаете флешку - вы сразу присваиваете игроку координаты из БД?

У меня была проблема такого вида:Есть флешка подгруженная в другую флешку. если я изменяю в процессе игры статическую переменную класса и потом перезапускаю флешку то она перезапускается уже с измененной статической переменной.

Но чувствую это не ваш случай...

xAnthony 01.02.2008 21:42

Мне уже на другом форуме обьяснили в чем ошибка. Если кому-то интересно, то тут проблема в кеше. Чтоб избежать ее, необходимо все время передавать пхп-скрипту разные запросы, тоесть отправлять ему еще одну (или больше) случайно генерируемую переменную (например random (999).

NikR 02.02.2008 13:08

Вероятность повторения есть + всё равно кеширует.
Я лечу:
Код:

  header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
  header('Cache-Control: no-store, no-cache, must-revalidate');
  header('Cache-Control: post-check=0, pre-check=0', FALSE);
  header('Pragma: no-cache');


CrazyFlasher 02.02.2008 13:23

чтобы вероятности не было используйте метод getTime() класса Date

etc 02.02.2008 14:19

Игры реального времени не делают на http-запросах.
Ошибка изначально в подходе к реализации, а подобные проблемы — результат этой ошибки.

CrazyFlasher 02.02.2008 14:39

для рил-тайм надо использовать к примеру tcp/ip протокол, а также сокет сервер

LinuxVideo 02.02.2008 16:27

> Я лечу

Только в том случае, если по пути нету прокси, которые игнорируют заголовки. Специально писал такую.
Кроме того, будет интересный эффект, если у юзверя на машише 1997 год :)


Часовой пояс GMT +4, время: 00:41.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.