Flash Modulus Glitch? - PullRequest
       7

Flash Modulus Glitch?

0 голосов
/ 20 марта 2012

Это сводит меня с ума! Почему это не работает ??? Оператор if никогда не срабатывает, даже когда трассировка ясно показывает, что проклятое число% 10 равно нулю ...

var starSpawnTime:int = 0;
stage.addEventListener(Event.ENTER_FRAME, update);
stop();

function update(e:Event): void {
starSpawnTime++;

trace(starSpawnTime);
trace("Modulus: " + starSpawnTime % 10);

if ((starSpawnTime % 10) == 0) {
    sStarBuffer = new SStar();
    sStarBuffer.x = 560;
    sStarBuffer.y = getRandomNumber(0, 400);
    stage.addChild(sStarBuffer);
    stars.push(sStarBuffer);
}

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Я попробовал код (упрощенный), и он работает

var starSpawnTime:int = 0;
stage.addEventListener(Event.ENTER_FRAME, update);
stop();

function update(e:Event): void {
    starSpawnTime++;

    trace(starSpawnTime);
    trace("Modulus: " + starSpawnTime % 10);

    if ((starSpawnTime % 10) == 0) {
        trace("BAM")
    }
}

скорее всего, это не оператор по модулю, который вызывает проблемы

0 голосов
/ 20 марта 2012

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

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

Даже если вы работаете с целыми числами, Flash внутренне преобразует их в числа с плавающей точкой, вычисляет и приводит к приведениюрезультат к ожидаемому типу, поэтому у вас нет целочисленной математики во Flash.

Что вы можете сделать в вашем случае: поскольку starSpawnTime изначально целое число, похоже, что оно не будетвред, если вы сделали это:

if (!int(startSpawnTime % 10)) { . . . }

или

if (int(startSpawnTime % 10) == 0) { . . . }

Если вы чрезвычайно обеспокоены производительностью, вы можете самостоятельно реализовать целочисленное деление или, возможно, использовать индукцию для вычисления напоминания - ноЯ хотел бы оставить это в качестве упражнения для читателя:)

В качестве отступления: целые числа не обнуляются, яn Flash, после объявления им присваивается значение по умолчанию, целое значение по умолчанию равно 0.Таким образом, запись var i:int = 0; является избыточной, var i:int достаточно.

...