Клиент

Баги vs Тупизм

В начале субботний день не предвещал ничего плохого, решил я переписать код клиента чтобы разнести на различные уровни глубины различные объекты, чтобы преступить к отрисовки "пола".

Итак решено sm = w*h, значит
0...sm-1 - пол
sm..sm+100 - для эффектов (например для отрисовки пути)
2*sm+101 .. 3*sm+100 - объекты (стены и т.п.)
3*sm+101 - hero (и другие существа)
4*sm+101 5*sm+102 - фон закрытой территории.

Небольшие переделки

Хотя хотел в плотную заняться графикой, но некая недоделанность меня сильно напрягала и я решил переделать flash-код, а именно механизм обработки событий.

Проблема в том если в процессе игры, кто-то нажмет F5, и перегрузит все, т.е. загрузиться flash-ролик, переменная lastAction = -1, а на сервере она может быть далеко не нуль, а скажем 100.

Взаимодействие с сервером и баги

Добавил движение и кнопку - конец хода, с кнопкой провозился долго, но вроде получилось.

Единственно, чего не смог добиться так это включить клип кнопки в скрипт - т.к. при
включенной галки export to Active Script при компиляции Flash ругается на дублировании имен,
а хотелось бы отключать (disable) кнопку если текущий ход не игрока.

Движемся к цели

Прикрутил отображение пути в оригинальной флэшке, прикрутил «красные ноги» - т.е. для точки пути не хватает очков движение – тогда ноги отображаются не зеленым, а красным.
И кто вам скажет, что это легко – плюньте в его сторону:
import flash.geom.Transform;
import flash.geom.ColorTransform;
var trans:Transform = new Transform(mc);
var redLegColorTransform:ColorTransform = new ColorTransform(0, 1, 1, 1, 250, 0, 0, 0);
trans.colorTransform = redLegColorTransform;

Код конечно из help'а, но что-то не совсем тривиален он, ну да ладно – главное тут две вещи:

Рисуем путь

Для того чтобы посылать команды с клиента на сервер, я решил на клиенте сделать соответствующий интерфейс, причем захотелось почему-то ближе его сделать «боевому» - т.е. финальному. А первоначально думал, сделаю 8 кнопок – идти на север, юг, запад, восток и т.п.

В принципе ничего сложного в простейшей анимации на Flash нет, просто муторно, долго и если есть баг – то быстро его не найдешь (тут опять ода как мне «нравиться» ActiveScript).

Правки в Flash

Собственно, необходимо прикрутить очередность хода уже в клиентскую часть.

Для начала была сделана информационная панель (MoveClip), которая должна рисоваться поверх карты, т.к. карта рисуется вся сразу (надеюсь что Flash умно не рисует невидимые клипы).

Для того, чтобы панель была сверху, а не под картой необходимо при запуске перестроить ее "глубину" вручную:_root["infoPanel"].swapDepths(999777);. Число взято с потолка.

Затем в режиме ожидание - была включена функция отрисовки(прорисовке этой панели), вернее счетчика таймера.

function refreshPanel()
{

Чат. Часть 2

А все так красиво начиналась :)
Сделав маленький пример и получив с него данные
loadVariablesNum("http://192.168.0.200/var", 0, "GET");
обрадовался и стал копать в эту сторону, но! получаю дофига мусора, а именно флэш шлет все переменные, стал копать на XML протокол, но код

on (press) {
trace('here');
var str = 'nick='+_root.nick+'&'+'msg='+_root.message;
str="http://localhost:8080/chat"+str;
var my_xmls:XML = new XML(""+_root.nick+""+_root.message+"");
var myout_xml:XML = new XML();

Чат

Думаю в любой онлайн игре необходимо понимание что играешь с живыми людьми,
а не ботами, лучше всего для этой цели подходит чат.

В качестве отдельного куска проекта, я решил реализовать его, для хранения на сервере
воспользуемся, следующей структурой.


typedef struct
{
int id;
char type;
int user_id;
int timestamp;
string message;
} TChatMessage;

Дальше есть варианты, использовать для хранения vector или очередь - queue.
В самом процессе хранить все сообщения наверное очень жестоко, а для удаления очередь предпочтительней.

Прием данных

Сегодня попробуем получить данные с сервера и построить по ним карту в Flash.
В нашу предыдущую заготовку по рисованию карты внесем изменения.
в initScene() добавим создания еще одного массива для кэширования карты
oldmap = new Array(mapwidth*mapheight), а также весь массив основной карты заполним значением -1, это будет означать что
карта "скрыта". Ну для графического оформления сделаем еще один клип star который будем выводить при закрытой карте.

Передача данных

Как было выясненно из моего поста Flash может обрабатывать только данные ввиде переменных, теперь
нам нужно передать наш лабиринт с сервера на клиентскую часть. Для этого нужно лабиринт закодировать и передавать его по частям,
почему по частям а не целиком? Чтоб игрок который сидит не смог сразу выяснить где он находиться и куда ему сразу идти.

Примерный протокол передачи данных от клиента к серверу.
1. запрос общей информации по ID лабиринта - с сервера получаем координаты игрока, размеры карты и ее тип

RSS-материал