- ベストアンサー
FLASHで文字入力て判定させる
- FLASHで文字入力て判定させる方法について質問です。
- MySQLから問題文や答えの値を読み出し、ユーザに答えをFLASHの画面上から入力させます。
- 正解の答えとユーザが入力した文字列を比較し、正解のページへ遷移するか不正解のページへ遷移するか判定したいです。しかし、うまくいきません。どなたか分かる方おられましたらお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
わかりました。 やっぱりパスの間違いです。 最小限でとどめる修正を書きます。 まず, 「最初の文字」と書いてある,ムービークリップ textclip のスクリプトの _root を this に修正してください。 ////////////////////////////////////////////////////////////////////// onClipEvent (load) { this.output = ""; function textdelete(){ this.output=""; } } onClipEvent (keyDown) { this.output =this.output+String.fromCharCode(Key.getAscii()).toUpperCase(); } ////////////////////////////////////////////////////////////////////// 次に,「解答」ボタンの,if文の中の if(kotae==output){ の部分を if(kotae==_root.textclip.output){ に修正してください。 ////////////////////////////////////////////////////////////////////// on (release) { kotae="HOOO"; trace("output="+output); trace("kotae="+kotae); if(kotae==_root.textclip.output){ this.gotoAndStop("sei"); } else{ this.gotoAndStop("huse");} } ////////////////////////////////////////////////////////////////////// output は, _root の textclip内の 変数output です。 これで,_root の kotae="HOOO" と,変数 _root.textclip.output を比べることができるので, HOOO とキーを打つと,「正解」フレームに行けます。 なぜか, 消去ボタンの ///////////////////////////////////////////////////// on(release){ //テキストボックスのインスタンスに記述されてるdelete()関数呼び出し _root.textclip.textdelete(); } ///////////////////////////////////////////////////// は,パスが合っています。 パスは合っていますが,他のスクリプトとの表記のゆれを無くすためには, ///////////////////////////// on(release){ _root.textclip.output =""; } ///////////////////////////// の方が良いとは思いますが,今のままでもOKです。 フレーム1 で ///////////////////////////// System.useCodepage = true; loadVariablesNum("output.txt", 0); ///////////////////////////// として,レベル0 に output.txt を読み込んでいらっしゃいますよね。 だから, 変数cat_1~cat_3 及び 変数url_1~4 は _root に読み込まれます。 用意されたFLAファイルは,kotae="HOOO"; で固定になっていますが, 実際には _root の cat_1~cat_3 及び url_1~4 の値と, _root.textclip.output の値を比較するようにすれば OK だと思います。 その切り替え部分は,イマイチどうされるのかわからないので,省略させていただきます。
その他の回答 (3)
#1&2 です。 申し訳ございません。 気づいたときには…・・・ 見たかったのはやまやまなのですが…・・・ メールも肝心な部分は見えなくて…・・・ ・ ・ 急いで何処かに残っていないかと,検索をかけまくりましたが, Googleキャッシュ も YAHOO!キャッシュも その他キャッシュも全滅。 唯一,MSNであるにはありましたが… http://beta.search.msn.co.jp/results.aspx?cp=932&q=q%3D1840591 http://search.msn.co.jp/results.aspx?v=1&RS=CHECKED&CY=ja&FORM=MSNH&q=q%3D1840591 つまり,該当はこれですが… http://cc.msnscache.com/cache.aspx?q=2761616068173&lang=ja-JP&mkt=ja-JP&FORM=CVRE http://cc.msnscache.com/cache.aspx?q=2759825328779&lang=ja-JP&mkt=ja-JP&FORM=CVRE2 http://cc.msnscache.com/cache.aspx?q=2760923110879&lang=ja-JP&mkt=ja-JP&FORM=CVRE4 つまり,見ることができませんでした m(_ _"m) 。
お礼
なぜ消えてしまったのでしょうか? URLはだめなのでしょうか・・・ 一応もう一度張っておきますね 今回は頭を削っておきますのでご了承ください。 ://page.freett.com/ajisiotarou/output.txt ://page.freett.com/ajisiotarou/tes.fla
#1です。 >> 呼びつけにしちゃっています いえいえ,良いんですよ。書かれるのを見て気付きました。 もともと kun まで付いていますし,何でも良いのです。 えーと,書かれているスクリプトですが, ムービーがどういう構造になっていて, どこに 変数kotae が格納されたのかがわからないため, 正確には答えられませんが, --------------------------------- onClipEvent (load) { output = ""; function textdelete(){ output=""; }} onClipEvent (keyDown) { _root.output = _root.output+String.fromCharCode(Key.getAscii()).toUpperCase();} --------------------------------- この時点で,すでにおかしいと思いますよ。 スクリプトを図示すると以下のような感じです。 (どうしても図が壊れますが…) ┌_root─────┐ │┌textclip─┐ │ ││output=""│ │ │└────┘ │ │output=キー入力│ └───────┘ ~最初の2行~ onClipEvent (load) { output = ""; この output = ""; で textclip 内の 変数output の値が ””(空) になります。 ~最後の2行~ onClipEvent (keyDown) { _root.output = _root.output+S~ この _root.output = _root.output+S~ で _root の 変数output の値が 「キー入力した値」 になります。 >> 今までは入力した文字列が >> FLASHの画面上に表示されておりました >> ムービークリップでインスタンス名はtextclipとしております。 これで,ここの部分の構造は理解できました。 extclip というインスタンス名のムービークリップがあって, そこに,上記スクリプトを書いて, そのムービークリップ内に output という変数名のテキストフィールドを置いていたということになります。 でも,スクリプトが _root.output = _root.output+S~ になったので,_root の 変数output にキー入力の値が入るようになったため, のムービークリップ内に output という変数名のテキストフィールドには 「キー入力した値」 が入らなくなったということです。 output という変数名のテキストフィールドを, ムービークリップの中から外にコピペすると,キー入力した値が一応は入ると思います。 FlashMX以前をお使いでしたら, テキストフィールド = 「キー入力した値」 FlashMX2004以降をお使いでFlashPlayer7以降にパブリッシュした場合でしたら, テキストフィールド = undefined+「キー入力した値」 になると思います。 問題は, 「どこにある 変数output」 と,「どこにある 変数kotae」 を比べようとしているかということです。 階層と言う言葉を使いますが, 階層とはフォルダ(ディレクトリ)のようなものです。 ムービークリップはムービー内のフォルダという感じに思うと理解しやすいと思います。 どこに変数(変数を含むファイル)をロードしたのか どこにムービークリップtextclipはあるのか どこに判定ボタンがあるのか この3つを正確に把握して,パスを確認してみてください。 ~~~ 余談だと思いますが… ~~~ 昔話をしても意味がないかもしれませんが, Flashのスクリプトが,まだActionScriptと呼ばれる前, ----------------------- on (release) { if(kotae == output){ this.gotoAndStop("sei");} else{this.gotoAndStop("huse");} } ----------------------- これが,_root の kotae と output を比較して, _root のフレームを "sei" もしくは "huse" に行かせるスクリプトを書いた _root に置かれた,ボタンであるとするならば, 以前はこんなでした↓。 ----------------------- On (Release) If (kotae eq output) Go to and Stop ("sei") Else Go to and Stop ("huse") End If End On ----------------------- そんなに大差はないです。 しかし, これが _root の kotae と output を比較して, ムービークリップextclip のフレームを "sei" もしくは "huse" に行かせるスクリプトを書いた _root に置かれたボタンのスクリプトであるとするならば, 以前はこんなです↓。 ----------------------- On (Release) If (kotae eq output) Begin Tell Target ("/extclip") Go to and Stop ("sei") End Tell Target Else Begin Tell Target ("/extclip") Go to and Stop ("huse") End Tell Target End If End On ----------------------- 「Tell Target」 今はほとんど使用禁止ですが, いちいちムービークリップに向かって Tell Target (ターゲットに命令)しないと, ムービークリップは言うことを聞きませんでしたし, また,ちゃんとスクリプトを完成させるまでは,エラーが出てアクションパネルが閉じれませんでした。 だから,逆にパスを間違えるということはほとんどありませんでした。 また,ムービークリップという物はたいそうエライ,1つのWorldを持った特別な存在でした。 そういう観念が今でも残っていて,パスを間違うということは個人的にはほとんどないのですが, ムービークリップの存在が希薄になって,その上, Tell Target なんか使わず, クラス替えをするだけでムービークリップが動かせるようになってからは, スクリプトが簡単になった分,理解がしにくいのかなとは思います。 パスのミスやパスの不理解で,うまく行かない方が多くなったようです。 ~~~ 余談終わり ~~~ 勝手にパスだと決めつけていますが, 外部ファイルのロードができていて, スクリプトは正しくて, if判定ができないのは,パスではないかと思います。 判断材料が乏しいので,パスかどうかはわかりませんが, 一応確認してみてください。 読むと余計ややこしくなるかもしれませんが,一応参考URL。 「F-site ターゲットパス」
お礼
これでもかと言うほどの解説誠にありがとうございます ここで一回私が作ったFLASHを見てもらえませんか? 入力文字の表示などは出来るようになったのですがまだまだ不具合が多いです 入力されている文字列を表示させるのにはテキストフィールドをいったんクリックしないと出ません しかし実際にはキーを入力した時点で文字が入力されてしまっています あと日本語を入力しても変数に入ってくれません
MySQL に関しては全く無知な者です。 Flash側だけ考えたとき,おそらくパスの間違いでしょう。 変数output のある場所です。 上の方のスクリプトは onClipEvent から始まっているのですから, ムービークリップシンボルに書いたものですよね。 ムービークリップは階層を持つオブジェクトで, そのオブジェクトの中に 変数output とその値が格納されます。 output を ムービークリップから出したい場合は _root というパスを加えて, ---------------------------------- onClipEvent (load) { _root.output = ""; } onClipEvent (keyDown) { _root.output = _root.output+String.fromCharCode(Key.getAscii()).toUpperCase(); } ---------------------------------- にすると解決すると思います。 また,_root.output 用いず, output のままで行く場合は, このムービークリップにインスタンス名を付けてください。 例えば key_MC というインスタンス名にしておきます。 そして,ボタンの方のスクリプトを ------------------------------- on (release) { if (kotae == _root.key_MC.output) { this.gotoAndStop("sei"); } else { this.gotoAndStop("huse"); } } ------------------------------- にすると解決すると思います。 ボタンは階層を持たないオブジェクトです。 ムービークリップとボタンはここが決定的に違います。 以上の2例は,ムービークリップも,ボタンも,両方とも独立していて, 両方とも メインムービーのタイムライン(_root) にあると想定した場合です。 結局,変数kotae をどこに読み込んだかが問題で, おそらく _root に読み込んだのではないだろうかという推測からです。 もし解決しなかったとしても, スクリプトは間違っているように見えないので, 後はパスの注意だと思います。
お礼
ご返事いただき感謝いたします。 sassakunの教えていただいたとおりにしてみたところ onClipEvent (load) { output = ""; function textdelete(){ output=""; }} onClipEvent (keyDown) { _root.output = _root.output+String.fromCharCode(Key.getAscii()).toUpperCase();} といった形にしたところ trace("output="+output); trace("kotae="+kotae); を答えがあっているか判定するIF文に書いて確かめた所 入力された値が入っておりました。 しかし、今までは入力した文字列がFLASHの画面上に 表示されておりました ムービークリップでインスタンス名はtextclipとしております。 _rootを付ける前まではちゃんと表示されておりました。 これも階層が影響しているのでしょうか?
補足
申し訳ないです・・先ほどの文で呼びつけにしちゃっています 誠に申し訳ございませんでした
お礼
教えていただいた通りにしたところ無事に出来ました このたびは語定年にお答えしていただき誠にありがとうございます。 教えていただいただけでなくとても勉強にもなりました。 本当にありがとうございました