- 締切済み
ユーザー定義関数が呼び出せない
Flash初心者です。勉強のため15Puzzleというゲームを作っていますが、駒を2次元配列に初期化する関数が実行できなくて困っています。 フレームは一つしかなく、そこに以下(↓)のような関数を書いています。 ==================================== trace("Ready"); function FuncPieceSet() { trace("in-Func"); for (column=1; column<=4; column++) { Arrr[column] = new Array(); for (row=1; row<=4; row++) { Arr[column][row] = new Array(); } } p_cnt = 1; for (column=1; column<=4; column++) { for (row=1; row<=4; row++, p_cnt++) { Arr[column][row] = p_cnt; trace(Arr[column][row]); } } Board = ""; for (column=1; column<=4; column++) { for (row=1; row<=4; row++) { Board += Arr[column][row]+","; } Board += newline; } trace(Board); } _root.onEnterFrame = FuncPieceSet(); this.stop; ==================END================== 一フレーム目にボタンを15個配置し、その一つに on (release) { trace("buttonClick"); _root.FuncPieceSet(); } と書いたら、buttonClickという文字も出力されませんでした。 また、当然ながら、Readyという文字は表示されますが、in-Funcという文字は出力されませんでした。 後は、併せて、2次元配列の宣言の仕方も教えていただきたいです。 Boardという変数は、(カンマはいるかどうかは後で考えるとして) 01020304 05060708 09101112 13141516 のように、盤面をイメージしやすいように作っています。(棋譜機能および現在の盤面は、解けるかどうか自動解析機能もつけたいと思っています。)同じ盤面が複数あった場合、その間の無駄な移動を棋譜から削除する機能をつけようかと思っています。 CS3 , AS2.0です。面白みのない質問ですみません。 今週中に作りたいので、また、ほかの部分で質問するかもしれませんが、自分で考えながらコーディングをしたいと思っています。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1&2 です。 > 1,2,3,4, > 5,6,7,8, > 9,10,11,12, > 13,14,15,16, > > との結果を得たいです。 そうする意味(メリット)もさっぱりわかりませんが, それはさておき, そう書かれていらっしゃる意味が全くわかりません。 ボタンには -------------------------------------- on (release) { _root.FuncPieceSet(); } -------------------------------------- と書いておいて, フレームには次のように書けば良いだけではないでしょうか??????? ---------------------------------------------------- Arr = new Array(); for (column=0; column<=3; column++) { Arr[column] = new Array(); } function FuncPieceSet() { p_cnt = 1; for (column=0; column<=3; column++) { for (row=0; row<=3; row++, p_cnt++) { Arr[column][row] = p_cnt; } } // ↓書かれていらっしゃる通りを記述↓ Board = ""; for (column=0; column<=3; column++) { for (row=0; row<=3; row++) { Board += Arr[column][row]+","; } Board += newline; } // ↑書かれていらっしゃる通りを記述↑ trace(Board); } ---------------------------------------------------- つまり, 何が疑問かさっぱりわかりません。 答えはご自身で書かれていらっしゃいます。 「パンにジャムをはさみましたがうまく行きません。 パンにジャムをはさんでジャムパンを作りたいです。」 と書かれていらっしゃるようにしか見えません。 ジャムパンを作りたいのでしたらジャムをパンにはさめば良いのでは??? それ以外答えようがないというか, こたえはちゃんとご質問(#2の補足)に書いてあるというか...。 さっぱりわかりませんね。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1です。 > どうしてもFor文を使ってスマートに書きたいんです。 > 教えていただければ幸いです。 どうしたいのかが今ひとつわかりませんが, こんな感じでしょうか↓? ---フレーム1------------------------------------------- Arr = new Array(); for (column=0; column<=3; column++) { Arr[column] = new Array(); } function FuncPieceSet() { p_cnt = 1; for (column=0; column<=3; column++) { for (row=0; row<=3; row++, p_cnt++) { Arr[column][row] = p_cnt; } trace(Arr[column]); } } ------------------------------------------------------
お礼
完成しました。どうもありがとうございました。 (関数が呼び出せないかの様に見えた原因は、#3の補足とお礼を見てください。) 締め切ります。
補足
私の期待していた答えでした。ありがとうございます! 今回の問題は、ユーザー関数が呼び出せないというより、 配列の定義がめちゃくちゃだったり、改行の部分がおかしいのが、 原因でした(だと思います)。配列の定義方法は分かりました。 ただ、後一箇所悪いところがあります。 Board += newline; ↑改行をしなければ、うまくいくのですが…。 Board = ""; for (column=0; column<=3; column++) { for (row=0; row<=3; row++) { Board += Arr[column][row] +","; } Board += newline; } Boardは、棋譜を作るときをテキストファイルを(非効率ですが、)一盤面ずつ、追加していく時に使う文字型変数です。 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16, との結果を得たいです。 実際のピースの状態をみれば、すむ話ですが、教えてくださると嬉しいです。 (ご指摘通り、一気に作りたがるのは、私の悪い癖ですυすみません)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
一番重傷な点はここですね。 > 一フレーム目にボタンを15個配置し、その一つに > on (release) { > trace("buttonClick"); > _root.FuncPieceSet(); > } > と書いたら、buttonClickという文字も出力されませんでした。 ガクッ... は?? です。 これもできない状態でどんどん先を進めているのでしょうか? 1つ1つの部品を着実にクリアしていかないとグジャグジャなものができるだけです。 また何が原因で無事動作しないのかもわからなくなります。 「問題を切り分ける」 これが最も基本的に重要なことです。 質問するときもそうですが, それ以前に作っている最中からいつも常に問題を切り分けて1つずつ克服しないと。 最初からです。 次のようにしてみてください。 ~・~・~・~・~・~・~・~・~・~・~・~・~ Flash を起動させて, ActionScript2.0 の新規ドキュメントを作成します。 パブリッシュ設定で ActionScript2.0 になっているかどうかを確かめます。 ステージ上に四角い塗りを1つだけ作成します。 その四角い塗りを選択して「修正」→「シンボルに変換」で 「ボタン」にチェックを入れて「OK」し,ボタンインスタンスにします。 "ステージ上のボタンを選択した状態" でアクションパネルを表示させて, そこに on (release) { trace("buttonClick"); _root.FuncPieceSet(); } を記入(↑これをコピペ)します。 「制御」→「ムービープレビュー」を選択してプレビューします。 プレビュー表示された画面にある作成したボタンをクリックします。 すると buttonClick が出力窓に出力されるはずです。 ~・~・~・~・~・~・~・~・~・~・~・~ 上の ~・~・~ 内のことをしてみて, 出力窓に buttonClick は表示されますしょうか? もし表示されたのでしたら, 質問者さんがされた手順と私が上で書いた手順に違う箇所があると思います。 そこが原因です。 原因は1箇所とは限りません。全ての原因を探ります。 「問題を切り分けて1つずつ克服」 です。 上の ~・~・~ 内のことをしてみて, 出力窓に buttonClick は表示されなかった場合は, Flash が壊れているのかもしれません。 原因はよくわかりませんが, Flash を アンインストール→再インストール することなども考えた方が良いでしょう。 ========================= 上記の「ボタンの件」 と,「関数の実行」と,「配列」 とは全く別物です。 一緒くたにして解決することなど誰にもできません。 「問題を切り分けて1つずつ克服」 です。 上の ~・~・~ 内のことをしてみて, とりあえず buttonClick 出力された場合は, 次のステップ「関数の実行」に進みます。 上の ~・~・~ 内ではステージ上にボタンを1つ作成しただけですから, タイムラインは 1レイヤー 1フレーム だけのはずです。 ~**~**~**~**~**~**~**~**~ ActionScript用にレイヤーを1つ追加(挿入)します。 つまり 2レイヤー 1フレーム にします。 新しく作った方のレイヤーの空白キーフレーム(○印フレーム)を選択し, その状態でアクションパネルを表示させて, そこに function FuncPieceSet() { trace("in-Func"); } を記入(↑これをコピペ)します 【図↓】。 「制御」→「ムービープレビュー」を選択してプレビューします。 プレビュー表示された画面にある作成したボタンをクリックします。 すると buttonClick in-Func が出力窓に出力されるはずです。 ~**~**~**~**~**~**~**~**~ ここまでで出力確認ができれば, 「ボタンの件」 と 「関数の実行」 との2件がクリアされたことになります。 つまり ご質問の題名「ユーザー定義関数が呼び出せない」はクリアされるはずです。 ========================= 配列の部分は何をしようとされているのかよくわからないので何とも言えません。 少なくとも上記まで書いたことができるかどうかが最低ラインでしょう。 配列の部分は何をしようとされているのかよくわかりませんが, > Arr[column][row] = new Array(); これが変だと思います。 Arr[column][row] は 配列Arr の「数要素」ではないでしょうか? Arr[column][row] = new Array(); これだと 「配列Arr[column][row] を作成する」 というような意味になります。 「配列の要素をさらに配列にする」というような意味です。 また Arrr[column] = new Array(); これの Arrr と Arr もズレてますね。 多分 「Arr」という名の配列を "function外" で作成しておいて↓, Arr = new Array(); function内で各要素に何かの数値を入れて行くようにすれば良いのではないでしょうか? 上の ~**~**~ 内で書いたフレームのスクリプトを, 次のように変更してみるなどです。 -------------------------------- Arr = new Array(); Arr[0] = new Array(); Arr[1] = new Array(); function FuncPieceSet() { Arr[0][0] = 1; Arr[1][0] = 2; Arr[0][1] = 3; Arr[1][1] = 4; trace(Arr[0][0]+","+Arr[1][0]); trace(Arr[0][1]+","+Arr[1][1]); } -------------------------------- とりあえず for文 などは抜きです。 「問題を切り分けて1つずつ克服」 です。 onEnterFrame の使用などまだまだ先の話です。 そもそもなぜ onEnterFrame が出てくるのかもわかりません。 それに, onEnterFrame も書き方が間違っています。 _root.onEnterFrame = FuncPieceSet; です。 最後に () を付けてはいけません。 しかし, 仮に () を取って onEnterFrame を正常に動かしたとしても, traceの山になるだけですよ。 山のような出力結果を見てさらに問題点がわからなくなるだけです。 ========================= うまく行かない第一原因は, 「ActionScript に不馴れ」 や 「知識不足」 や 「プログラミング能力」 ではなく, 取り組む姿勢(方針)にあります。 先は長そうですが, 長ければ長いほど,とにかく 「問題を切り分けて1つずつ克服」 です。 ◎参考URL 野中文雄さんの 「番外編 - 質問NGワード集 - テクニカルノート」 より 【*一度にすべてをやろうとする】 http://www.fumiononaka.com/TechNotes/NGWords.html#I 【*問題を切分けない】 & 【*問題を単純化(シンプルに)しない】 http://www.fumiononaka.com/TechNotes/NGWords.html#Mo
お礼
図解までしていただき、ありがとうございました。 これからは、「問題を切り分ける」様に心がけますので、 また、教えていただく機会があれば、その際は、よろしくお願いします。m(_ _)m
補足
ご回答ありがとうございます。 >これの Arrr と Arr もズレてますね。 タイプミスで、質問してしまい申し訳ありません。 (後、補足ですが、ボタン=ピースと考えてください。) ボタンインスタンスの作成は、うまくいっています。 _root.FuncPieceSet(); をはずすと、もちろん、buttonClickという文字 が 出力ウィンドウにでます。 on (release) { trace("buttonClick"); //_root.FuncPieceSet(); } 関数を実行すると、buttonClick という文字がでなくなるんです(汗) これは、FuncPieceSetという関数が実行されていないと思い、ボタンのクリック時に試験的に(強制的に)実行させたかったです。 回答者様がおっしゃるように、コーディングには(姿勢:方針ですね)自信がありませんでした。すみません。 ただ、関数の中にかいた試験的に in-Func という文字の表示を期待し、出なかったので、フレームが読み込まれた(onEnterFrameの)時にこれまた試験的に書いたのです。 意味不明なプログラムでしたね。 === 以下、回答者様のやり方と違っていた部分 ===== パブリッシュ設定が ActionScript2.0 にはなっていましたが、Flash Lite 2.0になっていました。Flash Player 9 にして、パブリッシュしました。 2レイヤー(背景とボタン部分) 1フレーム でしたが、ボタンレイヤーに アクションスクリプト を書いていたので……背景レイヤーを削除して、 ボタンがあるレイヤー と アクションスクリプトがあるレイヤーを別にしました。( 2レイヤー 1フレームにしました) 背景レイヤーは、マウスのX,Yの座標を取得するためにダミーのMCを作成したのですが、正常にでたのですが……ボタンをクリックしたときに、ピースが動く方法に変えて、不要となりました。 (削除しました。) //_root.onEnterFrame = FuncPieceSet; として、以上の修正を行いました。 ===================== 結論 ===================== 関数の外で配列を宣言して、 function FuncPieceSet() { Arr[0][0] = 1; Arr[1][0] = 2; Arr[0][1] = 3; Arr[1][1] = 4; trace(Arr[0][0]+","+Arr[1][0]); trace(Arr[0][1]+","+Arr[1][1]); } にしたら、ちゃんとでました。 出力結果 Ready buttonClick in-Func 1,2 3,4 とでました。 配列に値を代入するところなどが悪さをして、正常に動かなかったみたいです。 ================================================ まずは、縦4、横4にピースを1~15まで順番に並んだ状態で、ピースのボタンを1から16(16は何もピースがおかれていない状態を現します)を入れて、ボタンを動かさずとも、変数上でシュミレーションできるように作りました。 Boardの方は、デバッグ用です。(気にしないでください。) 大変申し訳ありませんが、4×4の配列 1 2 3 4 1 2 3 4 というように、添え字を直感的にイメージできるように 宣言するにはどうしたらいいのでしょうか。 (縦の添え字 1~4 ,横の添え字1~4で) どうしてもFor文を使ってスマートに書きたいんです。 教えていただければ幸いです。
お礼
Flash Player 9 でパブリッシュしたものでは、traceできない理由は分かりませんが、Flash Lite 2.0では、違う出力窓を見ていました(汗) 「制御」→「ムービープレビュー」を押すと、Adobe Device Central CS3 というプログラムが立ち上がるので、そのソフトの「表示」→「Flash出力」→「表示」(またはCtrlキーを押しながらTを押す事)で、traceした出力が見れます。 Adobe Flash CS3 Professional の方の出力窓(「ウィンドウ」→「出力」(F2) )の方にはでない事を知りませんでした。回答者様、情報が入り乱れて申し訳ありません。質問のタイトルは、「Flash Liteで製作時、デバッグ用の出力ウィンドウ(出力窓)を見るには?」とでもしたら、良かったですね。
補足
アクションスクリプトは2.0のままで、パブリッシュ設定を Flash Player 7 にして、パブリッシュして、ムービープレビューで確認した所、なんなく目的の結果が得られました。(Flash Lite 2.0及びFlash Player 9 でパブリッシュしたものでは、traceできませんでした。) 以前、Flash MX 2004 (WindowsXP) を使っていて、最初は新しく買ったVistaPCでも使えると思い2004をインストールしましたが、メニューを選択するときに、マウスがぶれるとすぐにフリーズしてしまう&プログラムをクリックしても、5回に1回しか起動しないので、しかたなく、CS3のアップデート版をインストールしました。 CS3にする前に、2004でのライセンスの移行が問題かと思い、何回もしていたら、Flash MX 2004 をアンインストールできなくなりました。今も、プログラムは残っています。 (ただし、「試用期間が終了しました」とのメッセージがでて、動かない状態です。)(無謀ですが、さっき、2004のプログラムがあるフォルダを一時的にゴミ箱に移しましたが、結果は変わりません。) たしか、Flash MX 2004 では、 Flash Player 7 で作っていたと記憶してます。 最終的には、(Flash Lite 2.0に対応した)携帯で、15Puzzleをできるようにしようと思っていますが、traceができないだけか?、それとも不可能なのでしょうか・・・ Flash (CS3)の ヘルプ→アップデート では、最新版ですとでて、更新されませんでした。 やはり、Flashが部分的に壊れている(モジュールが古い?)のでしょうか? 2004で作った物を、Flash Lite 2.0 、Flash Player 7、で、CS3で再度パブリッシュして、更新したもの や 新たにFlash Lite 1.0やFlash Lite 2.0 で作った物は、正常に動いています。 私個人の環境に依存するものなら、答えようがないかもしれませんが、できればご教授くださるとありがたいです。