トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     比較演算子の記述の仕方
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hideroku
Åê¹ÆNo.11458
投稿日時: 2004-10-12 19:17
新米
居住地:
投稿: 16
使用環境:
WinXP
Flash MX2004pro
比較演算子の記述の仕方
こんにちは、hiderokuと申します。

今、ボタンをクリックしたタイミングで判定結果が変わる
ゲームを作ろうと思っていて、比較演算子のところで悩んで
います。

ルートにインスタンス名「MC1」というムービークリップを配置しています。
このムービークリップはフレーム数を30フレームにしました。

ルートにボタンを配置し、ボタンを押したときに
「MC1」のフレーム番号を取得して
「MC1」のフレーム1?6の時は「エリア1」へ
「MC1」のフレーム7?14の時は「エリア2」へ
「MC1」のフレーム15?22の時は「エリア3」へ
「MC1」のフレーム23?30の時は「エリア4」へ
というふうにしようとしています。
しかし、うまいこと動作してくれません。
「エリア1」、「エリア2」は正しく?判定しているようなんですが
「MC1」のフレーム15以上になると「エリア4」と判定されているみたいなのです。

ルートに配置したボタンに次のアクションスクリプトを記入しています。
-----------------------------------------------------------
on (press) {
MC1No = this.MC1._currentframe;

MC1_1 = ((MC1No <= 1) || (MC1No <=6));
MC1_2 = ((MC1No <= 7) || (MC1No <= 14));
MC1_3 = ((MC1No <= 15) || (MC1No <= 22));
MC1_4 = ((MC1No <= 23) || (MC1No <= 30));

trace("番号" + MC1No);

if (MC1_1){
trace("エリア1");
} else if (MC1_2){
trace("エリア2");
}else if (MC_1_3){
trace ("エリア3");
}else if (MC1_4){
trace("エリア4");
}
this.MC1.stop();
}
------------------------------------------------------------

なんか根本的に比較演算子の記述の仕方というか
考え方が違うのでしょうか?

私は説明が下手なもので聞きたい事が伝わってるかどうか
不安なので一応、FLAファイルをアップしてあります。
http://www.eurus.dti.ne.jp/~hideroku/hantei.html

宜しくお願いします。
永井勝則
Åê¹ÆNo.11459
投稿日時: 2004-10-12 20:43
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 比較演算子の記述の仕方
永井勝則です。
mcFrameNum = 22//ここに調べたい数字を入れる
if (mcFrameNum>=23) {
trace("エリア4");
} else if (mcFrameNum>=15) {
trace("エリア3");
} else if (mcFrameNum>=7) {
trace("エリア2");
} else if (mcFrameNum>=1) {
trace("エリア1");
}
で、いけると思います。

ちなみに、MC1_1、MC1_2・・・の部分は、
trueかflaseが代入されるだけです。
なので、その下のif文は、最初がtrueなら
trace(”エリア1”)が、実行され、
falseならtrace("エリア2")が実行されるだけです。

引用:


MC1_1 = ((MC1No <= 1) || (MC1No <=6));
MC1_2 = ((MC1No <= 7) || (MC1No <= 14));
MC1_3 = ((MC1No <= 15) || (MC1No <= 22));
MC1_4 = ((MC1No <= 23) || (MC1No <= 30));

trace("番号" + MC1No);

if (MC1_1){
trace("エリア1");
} else if (MC1_2){
trace("エリア2");
}else if (MC_1_3){//<--これはMC1_3
trace ("エリア3");
}else if (MC1_4){
trace("エリア4");
}
this.MC1.stop();
}
------------------------------------------------------------

なんか根本的に比較演算子の記述の仕方というか
考え方が違うのでしょうか?

