PDA

Просмотр полной версии : Строгая последовательность


st0rk
08.01.2009, 13:46
Добрый день.
Я уже задавал в одной из тем этот вопрос но тогда мне толком не рассказали как решить, а очень нужно, подскажите пожалуйста в таком вопросе...
у меня 5 кнопок и они должны нажиматься строго в последовательности (например 1,3,5,4,2,3,5,1,4 -это правильно иначе неправильно!)
как такое реализовать? с массивами не работал, в AS нуб, но хочу разобраться. на Вас только одна надежда.

Добавлено через 1 час 17 минут
может вот так:

var massiv = new Array("1", "2", "3", "4","2", "5","5", "4","3", "1","6");
oborot_btn.onPress = function () {
var ok = "1";
if (ok <> massiv[1]) {
trace("error")
}
}
создали массив и потом при нажатии кнопки присваиваем какой-то переменной число, которое мы и будем проверять на валидность в массиве?
и так для каждой кнопки в той последовательности что нам нужно???

gloomyBrain
08.01.2009, 16:11
Вам нужно знать какую кнопку Вы нажали
Для этого все здесь (http://www.flasher.ru/forum/showthread.php?t=119700)
далее нужно сравнить номер (id) кнопки с элементом массива

то есть для каждой кнопки вот такой код:
Пусть есть переменная (ОДНА для всех кнопок!)
var numberOfElem:Number=0;
При нажатии на любую кнопку происходит увеличение значения переменной на 1
++numberOfElem;// Здесь нужно именно так! это не то же что и numberOfElem++
После этого проверяется значение элемента массива под номером numberOfElem
if(massiv[numberOfElement] == button.id){/// про button.id написано по ссылке
...Ваши пожелания и предложения
}

st0rk
09.01.2009, 12:18
тоесть что-то наподобие этого?

var massiv = new Array("1", "2", "3", "4","2", "5","5", "4","3", "1","6");
for (var z:Number = 1; z<=5; z++) {
button.id = z;
var numberOfElem:Number=0;
++numberOfElem;
if(massiv[numberOfElement] <> button.id){
trace("error")
}
}

Вы написали что этот цикл фор должен цепляться на каждую кнопку?
или же может в отдельный слой AS?

Mnilionic
09.01.2009, 13:18
var massiv = new Array("1", "2", "3", "4", "2", "5", "5", "4", "3", "1", "6");
// подсказка
var hint = this.createTextField('hint', 1, 50, 10, 200, 20);
hint.text = massiv;
hint.border = true;
//
// создаём копки
// кол-во кнопок = максимальное значение в массиве
var max = massiv[ massiv.sortOn(null, 8|16).pop() ];
for(var i = 0; i < max; i++){
var btn = this.createTextField('hint', i+5, 50 + i * 40, 50, 20, 20);
btn.border = true;
btn.html = true;
btn.htmlText = '<a href="asfunction:push_the_button, '+(i+1)+ '">' +(i+1)+ '</a>';
// для обычных кнопок
//btn.i = i+1;
//btn.onPress = push_the_button;
}
//
//
// функция проверки
var counting = 0;
function push_the_button(){
var index = Number(arguments[0]);
// для обычной кнопки
//var index = this.i
if( massiv[counting] == index){
trace('правильно! продолжайте...')
counting++;
}else{
trace('***' + newline + 'неправльно! Давай сначала.' + newline + '***');
counting = 0;
}
}

st0rk
09.01.2009, 13:28
Mnilionic, у меня кнопки уже есть и они мувиклипы, как мне их нужно назвать или что сделать,чтобы Ваш пример сработал? просто они не должны находиться в одну линию как у Вас, а разбросаны по всей сцене - под элементами графическими...

gloomyBrain
09.01.2009, 14:21
если хотите сделать через имена - то почитайте по ссылочке в моём посте выше

Mnilionic
09.01.2009, 23:33
st0rk

btn1.i = 1;
btn1.onPress = push_the_button;
btn2.i = 2;
btn2.onPress = push_the_button;
...

AlexCooper
10.01.2009, 03:24
var massiv = new Array("1", "2", "3", "4", "2", "5", "5", "4", "3", "1", "6");
massiv.i=0;

btn_1.onPress=function()
{
Recover(this._name);
}

btn_2.onPress=function()
{
Recover(this._name);
}

Recover=function(s:String)
{
if (massiv[massiv.i]==s.substring(4,s.length)) massiv.i++;
// else massiv.i=0;
}
Переменная massiv.i будет хратить текущею позицию последовательности, если нужен сброс когда нарушенна последовательность нажатий то раскомментить код

UPD: Либо же так
var massiv = new Array("1", "2", "3", "4", "2", "5", "5", "4", "3", "1", "6");
massiv.i=0;

btn_1.onPress=function()
{
if (Recover(this._name)==true) Brain(this._name);
}

btn_2.onPress=function()
{
if (Recover(this._name)==true) Brain(this._name);
}

Recover=function(s:String)
{
if (massiv[massiv.i]==s.substring(4,s.length))
{
massiv.i++;
return true;
} else
{
//massiv.i=0;
return false;
}
}

Brain=function(s:String)
{
if ( s== 'btn_1') trace('Действие первой кнопки');
if ( s== 'btn_2') trace('Действие второй кнопки');
}

UPD2: Можно и так
var massiv = new Array("1", "2", "3", "4", "2", "5", "5", "4", "3", "1", "6");
massiv.i=0;

btn_1.onPress=function()
{
Recover(this._name);
}

btn_2.onPress=function()
{
Recover(this._name);
}

Recover=function(s:String)
{
if (massiv[massiv.i]==s.substring(4,s.length))
{
massiv.i++;
Brain(massiv.i);
}
// else trace('Бабах!!!! Вы нарушили последовательность');
}

Brain=function(step:Number)
{
if ( step==1) trace('Запуск левого двигателя');
if ( step==2) trace('Запуск правого двигателя');
if ( step==3) trace('Включение взлёточных прожекторов');
if ( step==4) trace('Тяга 60%');
if ( step==5) trace('Тяга 80%');
if ( step==6) trace('Высунуть закрылки');
if ( step==7) trace('Отпустить ручной тормоз');
if ( step==8) trace('Штурвал на себя');
if ( step==9) trace('Тяга 100%');
if ( step==10)trace('Спрятать шасси');
}

Добавлено через 30 минут
UPD III:
Первый "UPD" для того случая когда действия кнопки не меняеться
Второй "UPD" когда каждое действие уникальное по функционалу.

st0rk
16.01.2009, 15:06
Mnilionic, все нравится встрочку, пусть так и будет, только вот чтобы кнопки-ссылки эти назывались не 1,2,3,4,5,6, а например ВВ, ОТК, УД и т.д. как такое сделать?

AlexCooper
16.01.2009, 15:21
А чем вам мой пример не понравился?
Если нужно под Ваши не стандартизированные имена кнопок.
Меняем в массиве var massiv = new Array("имя_1", "имя_2", "имя_3", "имя_1", "имя_3");

и в функции Recover уберем отработку строки, то-есть if (massiv[massiv.i]==s)

ENDrain
16.01.2009, 15:37
Вот еще вариант:

var aArray0:Array = [правильный_порядок];
var aArray1:Array; // Пока пустой, в него будут добавляться по порядку индексы нажатых кнопок;

Для каждой кнопки нужно добавить код

on (release) {
aArray1.push(номер_кнопки);
myFunc();
};

И функция, проверяющая правильность нажатий:

function myFunc():Void {
for (var i:Number = 0; i < aArray1.length; i++) {
if (aArray1[i] != aArray0[i]) {
// Значит, последовательность нарушена
};
};
};

st0rk
23.01.2009, 16:56
спасибо всем, со всем о чем писал выше разобрался - немного переделал код, вот что вышло (в аттаче), но почему-то кнопка btn_6 ложно срабатывает - я ее жму = говорит что неправильная последовательность, хотя там все правильно.и чего-то не пойму как чтобю при нажатии на ту кнопку слой s9_mc становился на передний план (тоесть вместо белого должно быть желтое).
и еще был бы очень признателен если бы показали как в моем случае сделать кнопочку которая сбрасывала текущие параметры и начинала клип с самого начала... gotoAndStop(1); не годится :(
подскажите, плз!

AlexCooper
10.02.2009, 14:33
1-е Выложите фла версию.
2-е Проверяйте данные функцией trace