- ベストアンサー
キーボードを押した時のムービークリップの動きについて
- キーボードを押した時のムービークリップの動きについて
- キーボードの十字キーを押すことでキャラクターを移動させ、同時にムービークリップ内の任意のフレームに飛ばしてアニメーションを再生させたい。
- キャラクターを移動させると同時に、キャラクターのアニメーションを再生させる方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ActionScript 記述の問題ではなくしくみの問題だと思います。 スクリプトはそのままで良いと言えばそのままで良いですよ。 ただ hito.gotoAndPlay("walk"); ではなく hito.gotoAndStop("walk"); の方が良いとは思います(と言ってもこれも一案です)。 Flash の話ではなく PCやOSとキーボードの仕様の話ですが 例えば「→」キーを押したとします。 「→」キーを チョン と1回押した場合 『「→」が押された』 という信号が起動中のアプリケーションなどに伝えられます。 ところが 「→」キーを押し続けると 『「→」が押された』 『〃』 『〃』 『〃』 … と パルス波 でアプリケーションなどに伝えられます。 (そういう仕様のPCが多いです。それも不規則です。) そうなると hito.gotoAndPlay("walk"); の場合 『「→」が押されました』 がパルスでやって来る度に 「walk」 フレーム に戻って再生開始されてしまいます。 つまり 「walk」フレームで止まる か 頻繁に戻ってギクシャク します。 そうなるならいっそのこと hito.gotoAndStop("walk"); で 「walk」 フレームでキッチリ止めておいて その 「walk」 フレーム に 「人が腕や脚などを動かすアニメ」 入りのムービークリップを置いた方が良いということです。 例えば 【下の図↓】 のように hito 内のタイムラインを作ったとします。 その場合のスクリプト例↓ ------------------ //hito内タイムラインの再生を停止 hito.stop(); //キーダウンしたとき stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown); //キーダウンしたときに実行する関数を定義 function handleKeyDown(e:KeyboardEvent):void { if (e.keyCode == Keyboard.RIGHT) { //hito内タイムラインをR_walkフレームで停止 hito.gotoAndStop("R_walk"); //hito内の変数 move_x を 3 にする hito.move_x = 3; //毎フレーム実行 hito.addEventListener(Event.ENTER_FRAME, hitoMove); } else if (e.keyCode == Keyboard.LEFT) { hito.gotoAndStop("L_walk"); hito.move_x = -3; hito.addEventListener(Event.ENTER_FRAME, hitoMove); } } //hitoを移動させる関数を定義 function hitoMove(e:Event):void { //hito内の変数 move_x ずつ移動 e.target.x += e.target.move_x; } //キーアップしたとき stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp); //キーアップしたときに実行する関数を定義 function handleKeyUp(e:KeyboardEvent):void { hito.gotoAndStop("No_walk"); hito.removeEventListener(Event.ENTER_FRAME, hitoMove); } ------------------ ※スクリプトは若干変更してますが それはどうでも良いことです。 本題はスクリプトではなく 「どのようなしくみを作ってどう動かすか」 の部分です。 説明のためのイメージ図↓
お礼
キーボードのお話から、スクリプトの方はコメントも細かく交えて説明くださったので、 とても理解しやすかったです。ご説明の丁寧さが、心から有難いです。 フレームが移動しないことを解消するためには、中にムービークリップを入れ子にして あげればよかったんですね。なるほど! 更に「gotoAndStop」のアドバイスも勉強になりました。 今までは、StopもPlayもどっちでもいいか、という認識で両方を乱用していたので 自分の適当さに反省です…;その時々に合わせた綺麗な記述の仕方を心がけたいです。 そしてインスタンスを移動させる記述ですが、 「hito.move_x = 3;」のようにインスタンスに直接変数を設定して、 「e.target.x += e.target.move_x;」というようにtargetを使った変数の記述の仕方は まったく知識になかったやり方なので、大変勉強になりました。 恥ずかしながら「target」と「currentTarget」の違いも分からないレベルだったんです。 まだまだ知識が浅すぎて、おかしなことを言っていた部分もあったかもしれませんが それにも関わらず、丁寧なご回答ありがとうございました!