野中文雄
Åê¹ÆNo.11460
投稿日時: 2004-10-12 21:22
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 比較演算子の記述の仕方
永井さんがご指摘された変数のスペルミスを修正すれば、結果としては動作します。
引用:
hiderokuさんは書きました:
ルートにボタンを配置し、ボタンを押したときに
「MC1」のフレーム番号を取得して
「MC1」のフレーム1?6の時は「エリア1」へ
「MC1」のフレーム7?14の時は「エリア2」へ
「MC1」のフレーム15?22の時は「エリア3」へ
「MC1」のフレーム23?30の時は「エリア4」へ
というふうにしようとしています。

ただ、変数MC1_1に代入した「6以下または1以下」という評価は、結局「6以下」です。以降の論理和||の評価も同様です。なお、ifステートメントにおける「条件の順序」については、「if/else if/elseアクションを使った処理」をご参照ください。
on (press) {
    MC1No = this.MC1._currentframe;
    /*
    MC1_1 = ((MC1No <= 1) || (MC1No <=6));
    MC1_2 = ((MC1No <= 7) || (MC1No <= 14));
    MC1_3 = ((MC1No <= 15) || (MC1No <= 22));
    MC1_4 = ((MC1No <= 23) || (MC1No <= 30));
    */
    MC1_1 = (MC1No<=6);
    MC1_2 = (MC1No<=14);
    MC1_3 = (MC1No<=22);
    MC1_4 = (MC1No<=30);
    
    trace("番号" + MC1No);
    
    if (MC1_1){
        trace("エリア1");
    } else if (MC1_2){
        trace("エリア2");
    // }else if (MC_1_3){
    } else if (MC1_3) {
        trace ("エリア3");
    }else if (MC1_4){
        trace("エリア4");
    }
    this.MC1.stop();
}

ご使用の環境は、プロフィールに記入しましょう。
引用:


----------------
 

hideroku
Åê¹ÆNo.11461
投稿日時: 2004-10-12 22:14
新米
居住地:
投稿: 16
使用環境:
WinXP
Flash MX2004pro
Re: 比較演算子の記述の仕方
hiderokuです。

永井勝則さん、すばやい返信ありがとうございます!

引用:

永井勝則さんは書きました:
ちなみに、MC1_1、MC1_2・・・の部分は、
trueかflaseが代入されるだけです。
なので、その下のif文は、最初がtrueなら
trace(”エリア1”)が、実行され、
falseならtrace("エリア2")が実行されるだけです。

あっif文ってそうでしたよね
記述した順にtrueかfalseを判定していくって。

しかもしっかりスペルミスもしていましたね...。
ご指摘ありがとうございます。
これで先に進めます。ありがとうございました。
hideroku
Åê¹ÆNo.11462
投稿日時: 2004-10-12 22:26
新米
居住地:
投稿: 16
使用環境:
WinXP
Flash MX2004pro
Re: 比較演算子の記述の仕方
hiderokuです。

野中文雄さん、返信ありがとうございます!
引用:

野中文雄さんは書きました:
ただ、変数MC1_1に代入した「6以下または1以下」という評価は、結局「6以下」です。以降の論理和||の評価も同様です。なお、ifステートメントにおける「条件の順序」については、「if/else if/elseアクションを使った処理」をご参照ください。

そうなんですよね。「結局6以下」ってことなんですよね。
自分でもコードを書きながらなんかちがうんじゃないかな?
とか思いながら書いてたんですが。
どうも
1フレーム?6フレームまでは
7フレーム?14フレームまでは...
ということを考えすぎてたのかもしれないです。
それと永井さんにご指摘された
記述した順に評価をしていくということを
すっかり忘れていました。

ありがとうございました!

プロフィールの記入の仕方間違ってましたね
こちらも重ね重ねご指摘ありがとうございます。
野中文雄
Åê¹ÆNo.11463
投稿日時: 2004-10-12 23:57
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 比較演算子の記述の仕方
「1フレーム?6フレームまで」であれば、論理積演算子&&ですね。
MC1_1 = ((1<=MC1No) && (MC1No<=6));

引用:
hiderokuさんは書きました:
そうなんですよね。「結局6以下」ってことなんですよね。
...[中略]...
1フレーム?6フレームまでは
7フレーム?14フレームまでは...
ということを考えすぎてたのかもしれないです。

