Блог пользователя creator

Программируем телепорты

Вернее сказать телепорты - это первые "объекты", с которыми можно взаимодействовать (не ландшафт). Для начала пришлось создать отдельную структуру
typedef struct
{
bool visible;
short type,x,y;
int data[6];
} TMazeObject;

visible будет определять существует ли объект или нет, ну и естественно type - тип и координаты объекта x,y.

Для телепортов застолбим тип равный 0x10, а также для других различных телепортов (например в тестовом лабиринте входящий и исходящий телепорт разные) - 0x11,0x12,0x13
Иными словами:

Графика. Рисуем телепорт

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

Итак рисуем телепорт.

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

Графика. Рисуем дно

Цель - нарисовать приличный фон для пола (дна).

Его цель - смотрется монолитно, а не разбитымые тайлами.

Для начала я в квадрате 64x64 нарисовал нечто - похожее мозаику - будет вроде как каменистый пол.

Затем установил "крестом" 5 тайлов и в центральном стал подгонять линии чтобы рисунок с "соседями" был целостным.

После раскрасил темными цветами и поместил в общий проект.

Вот что получилось.

Баги 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 - фон закрытой территории.

Программируем

Слегка переписал секцию enter


int wm=STD_LABIRINT_WIDTH,hm=STD_LABIRINT_HEIGHT;
makeMaze(wm,hm,&mazeid,NULL,-1,-1,data);
if (userList[userid].return_map) delete [] userList[userid].return_map;

userList[userid].return_map = new string[wm*hm];

, а еще само-собой в структуре TUser добавил string *return_map.

Также изменил код в секции getmap


int gx=params->Branch("x")->Integer(),gy=params->Branch("y")->Integer();
int mazeid = userList[userid].mazeid;
char *map = new char[SEE_RADIUS*60];

Графика (продолжение)

Всю неделю думал как лучше сделать этот проклятый фон.
Поменял цветовую гамму кирпичей - все равно лажа, и поэтому кирпичи летят на свалку истории.

Решил воспользоваться принципом - "чем проще - тем лучше". И сделал вот это.

Нарисовал квадрат спрайта (64x64)

Затем сделал его копию и увеличил на 120%

Внешнии стороны большего квадрата вогнул внутрь до внутренних. Залил все цветом #222222

Графика

Собственно уже пару дней пытаюсь нарисовать фон для закрытой территории(карты).

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

Главное критерий к фону - он должен быть неплох сам по себе, так и в гармонично смотреться в группе,
И вдруг меня осенило я "увидел" фон, это что-то типа плитки, которая при "открытие" обваливается.
Плитка правда не получилась, зато получились кирпичи.

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

Хотя хотел в плотную заняться графикой, но некая недоделанность меня сильно напрягала и я решил переделать 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'а, но что-то не совсем тривиален он, ну да ладно – главное тут две вещи:

RSS-материал