- ベストアンサー
Actionscript2.0でドラクエのようなキャラの移動を実現する方法
- Actionscript2.0を使用して、ドラクエのようなキャラの移動を実現する方法を教えてください。
- 自作ゲームでキャラの移動が上手くいかず困っています。主人公の移動に仲間が後を付いてくる、ドラクエのようなキャラ移動を実現したいです。
- 現在の設定ではキャラが重なってしまったり、同じタイミングで同じ方向に移動してしまいます。フィールドがマス目のような状態であれば、移動前の位置に仲間を移動させることもできると考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
次のような方法はいかかでしょうか。 ステージ上に m0,m1,m2,m3 というインスタンス名の4つのムービークリップがあったとします。 m0~m3は直径40pxの円に近い形をしていたとします。 m0~m3があるフレーム(_rootのフレーム)に書くスクリプト例です。 ------------------- //キャラの数を設定(m0~m3の4つの場合) var chara_n = 4; //キャラの直径を設定 var chara_d = 40; //キャラが1フレーム辺りに動くスピードを設定 var chara_s = 5; //x座標とy座標を入れる配列を作成 var xArr = new Array(); var yArr = new Array(); //配列の長さを算出 var ArrLen = chara_n*chara_d/chara_s; //初期座標配列を作成 for (var i = 0; i<ArrLen; i++) { //m0 より左にキャラを並べるような配列を作成 xArr[i] = m0._x-(chara_s*i); yArr[i] = m0._y; } //m1~m3を初期位置に並べる for (var i = 1; i<chara_n; i++) { this["m"+i]._x = xArr[i*chara_d/chara_s]; this["m"+i]._y = yArr[i*chara_d/chara_s]; } //キャラを移動させる変数を用意 var mov_x = 0; var mov_y = 0; //キャラを動かす関数を定義 function charaMove() { // m0 を mov_x や mov_y の分移動 m0._x += mov_x; m0._y += mov_y; // その m0 の座標を配列の先頭に挿入 xArr.unshift(m0._x); yArr.unshift(m0._y); // 配列の最後を削除 xArr.pop(); yArr.pop(); // m1~m3 を各座標に配置 for (var i = 1; i<chara_n; i++) { this["m"+i]._x = xArr[i*chara_d/chara_s]; this["m"+i]._y = yArr[i*chara_d/chara_s]; } } //キーを監視するオブジェクトを作成 var myKey = new Object(); //キーを押したときの動作定義 myKey.onKeyDown = function() { //方向キーで変数 mov_x,mov_y の値を決定 if (Key.isDown(Key.RIGHT)) { mov_x = chara_s; } else if (Key.isDown(Key.LEFT)) { mov_x = -chara_s; } else if (Key.isDown(Key.UP)) { mov_y = -chara_s; } else if (Key.isDown(Key.DOWN)) { mov_y = chara_s; } //1フレーム進む時間毎に charaMove を実行 _root.onEnterFrame = charaMove; }; //キーを放したときの動作定義 myKey.onKeyUp = function() { //mov_x と mov_y を 0 に戻す mov_x = mov_y=0; //1フレーム進む時間毎に実行するメソッドを削除 delete _root.onEnterFrame; }; //キーのリスナーとして myKey を登録 Key.addListener(myKey); --------------------- ・ActionScript 1.0(設定は2.0でもOK) ・要 Flash MX 以上 ・要 Flash Player 6 以上用 SWF パブリッシュ onClipEvent(enterFrame) は殆ど Flash 5 のみで使われていたものです。 Flash MX 以上の onEnterFrame を使った方が楽だと思います。
その他の回答 (1)
- H240S18B73
- ベストアンサー率65% (190/288)
主人公のいた場所を人数分配列にして残しておいては? import flash.utils.Timer var charList:Array=new Array() var dstList:Array=new Array() init() function init(){ for(var i=0;i<4;i++){ charList.push(addChild(new Sprite())) with(charList[i]){ x=275 y=200 with(graphics){ beginFill([0xFFCC88,0xCCFF88,0x88CCFF,0xFF88CC][i]) drawEllipse(-10,-10,20,20) endFill() } } dstList.push(new Point(275,200)) } } var timer:Timer=new Timer(50,4) timer.addEventListener(TimerEvent.TIMER,step) function step(e){ for(var i in charList){ var vec=dstList[i].subtract(new Point(charList[i].x,charList[i].y)) vec.normalize((vec.length>=5)?5:0) charList[i].x+=vec.x charList[i].y+=vec.y } } stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey) function onKey(e){ if(timer.running)return; switch(e.keyCode){ case Keyboard.UP: dstList.unshift(dstList[0].add(new Point(0,-20))) break; case Keyboard.DOWN: dstList.unshift(dstList[0].add(new Point(0,20))) break; case Keyboard.LEFT: dstList.unshift(dstList[0].add(new Point(-20,0))) break; case Keyboard.RIGHT: dstList.unshift(dstList[0].add(new Point(20,0))) break; } while(dstList.length>charList.length)dstList.pop() timer.reset() timer.start() }
お礼
ご回答ありがとうございます! また、配列が必要とのご指摘、非常に勉強になりました。 書いていただいたソースは、おそらくActionscript3.0だと思いますが、 私の知識が乏しいため、内容を理解するのに時間がかかってしまいました。 (残念ながら、まだ理解しきれていません…) ソースを拝見している最中に、別の方がご回答してくださり、 そちらがすぐに私の環境に使えるものでしたので、ベストアンサーにさせていただきました。 しかし、一番早くご回答いただき、また、ソースを示して頂いた事に対して 非常に感謝しております。 今後のプログラミングの際に、書いていただいたソースは使えるように 保存しておきます。 ご回答ありがとうございました!
お礼
ご回答ありがとうございます! コメント入りのソースで読みやすく、「なるほどなー」と感心してしまいました。 私がまだactionscriptの知識が乏しく、内容を理解するのに時間がかかったため お礼が遅れてしまいました。 失礼しました。 実際の動作検証は、まだ時間が確保出来ておらず、実施できていないのですが、 なるべく早く実行して、結果を見てみたいと思います。 内容的には配列が必要なのですね。 No.1の方もご指摘していただいているので、 今後は、配列のうまい使い方を勉強します。 非常に分かりやすい(絵まで入れていただいて)ご解説ありがとうございました。 大変助かりました! もし、またツマづいてしまった時は、質問を書くかもしれませんので 見ていただけましたら、お力をお貸しいただきたいと思っております。 ありがとうございました。