もちろん、「条件の順序」をきちんと整理すれば、条件はひとつずつで足ります。
引用:
それと永井さんにご指摘された
記述した順に評価をしていくということを
すっかり忘れていました。

さらに、今回の処理限定でしたら、ステートメント1行で済みます。 なお、範囲外の値(0以下または31以上)判定は、考慮していません。
trace("エリア"+Math.floor((MC1No+1)/8+1));


----------------
 

hideroku
Åê¹ÆNo.11487
投稿日時: 2004-10-13 15:04
新米
居住地:
投稿: 16
使用環境:
WinXP
Flash MX2004pro
Re: 比較演算子の記述の仕方
MC1_1 = ((1<=MC1No) && (MC1No<=6));

あっなるほどこのように書くんですね。

引用:
さらに、今回の処理限定でしたら、ステートメント1行で済みます。 なお、範囲外の値(0以下または31以上)判定は、考慮していません。
trace("エリア"+Math.floor((MC1No+1)/8+1));

うわ、確かにこの1行で済んでしまいますね
「trace」の部分をgotoAndPlayに変えて少し手を加えれば
判定結果を表示させるフレームに飛ばせることもできますね。

この1行の中に「8」という数字が出てきますが
この「8」という数字はどのようにして導きだした
数字になるんでしょうか?

永井さん、野中さんのご指摘のおかげで少し前進すること
ができました。それで昨日あれから自分なりに
手を加てみました。

「MC1」だけだと判定結果が4つだけなので「MC2」を加えて
MC1とはフレーム数を変えて判定結果を16通り出せる
ようにしてみました。自分の思ったとおりに動作してくれてる
みたいですが条件分岐のスクリプトを書いてるとき多少混乱
しながら書きました。これが32通りとかになると悪寒が...

とても長い文になってしまいしたので引用するのはご迷惑かと思い
http://www.eurus.dti.ne.jp/~hideroku/hantei.html
にアップしときました。よかったら見てやってください。
野中文雄
Åê¹ÆNo.11495
投稿日時: 2004-10-13 21:42
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 比較演算子の記述の仕方
7?14、15?22、23?30は、いずれも長さが8フレームです。したがって、8で切り分けることができます。
引用:
hiderokuさんは書きました:
「MC1」のフレーム1?6の時は「エリア1」へ
「MC1」のフレーム7?14の時は「エリア2」へ
「MC1」のフレーム15?22の時は「エリア3」へ
「MC1」のフレーム23?30の時は「エリア4」へ

引用:
hiderokuさんは書きました:
trace("エリア"+Math.floor((MC1No+1)/8+1));

...[中略]...
この1行の中に「8」という数字が出てきますが
この「8」という数字はどのようにして導きだした
数字になるんでしょうか?

全体に1を加算(MC1No+1)すると、8で割った商(Math.floor((MC1No+1)/8)がエリア単位で等しくなります。商は、0?3になるので、1を加算すれば、求めるエリアの値です。
Math.floor((MC1No+1)/8+1


----------------
 

hideroku
Åê¹ÆNo.11496
投稿日時: 2004-10-13 23:01
新米
居住地:
投稿: 16
使用環境:
WinXP
Flash MX2004pro
Re: 比較演算子の記述の仕方
引用:

野中文雄さんは書きました:
7?14、15?22、23?30は、いずれも長さが8フレームです。したがって、8で切り分けることができます。

あっやはり8フレームってことだったんですね。
エリア1の時は1?6フレームだったので違うのかな?
って思っていました。

引用:
全体に1を加算(MC1No+1)すると、8で割った商(Math.floor((MC1No+1)/8)がエリア単位で等しくなります。商は、0?3になるので、1を加算すれば、求めるエリアの値です。

う?ん確かにそうですね

10フレームで割り振った場合だとMath.floor()ではなくMath.ceil()を使って
Math.ceil(MC1No/10)

にすると求めるエリアの値になったりしますね。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops