Блоги

Рисуем путь

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

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

Вводим действия

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

vector<THistoryAction> historyAction, где THistoryAction - некая абстрактная структура, предположим:
typedef struct
{
int action;
int data[5];
} THistoryAction;

Допустим игровой клиент запрашивает таймер, а с таймером ему приходит еще и количество записанных действий (lastAction=histroyAction.size()).

Правки в Flash

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

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

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

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

function refreshPanel()
{

Делаем очередность хода

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

Пока решил внедрять фиксированное время на ход, потом может поменяю, а может и нет.

Для начала, внес некии правки в структуру TMazeMap
typedef struct
{
int Id;
unsigned char w,h;
char *data;

TCreatureList creatures;
time_t lastTime;
int currentId;
int timelenght;

} TMazeMap;

А также написал несколько дополнительных функций, а именно:
void initMaze(TMazeMap *m);
void nextTurn(TMazeMap *m);
void checkMazes();

Втупляю

До чегоже я иногда туплю, прям страшно.

Половину воскресения и сегодня четыре часа сегодня втуплял в код на предмет ошибок.

Ну если в воскресенье еще простительно (ездили на свадьбу к родственникам - Марину и Лешу еще раз поздравляю)
и там я в субботу уверенно накачался водкой по самые уши, то сегодня - просто позор.

Во-первых была ошибка, которая приводила к 100% загрузке, в Flash-процедуре doServer выполнялись проверки
в idle даже при отсутствии заданий.

Пока отдыхал

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

Пауки могут:

  • Укусить ядом - действует n ходов снимая m очков здоровья за ход
  • Заразный укус с заражением крови - это болезнь, а значит лечится только лекарем,а также есть шанс при контакте передать болезнь (при ударе). Также снимается m очков здоровья за ход.
  • Первые успехи

    Вместо эпиграфа - "Да уже что-то получилось!".
    А именно игрок может зарегистрироваться, и пройти тестовый лабиринт "Подвал старейшины".

    Ну про саму ссылку на тестовый лабиринт было ранее,

    Для использования шаблонов пришлось написать кой-какой код, для замены переменных в тексте.

    if (!strcmp(params->Branch("action")->Char(),"getmap"))
    {
    /* запрос на карту в окресностях игрока */
    int mazeid = userList[userid].mazeid;

    Со стороны Flash.

    Перво-наперво нужно получить параметры, которые мы с такой любовью отправили.

    На первом фрейме пишем –
    if (params.length > 0)
    {
    while (params.indexOf("|") >= 0)
    {
    pn = params.substr(0, params.indexOf("|"));
    params = params.substr(params.indexOf("|") + 1);
    pv = params.substr(0, params.indexOf("|"));
    params = params.substr(params.indexOf("|") + 1);
    if (pn == "mazeid") _root.mazeid = pv;
    if (pn == "userid") _root.userid = pv;
    if (pn == "sessionid") _root.sessionid = pv;
    }
    }

    Делаем "Лабиринт старейшины"

    Это тестовый лабиринт, который создается пока - при вызове ссылки из города.
    При вызове урла ?mazeid=new_test_arena создается лабиринт, получается его id и идет редирект на ?mazeid=XXXX
    char data[7];
    makeMaze(STD_LABIRINT_WIDTH,STD_LABIRINT_HEIGHT,&mazeid,NULL,-1,-1,data);
    mazeList[mazeid].lastTime = time(0);
    mazeList[mazeid].currentId = -1;
    TMazeCreature c;
    c.Type = 0;
    c.Id = userid;
    c.x = data[2];
    c.y = data[3];
    c.HP=1; //тут иницилизация из TUser
    mazeList[mazeid].creatures.push_back(c);

    Баги vs кривые руки

    Два дня бился на багами, первый баг был, что после регистрации срабатывал редирект на /maze, хотя старт был явно из города и должна грузиться страница /game.
    Затем пронализировал код и нашел ошибку
    TUser u;
    findCity(CITY_DATOR,&u.wx,&u.wy);
    u.nick = l;
    u.pass = p1;
    u.id = max;
    u.color = get_color(max);
    u.email = email;
    userList[max] = u;

    .mazeid не иницилизировалась и была не пуста, а в /game - проверка на эту переменную и соотвественно как результат - редирект.

    RSS-материал