Flash, если утверждение удовлетворяет истине и ложности

У меня есть следующий код:

if(pickedUp == true){
    trace("released and picked up" + pickedUpNum);
    this.storedClick = false;
    this.onMouseMove = null;
    this.onMouseDown = null;
    this.onMouseUp = null;
    this.onEnterFrame = this.refresh;
    pickedUpNum++;
    if( pickedUpNum > 60) pickedUp = false;
}

if(pickedUp == false){
    trace("released and not picked up");
    this.storedClick = false;
    this.onEnterFrame = this.refresh;
    this.onMouseDown = this.onStoreDrag;
    this.onMouseUp = this.onClearStoreDrag;
    this.onMouseMove = null;
}

И я получаю этот вывод около 60:

released and picked up59
released and picked up60
released and not picked up
released and picked up61
released and not picked up  

Как это возможно? Я должен упустить что-то простое.

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


person Bryan    schedule 22.01.2009    source источник
comment
Одно предложение: следуйте за функцией в своей голове, начиная со значения 60 для pickUpNum. Если поведение по-прежнему вас удивляет, сообщите нам. И расскажите нам, почему это удивительно и что должен делать код вместо этого, чтобы удовлетворить вас (особенно, что должна делать строка pickUpNum++).   -  person Daniel Daranas    schedule 22.01.2009
comment
Брайан, пожалуйста, отвечайте людям комментариями к их ответам или правками к исходному сообщению. Когда вы пишете новые ответы, и за них проголосовали за или против, более поздние зрители не могут понять, о чем спрашивали и каков был ответ.   -  person fenomas    schedule 23.01.2009


Ответы (10)


Если код, который вы написали, находится в цикле, для pickUp каким-то образом устанавливается значение true ПОСЛЕ проверки (pickedUp == false). Итак, что произойдет в следующий раз в цикле (скажем, когда pickUpNum == 61), pickUp будет истинным, будут выполняться операторы true, а затем pickUp снова будет установлен в false (в конце «истинного» check), позволяя запускать операторы ложной проверки.

Убедитесь, что вы не сбрасываете pickUp в true после ложной проверки (и когда pickUpNum > 60, согласно вашему коду), и он должен работать так, как вы предполагали.

person Michael Todd    schedule 22.01.2009

Взгляните на трассировку для начальных условий (pickedUpNum, pickedUp) = (59, true). Мы выполним первое условие и добавим 1 к pickedUpNum. После добавления 1, pickedUpNum = 60 мы не выполняем внутреннее условие, и pickedUp остается равным true. С этим значением мы пропускаем второе условное выражение.

Итак, мы находимся в (pickedUpNum,pickedUp) = (60,true). Мы снова выполняем первое условие и добавляем 1 к pickedUpNum. Теперь pickedUpNum = 61, поэтому мы выполняем внутреннее условие и устанавливаем pickedUp = false. С этим новым значением будет выполнено второе условное выражение.

(извините, если я педантичен, иногда лучше быть откровенным :))

изменить: спасибо, Дэвид, что заметил мою логическую опечатку

person kyle    schedule 22.01.2009
comment
Там опечатка: в первом абзаце вы, вероятно, имеете в виду, что pickUp остается установленным в TRUE. - person David Hanak; 22.01.2009

Я не уверен, что полностью понимаю, чего вы пытаетесь достичь, потому что вы не объясняете, что вы ожидаете. Но разве ты не собираешься сделать это?

if(pickedUp == true){

}
else
if(pickedUp == false){

}
person Luke    schedule 22.01.2009
comment
извините -1, потому что вам не нужны == true или == false или else if. - person Iain; 22.01.2009
comment
ОП не имеет ничего общего с рекомендациями по стилю кодирования, пожалуйста, не отмечайте людей за то, что у них другой стиль, чем у вас. - person Richard Szalay; 22.01.2009
comment
+1 это точно, проблема в оригинале в отсутствии остального. == взяты из оригинала. Это был самый прямой и лаконичный способ изложить ответ. ответ Кайла более полный, но все же оба верны. - person Adam Bellaire; 22.01.2009

