プロが教える店舗&オフィスのセキュリティ対策術

キーボードを押した時のムービークリップの動きについて

横スクロールの簡単なFlashゲームを作ろうとしています。
制作環境はWinXP,flashCS4,as3です。

今やりたい事は、キーボードの十字キーを押すことでキャラクターを移動させる、と同時に
キャラクターのムービークリップ内に作ってある任意のフレームに飛ばして
歩いているアニメーションを再生させるということです。

「KeyboardEvent」クラスを使って、function に「インスタンス名.x +=3;」という
記述をすることでインスタンスの移動はできました。
ですが、キーボードを押し続けると、アニメーションの作ってあるフレームが
最初のフレームから動かないため、動きがつきません。

キャラクターを移動させると同時に、キャラクターのアニメーションを再生させて動きを
つけるにはどういう記述の仕方をしたら良いでしょうか?

アドバイスをいただけましたら幸いです。

下記URLが、現在つくっていてうまくいかないものの例です。
http://homepage2.nifty.com/meary/test.html

下記が記述スクリプトです
--------------------------------------------------------
//キーダウンしたとき
stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

//右矢印キーを押すと右に移動、hitoインスタンスはwalkフレームへ
function handleKeyDown(e:KeyboardEvent)
{
if(e.keyCode == Keyboard.RIGHT)
{
hito.x += 3;
hito.gotoAndPlay("walk");
}
}

A 回答 (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);
}
------------------


※スクリプトは若干変更してますが
  それはどうでも良いことです。
  本題はスクリプトではなく
  「どのようなしくみを作ってどう動かすか」
  の部分です。


説明のためのイメージ図↓
「キーボードを押した時のムービークリップの」の回答画像1
    • good
    • 0
この回答へのお礼

キーボードのお話から、スクリプトの方はコメントも細かく交えて説明くださったので、
とても理解しやすかったです。ご説明の丁寧さが、心から有難いです。

フレームが移動しないことを解消するためには、中にムービークリップを入れ子にして
あげればよかったんですね。なるほど!
更に「gotoAndStop」のアドバイスも勉強になりました。
今までは、StopもPlayもどっちでもいいか、という認識で両方を乱用していたので
自分の適当さに反省です…;その時々に合わせた綺麗な記述の仕方を心がけたいです。

そしてインスタンスを移動させる記述ですが、
「hito.move_x = 3;」のようにインスタンスに直接変数を設定して、
「e.target.x += e.target.move_x;」というようにtargetを使った変数の記述の仕方は
まったく知識になかったやり方なので、大変勉強になりました。
恥ずかしながら「target」と「currentTarget」の違いも分からないレベルだったんです。

まだまだ知識が浅すぎて、おかしなことを言っていた部分もあったかもしれませんが
それにも関わらず、丁寧なご回答ありがとうございました!

お礼日時:2010/08/02 23:14

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