
Код AS1/AS2:
//устанавливаем качество в "low"
_quality = "low";
//*Глобальные переменные*
//текущий уровень
var current_stage = 0;
//Колличесво ходов
var step_txt = 0;
//позиция игрока
var igrok_poz_x;
var igrok_poz_y;
//
//*Двумерные массивы с картой уровня*
//общий
var stage_arr = new Array(8);
//для мишеней
var stage_t_arr = new Array(8);
//
for (i=0; i<8; i++) {
stage_arr[i] = new Array(8);
stage_t_arr[i] = new Array(8);
}
//
//*грузим данные*
//Создаем объект
stageXML = new XML();
//подтягиваем наши уровни
stageXML.load("stages.xml");
//если загрузился - передаем управление функции is_loaded
stageXML.onLoad = is_loaded;
//игнорируем пробелы внутри XML
stageXML.ignoreWhite = true;
//кодировка на всякий случай
stageXML.useCodepage = true;
function is_loaded(success) {
if (success) {
//если загрузился файл
//определяем количество уровней
_root.stages_num = stageXML.childNodes.length;
//рисуем текущий
drawStage(current_stage);
} else {
//файл не загрузился
trace("неудача");
}
}
//
//Передаем функции номер уровня
function drawStage(num) {
//временная переменная
var tempString;
//создаем клип, в котором будем все рисовать
_root.createEmptyMovieClip("stage_mc", 1);
//переместим его немного вправо-вниз
stage_mc._x = stage_mc._y=10;
//отобразим номер уровня
level_txt = num+1;
//обнуляем массив, ведь эта функция будет также использоваться для перерисовки
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
stage_arr[i][j] = 0;
}
}
//построчно читаем уровень из XML и разбиваем строку на символы
for (j=0; j<8; j++) {
tempString = stageXML.childNodes[num].childNodes[j].childNodes+"";
for (i=0; i<8; i++) {
//каждый символ заносим в массив
stage_arr[i][j] = tempString.charAt(i);
}
}
//это колличество предметов в уровне
b_incr = 0;
//количество мишеней
t_incr = 0;
//начинаем рисовать
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
//попутно пустошим массив для мишеней
stage_t_arr[i][j] = "_";
//стена
if (stage_arr[i][j] == "w") {
stage_mc.attachMovie("wall", "wall_"+i+"_"+j, (i+1)*100+j, {_x:20*i, _y:20*j});
}
//предмет
if (stage_arr[i][j] == "b") {
b_incr++;
stage_mc.attachMovie("box", "box_"+b_incr, 2000+b_incr, {_x:20*i, _y:20*j});
//записываем в главный массив полное имя мувика
stage_arr[i][j] = "box_"+b_incr;
}
//если мишень
if (stage_arr[i][j] == "t") {
//переносим данные из главного массива в массив мишеней
stage_arr[i][j] = "_";
t_incr++;
stage_mc.attachMovie("target", "target_"+t_incr, 1000+t_incr, {_x:20*i, _y:20*j});
stage_t_arr[i][j] = "t";
}
//если игрок
if (stage_arr[i][j] == "m") {
stage_mc.attachMovie("igrok", "igrok_mc", 10000, {_x:20*i, _y:20*j});
//он у нас сам по себе - в массиве чистим после него
stage_arr[i][j] = "_";
//начальная позиция
igrok_poz_x = i;
igrok_poz_y = j;
}
}
}
}
//*Обработчик клавиатуры*
keyListener = new Object();
keyListener.onKeyDown = function() {
//Вверх
if (Key.getCode() == 38) {
checkMove(0, -1);
stage_mc.igrok_mc.gotoAndStop(1);
}
//Вниз
if (Key.getCode() == 40) {
checkMove(0, 1);
stage_mc.igrok_mc.gotoAndStop(3);
}
//Влево
if (Key.getCode() == 37) {
checkMove(-1, 0);
stage_mc.igrok_mc.gotoAndStop(4);
}
//Вправо
if (Key.getCode() == 39) {
checkMove(1, 0);
stage_mc.igrok_mc.gotoAndStop(2);
}
};
Key.addListener(keyListener);
//
//Двигаем персонажи
function checkMove(t_x, t_y) {
//временные
var str_t, str_t2;
//что стоит на клетку вперед?
str_t = stage_arr[igrok_poz_x+t_x][igrok_poz_y+t_y];
//что что там на две клетки дальше?
str_t2 = stage_arr[igrok_poz_x+t_x*2][igrok_poz_y+t_y*2];
//если впереди игрока предмет и за ним пустое место
if (str_t.substr(0, 1) == "b" and str_t2.substr(0, 1) == "_") {
//двигаем игрока
stage_mc.igrok_mc._x += 20*t_x;
stage_mc.igrok_mc._y += 20*t_y;
//двигаем предмет
eval("stage_mc."+str_t)._x += 20*t_x;
eval("stage_mc."+str_t)._y += 20*t_y;
//освобождаем место в массиве
stage_arr[igrok_poz_x+t_x][igrok_poz_y+t_y] = "_";
//прописываем в массиве предмет на новом месте
stage_arr[igrok_poz_x+t_x*2][igrok_poz_y+t_y*2] = str_t;
//позиция игрока
igrok_poz_x += t_x;
igrok_poz_y += t_y;
//счетчик ходов
step_txt++;
//проверка .. может уже все ок
isComplete();
} else {
//если свободно впереди
if (str_t.substr(0, 1) == "_") {
//двигаем игрока
stage_mc.igrok_mc._x += 20*t_x;
stage_mc.igrok_mc._y += 20*t_y;
//и его позицию меняем
igrok_poz_x += t_x;
igrok_poz_y += t_y;
//счетчик ходов
step_txt++;
}
}
//остался случай, если впереди стена - тут мы просто ничего не трогаем
}
//проверяем: все ли предметы там, где нужно
function isComplete() {
//временная
var flag = true;
//в t_incr хранится колличество мишеней в уровне
for (i=1; i<t_incr+1; i++) {
//определяем координату одного из предметов
var b_x = stage_mc["box_"+i]._x/20;
var b_y = stage_mc["box_"+i]._y/20;
//в массиве смотрим: над целью ди он?
if (stage_t_arr[b_x][b_y] == "t") {
//если там, то показываем перечёркнутый предмет предмет
stage_mc["box_"+i].gotoAndStop(2);
} else {
//если нет - опускаем флаг, что уровень не пройден
flag = false;
stage_mc["box_"+i].gotoAndStop(1);
}
}
//флаг поднят - уровень пройден
if (flag) {
//вызываем функцию перехода на седующий уровень
levelUp();
}
}
//переход на седующий уровень
function levelUp() {
//если текущий уровень не последний
if (current_stage<stages_num-1) {
current_stage++;
} else {
//если последний - переход на первый
current_stage = 0;
}
//перерисовка
drawStage(current_stage);
//пишем номер уровня в текстовом поле
level_txt = current_stage+1;
//обнуляем счетчик ходов
step_txt = 0;
}