PDA

Просмотр полной версии : записываем ходы потом исполняем


veles2008
23.11.2009, 16:29
Приветствую!

Есть объект. Есть текстовое поле. И есть кнопки ходов которые указывают куда двигаться объекту: прямо, на право, на лево, назад.

При нажатии на каждую кнопку ход записывается в текстовое поле.

Как сделать чтобы потом объект выполнял ходы в той последовательности в которой они записаны в поле?

Добавлено через 3 минуты
...Чтобы ходы начинали выполняться при нажатии на 5 кнопку "Выполнить"?

mooncar
23.11.2009, 18:17
Речь о текстовом поле можно не вести, если указывают ходы именно кнопки и если поле служит только для индикации выбранного движения. Это лишняя для задачи информация.
А по сути задачи - сделайте так:
1. Определите массив.
2. При нажатии определенной кнопки забивайте в зависимости от того, какая кнопка нажата в массив определенное значение с помощью Array.push метода.
3. При нажатии кнопки выполнить - стартуется функция движения, данные для движения берутся последовательным перебором значений массива.
Несложно.

veles2008
23.11.2009, 20:43
Если не сложно, то может покажите? :rolleyes:

mooncar
23.11.2009, 20:55
А с чем именно трудность-то испытываете?
Можно, конечно, попробовать накидать, но поделитесь - что неясно в алгоритме, или что конкретно не получается? Или вы даже не пробовали?

veles2008
23.11.2009, 22:02
я ещё не очень понимаю работу с массивами ну и не знаю всех методов

Molecula
23.11.2009, 22:28
var a:Array = []; - создали массив
a.push(что-то запихнули в массив)

mooncar
23.11.2009, 22:40
Не знаете? Хороший повод узнать, я тоже не знал, да и не знаю всех.
var course:Array = new Array(); //массив с ходами
var step:Number = 10; //шаг объекта
var count:Number = 0; //нужно для учета прохода по индексам массива при движении

//запись и индикация ходов, жмем клавиатуру
var keyListener_obj:Object = new Object();
keyListener_obj.onKeyDown = function() {

course_tf.text = ''; //стираем предыдущую выведенную в поле запись

switch (Key.getCode()) {
case Key.LEFT :
var showDir:Number = setTimeout(showDirection, 100, 'LEFT'); //с отсрочкой в 100 мс показываем, что нажали
course.push('LEFT'); //запоминаем в массиве ход
break ;
case Key.UP :
var showDir:Number = setTimeout(showDirection, 100, 'UP');
course.push('UP');
break ;
case Key.RIGHT :
var showDir:Number = setTimeout(showDirection, 100, 'RIGHT');
course.push('RIGHT');
break ;
case Key.DOWN :
var showDir:Number = setTimeout(showDirection, 100, 'DOWN');
course.push('DOWN');
break ;
}
};
Key.addListener(keyListener_obj);

//индицирует записываемый ход
function showDirection (dir:String) {
course_tf.text = dir;
}


//активирует старт движения
doit_btn.onRelease = function () {
moveMc = setInterval(moveIt, 500);
course_tf.text = 'ДВИЖЕНИЕ!';
}

//определяет характер движения
function moveIt () {
if (count < course.length) {
//если записи не кончились, продолжаем движение, считывая направление из очередной ячейки массива
doMove (course[count]);
count++;
}
else {
clearInterval (moveMc); //останавливаем движение
count = 0; //сбрасываем счетчик
course_tf.text = 'КОНЕЦ ДВИЖЕНИЯ';
for (i in course) {
course.splice(i); //очищаем массив
}
}
}

//непосредственно двигает мувик
function doMove (direct:String) {
switch (direct) {
case 'LEFT' :
mc._x -= step;
break ;
case 'UP' :
mc._y -= step;
break ;
case 'RIGHT' :
mc._x += step;
break ;
case 'DOWN' :
mc._y += step;
break ;
}
}
Только я забыл, что у вас кнопки - кнопки на сцене, и тут сделано с использованием клавиатурных, нужно жать именно их, переделайте, если нужно.
Для этого каждый блок из первой функции со switch нужно будет загнать в onRelease соответственной кнопки, и убрать слушателя keyListener_obj.
Да и еще уберите если нужно лишнее.
А если делаете что-то вроде игры - можно еще блокировку кнопки на период движения, чтобы повтора не случилось, и т.д.

PS. Можно сделать и проще, но я все расписал, чтобы проще для понимания было. Например, упразднить первый switch и вводить в массив сразу Key.getCode(), а во втором switch двигать в зависимости от цифрового кода.

veles2008
23.11.2009, 23:06
Огромное спасибо!!!!!

Да, кнопки на сцене. Тоесть это нужно, например, вместо
case Key.LEFT :

нужно писать как то там...
left.onRelease:
или вообще без case?

mooncar
23.11.2009, 23:09
left_btn.onRelease = function() {
var showDir:Number = setTimeout(showDirection, 100, 'LEFT');
course.push('LEFT'); //запоминаем в массиве ход
}
case - это элемент условного оператора switch, естественно, все убираете, включая и саму первую функцию onKeyDown, и слушателя.
Оставляете вместо блока keyListener_obj.onKeyDown только четыре блока onRelease - по одному на каждую кнопку.

veles2008
23.11.2009, 23:18
Спасибо!!
А можна последний вопрос?

можно еще блокировку кнопки на период движения

Как это сделать?

mooncar
23.11.2009, 23:23
Блокировка:
doit_btn.onRelease = function () {
moveMc = setInterval(moveIt, 500);
course_tf.text = 'ДВИЖЕНИЕ!';
this.enabled = false ; //блокировка
}
и разблокировка:
else {
clearInterval (moveMc); //останавливаем движение
count = 0; //сбрасываем счетчик
course_tf.text = 'КОНЕЦ ДВИЖЕНИЯ';
for (i in course) {
course.splice(i); //очищаем массив
}
doit_btn.enabled = true ; //разблокировка
}

Добавлено через 1 минуту
Если что, то и ваши кнопки left, right и т.д. блокировать-деблокировать нужно. Ну, это уж сами давайте, аналогично.

veles2008
23.11.2009, 23:28
СПАСИБО!!!