Вспышка, если утверждение удовлетворяет истина и ложь - PullRequest
0 голосов
/ 22 января 2009

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

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  

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

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

Ответы [ 10 ]

4 голосов
/ 22 января 2009

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

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

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

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

3 голосов
/ 22 января 2009

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

if(pickedUp == true){

}
else
if(pickedUp == false){

}
2 голосов
/ 22 января 2009

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

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

2 голосов
/ 22 января 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;
    }
0 голосов
/ 27 января 2009

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

0 голосов
/ 27 января 2009

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

0 голосов
/ 27 января 2009

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

released and picked up60
released and not picked up

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

0 голосов
/ 22 января 2009

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

  • Да, код находится в цикле. (OnEnterFrame)

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

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

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

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

0 голосов
/ 22 января 2009

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

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

0 голосов
/ 22 января 2009

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

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

    if (pickedUp == true)
    ....
}
...