2011-01-23 17 views
-2

私はActionscript 2のために書かれたチュートリアルに従っていますが、それをAS 3に変換することに成功しました。キャラクターの動きにいくつかのランダム性を加えることを意図しているActionscript 3の乱数3

if (_currentframe==1) { 
    // randomly choose whether or not to play 
    if (random(100)>97) { 
     // should we tease or popup? 
     if (random(3)<1) { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

ここでチュートリアル(http://www.cleverpig.com/tutorials/whackapig/whack.htmステップ8)は、次のコードを持っています。私はAS 3でこのコードを作成しました。

if (currentFrame==1) { 
    // randomly choose whether or not to play 
    if(Math.floor(Math.random()*99)-97) { 
     // should we tease or popup? 
     if (Math.floor(Math.random() *3)-1) 
    ) { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

このコードでプログラムを実行すると、キャラクターのアニメーション全体が1回(下、中上、上、下)再生されます。最初の3つのフレームだけを再生し、これを繰り返すことになっています。

EDIT:

function random (n:int) : int { 
    return Math.floor (Math.random() * n); 
} 

if (currentFrame==1) { 
    // randomly choose whether or not to play 
    if(random(100)): 97 { 
     // should we tease or popup? 
     if (random(3)): 1 
     { 
     this.gotoAndPlay ("popup"); 
     } else { 
     this.gotoAndPlay (1); 
     } 
    } 
    } 

シンボル '穴'、レイヤ 'ActionScriptの'、フレーム1、1084 10行目:構文エラー:コロンの前に識別子を期待。 シンボル 'hole'、レイヤ 'Actionscript'、フレーム1、行10 1008:属性が無効です。 シンボル 'hole'、レイヤ 'Actionscript'、フレーム1、ライン12 1084:構文エラー:コロンの前に識別子が必要です。 シンボル 'hole'、レイヤ 'Actionscript'、フレーム1、行13 1008:属性が無効です。 シンボル 'hole'、レイヤ 'Actionscript'、フレーム1、ライン15 1083:構文エラー:elseは予期しないものです。

答えて

0

元のチュートリアルの作者に-1を与え、そのような条件式に数値のランダム式を入れてみましょう。

条件式の結果を判断するには、常にブール値として評価されます。そこにNumber/intを入れると、その値が0(.0)のときだけfalseになります。それ以外の場合(負の数値も含む)、それは真と評価されます。

はい、あなたは@ weltraumpiratの答えに従うことで簡単にrandom()関数を作成できますが、random()関数を条件式から取り出して、並べ替えのchance()メソッドでラップすることをお勧めします。たとえば:

function feelingLucky(ratio:Number):Boolean { 
    return Math.random() <= ratio; 
} 

次に、このメソッドを呼び出すと、のようなあなたのyの構文のうち、より良いXを与える:

if (feelingLucky(97/99)) { 
    // you're lucky. 
} else { 
    // not so lucky. 
} 

またはあなたの他の条件、feelingLucky(1/3)を。またはfeelingLucky(100/100)で優勝を試してみてください。

幸運:)

P.S.コロンと数字のため、あなたの最近の編集は失敗します:if文の後に97。彼らはそこにいるべきではありません。

+0

感謝のエリック、その説明は物事をクリアするのに役立ちました。 :) – RapsFan1981

+0

それはそれでした!私はちょうど変更を加えて、今は素晴らしい仕事をしています。元のコードの欠陥を指摘し、この代替案を提示する時間をとってくれてありがとう、ありがとう。 – RapsFan1981

+1

@ Eric-Paul:あなたは間違っています:元のチュートリアルでは、乱数が* 97より大きい場合、最初の条件はtrueと評価されます。したがって、100回のうち2回で真となります。それを意図していた。 – weltraumpirat

3

あなたは簡単に独自のランダム()関数を実装し、まったく同じコードの残りの部分に保つことができます。

function random (n:int) : int { 
    return Math.floor (Math.random() * n); 
} 
+1

@weltraumpirat。あなたの数式には偏見があります。正しい式は 'Math.floor(Math.random()* n)'です(これは可能な結果からnを除外します)。また、小数点以下を切り捨てるときに正の整数を返す場合は、Math.floorを取り除くこともできます。実際には正の実数と同じ効果があります。 –

+0

あなたは正しいです、私はMath.random()が0 <= n <= 1を返すと期待していましたが、ドキュメントをチェックしましたが、実際には0 <= n <1です。それを指摘していただきありがとうございます。 – weltraumpirat

+0

@weltraumpirat。問題ない。途中で正解を投稿するには+1してください。 –

0

マイナス演算子により/以下の演算子を変更する理由はありますか? ブロックはフォーマットが条件がfalse、trueと評価

if (condition)で0

除いてすべてのために実行するかどう思われます。

あなたの表現がブール型に変換されていると思います。 97 = 2
- 例

if (random(100)>97)
はい(条件が真と評価)=> 99> 97である
96> 97 =>なし(条件が偽と評価)

if (random(100)-97)
99ではありません ブール値で表される2が真(条件が真と評価される)
97 - 97 = 0
ブール値として表される0は、条件が偽になります(条件は偽と評価されます)

+0

うん..少しフィリップを教えていただけますか?私はあなたが何を言っているのか理解しています。 – RapsFan1981

+0

@Caseyコードを最初に編集すると、チュートリアルの多かれ少なかれ演算子の代わりにマイナス記号を使用していただけです。だから毎回ifブロックが間違った理由で真実になってしまった。 – phwd