Хорошо, пара вещей. Во-первых, вам не нужно говорить "== true" для логических значений. Во-вторых, вообще не используйте "==false" используйте "!" (символ НЕ), но в вашем случае просто используйте "еще"

    if(pickedUp){
                trace("released and picked up" + pickedUpNum);
                this.storedClick = false;
                this.onMouseMove = null;
                this.onMouseDown = null;
                this.onMouseUp = null;
                this.onEnterFrame = this.refresh;
                pickedUpNum++;
                if( pickedUpNum > 60) pickedUp = false;
        }  else {
            trace("released and not picked up");
            this.storedClick = false;
            this.onEnterFrame = this.refresh;
            this.onMouseDown = this.onStoreDrag;
            this.onMouseUp = this.onClearStoreDrag;
            this.onMouseMove = null;
    }
person Iain    schedule 22.01.2009
comment
Я мог бы, конечно, проголосовать против вас за перефразирование того, что уже объяснено, но это, конечно, было бы по-детски... - person Luke; 22.01.2009

Я подозреваю, что ваш код сбрасывает флаг каждый раз в цикле.

wile (true)
{
    boolean pickedUp = true // Move this outside the loop ^^

    if (pickedUp == true)
    ....
}
person Chris Nava    schedule 22.01.2009
comment
Как правило, лучше избегать во всех языках ECMAScript, это может привести к серьезному снижению производительности. - person cwallenpoole; 23.01.2009
comment
Цикл while не имеет заметной разницы в производительности по сравнению с любым другим типом цикла в языке на основе ECMAScript. Цикл while в основном представляет собой цикл for без инициализатора или выражения подсчета. Он имеет только тест условного цикла. - person Josh Tynjala; 02.02.2009

Что он должен делать, когда достигает 61 и выполняет второе условие?

Если ваш код не зациклен, проверьте, не изменяются ли pickUp и pickUpNum где-то еще, кроме первого условного выражения.

person Mauricio    schedule 22.01.2009

Чтобы ответить на все ваши вопросы

  • Да, код зациклен. (на энтерфрейме)

  • Я знаю, что могу использовать else if, но если бы я использовал else, второе условное выражение никогда не выполнялось бы.

  • Я знаю, что мне не нужно использовать == и я могу использовать не оператор (!), но, поскольку у меня были проблемы, я решил быть явным

  • Я не понимаю, как Кайл объяснил решение в своем коде и почему другие люди считают, что это решение (+2).

Остается вопрос, как выполняются оба условия (pickUp имеет значение true и false), когда pickUpNum достигает 61, а для pickUp установлено значение false.

person Bryan    schedule 22.01.2009
comment
Я думаю, что проблема похожа на ту, на которую указывает Майкл; если логическое значение равно true, а int равно 60, у вас будет эта проблема каждый раз. Я согласен с диагнозом, что вы устанавливаете логическое значение в начале цикла. - person kyle; 22.01.2009

Брайан: я какое-то время смотрел на это, задаваясь вопросом, почему ты не мог принять ответ Кайла, а потом меня осенило, что ты действительно действительно хотел, чтобы это было так:

released and picked up60
released and not picked up

И вопрос был о том, что произошло после. На первый взгляд, ваш вопрос был неправильно истолкован, как довольно учебник Пример ошибки, которую кто-то может сделать с условными выражениями. У Майкла, кажется, есть правильная идея, так как в приведенном коде нет ничего, что могло бы объяснить это, но я также просто хотел добавить, что отладчик во flash IDE, хотя и не идеален, отлично подходит для отслеживания такого рода вещей.

person Andrew    schedule 27.01.2009

как не использовать отладчик? создайте свой код с помощью flex builder и используйте дружественную среду программирования (eclipse), в которой есть простой способ отладки кода

person Shvilam    schedule 27.01.2009

Я согласен с Швиламом. Изучение того, как использовать пошаговый отладчик, является таким ценным навыком, который значительно упрощает диагностику ошибок. Я бы рекомендовал отладчик Flex вместо отладчика Flash, но любой из них лучше, чем ничего.

person Richard Szalay    schedule 27.01.2009