0

これは私を完全に夢中にさせています!なぜこれが機能しないのですか?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);
}
4

2 に答える 2

0

私はコードを試しました(簡略化)そしてそれは動作します

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")
    }
}

問題を引き起こしているのはモジュロ演算子ではない可能性があります

于 2012-03-21T17:01:52.967 に答える
0

浮動小数点の丸め誤差により、誤解を招く可能性があります。浮動小数点数を使用する場合、2 つの乗数を保持し、それらの倍数を使用して数値を表すことにより、数値を近似的に表します。これには、すべての整数を表すことができないという残念な制限があります。明らかに、一部の整数は素数であるか、十分な精度で倍数として表すことができないためです。

慣例により、非常に小さな小数部分を含む数値は、出力される前に丸められます。これが、きれいな出力が表示される理由ですが、値は期待どおりに動作しません。

整数を操作する場合でも、Flash は内部的に浮動小数点数に変換し、結果を計算して期待される型にキャストするため、Flash には適切な整数演算がありません。

あなたの場合にできること:starSpawnTimeはもともと整数であるため、これを行っても害はないようです:

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

また

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

パフォーマンスが非常に心配な場合は、整数除算を自分で実装するか、帰納法を使用してリマインダーを計算することができますが、これは読者の演習として残しておきます:)

余談ですが、整数は Flash では null 可能ではありません。一度宣言すると、デフォルト値が割り当てられます。整数のデフォルト値は です0。だから書くことvar i:int = 0;は冗長です、それでvar i:int十分です。

于 2012-03-20T19:50:51.007 に答える