性格悪い人が優勝

こんにちは、現在FLASHの勉強しております。
以下のような簡単なクイズゲームを作ってみようと思いましたが分からない事があるので質問させていただきますね。
問題はMySQLから読み出す
ユーザに答えをFLASHの画面上から入力させる
そして答え合わせのボタンを押したとき入力された
文字列がMySQLに保存されている答えの文字列と一致した時、正解のフレームへ飛ばしてやり間違っていたなら不正解のフレームに飛ばしてやりたいと考えております
現在MySQLから問題文や答えの値を読み出す事には成功しております
FLASHでの文字入力も以下のソースで出来ているはず・・

onClipEvent (load) {
output = "";
}
onClipEvent (keyDown) {
output =output+String.fromCharCode(Key.getAscii()).toUpperCase();}

上記の文でoutputという変数に入力された文字を入れて
いるはずです。
そして解答ボタンのソースは以下の通りです

on (release) {
if(kotae==output){
this.gotoAndStop("sei");}
else{this.gotoAndStop("huse");}
}

kotaeという変数に正解の答えが入っています
さきほどのユーザが入力した変数outputと比べて
同じならseiという正解のページへ 間違いならhuseというページへ行ってくれると思っていたのですが
どうもうまくいきません、どう入力しても不正解のページしかいきませんでした。
どなたか分かる方おられましたら宜しくお願い致します

A 回答 (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 だと思います。
その切り替え部分は,イマイチどうされるのかわからないので,省略させていただきます。
    • good
    • 0
この回答へのお礼

教えていただいた通りにしたところ無事に出来ました
このたびは語定年にお答えしていただき誠にありがとうございます。
教えていただいただけでなくとても勉強にもなりました。
本当にありがとうございました

お礼日時:2005/12/22 20:21

#1&2 です。



申し訳ございません。
気づいたときには…・・・
見たかったのはやまやまなのですが…・・・
メールも肝心な部分は見えなくて…・・・ ・ ・

急いで何処かに残っていないかと,検索をかけまくりましたが,
Googleキャッシュ も YAHOO!キャッシュも その他キャッシュも全滅。

唯一,MSNであるにはありましたが…

http://beta.search.msn.co.jp/results.aspx?cp=932 …
http://search.msn.co.jp/results.aspx?v=1&RS=CHEC …

つまり,該当はこれですが…

http://cc.msnscache.com/cache.aspx?q=27616160681 …
http://cc.msnscache.com/cache.aspx?q=27598253287 …
http://cc.msnscache.com/cache.aspx?q=27609231108 …

つまり,見ることができませんでした m(_ _"m) 。
    • good
    • 0
この回答へのお礼

なぜ消えてしまったのでしょうか? URLはだめなのでしょうか・・・ 一応もう一度張っておきますね
今回は頭を削っておきますのでご了承ください。
://page.freett.com/ajisiotarou/output.txt
://page.freett.com/ajisiotarou/tes.fla

お礼日時:2005/12/21 11:13

#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 ターゲットパス」

参考URL:http://f-site.org/articles/2002/01/26153958.html
    • good
    • 0
この回答へのお礼

これでもかと言うほどの解説誠にありがとうございます
ここで一回私が作ったFLASHを見てもらえませんか?
入力文字の表示などは出来るようになったのですがまだまだ不具合が多いです
入力されている文字列を表示させるのにはテキストフィールドをいったんクリックしないと出ません
しかし実際にはキーを入力した時点で文字が入力されてしまっています
あと日本語を入力しても変数に入ってくれません

お礼日時:2005/12/20 10:25

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 に読み込んだのではないだろうかという推測からです。

もし解決しなかったとしても,
スクリプトは間違っているように見えないので,
後はパスの注意だと思います。

この回答への補足

申し訳ないです・・先ほどの文で呼びつけにしちゃっています  誠に申し訳ございませんでした

補足日時:2005/12/16 10:46
    • good
    • 0
この回答へのお礼

ご返事いただき感謝いたします。
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を付ける前まではちゃんと表示されておりました。
これも階層が影響しているのでしょうか?

お礼日時:2005/12/16 10:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!