Показать сообщение отдельно
Старый 14.04.2010, 14:08
armastus вне форума Посмотреть профиль Отправить личное сообщение для armastus Найти все сообщения от armastus
  № 8  
Ответить с цитированием
armastus

Регистрация: Apr 2010
Сообщений: 25
Код 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;
}
Вот код, как я понимаю сейчас нижнего подчёркивания вообще нет (например _x, _root)