• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Actionscript2.0でドラクエのようなキャラの移動を実現する)

Actionscript2.0でドラクエのようなキャラの移動を実現する方法

このQ&Aのポイント
  • Actionscript2.0を使用して、ドラクエのようなキャラの移動を実現する方法を教えてください。
  • 自作ゲームでキャラの移動が上手くいかず困っています。主人公の移動に仲間が後を付いてくる、ドラクエのようなキャラ移動を実現したいです。
  • 現在の設定ではキャラが重なってしまったり、同じタイミングで同じ方向に移動してしまいます。フィールドがマス目のような状態であれば、移動前の位置に仲間を移動させることもできると考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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 を使った方が楽だと思います。  

script001
質問者

お礼

ご回答ありがとうございます! コメント入りのソースで読みやすく、「なるほどなー」と感心してしまいました。 私がまだactionscriptの知識が乏しく、内容を理解するのに時間がかかったため お礼が遅れてしまいました。 失礼しました。 実際の動作検証は、まだ時間が確保出来ておらず、実施できていないのですが、 なるべく早く実行して、結果を見てみたいと思います。 内容的には配列が必要なのですね。 No.1の方もご指摘していただいているので、 今後は、配列のうまい使い方を勉強します。 非常に分かりやすい(絵まで入れていただいて)ご解説ありがとうございました。 大変助かりました! もし、またツマづいてしまった時は、質問を書くかもしれませんので 見ていただけましたら、お力をお貸しいただきたいと思っております。 ありがとうございました。

その他の回答 (1)

回答No.1

主人公のいた場所を人数分配列にして残しておいては? 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() }

script001
質問者

お礼

ご回答ありがとうございます! また、配列が必要とのご指摘、非常に勉強になりました。 書いていただいたソースは、おそらくActionscript3.0だと思いますが、 私の知識が乏しいため、内容を理解するのに時間がかかってしまいました。 (残念ながら、まだ理解しきれていません…) ソースを拝見している最中に、別の方がご回答してくださり、 そちらがすぐに私の環境に使えるものでしたので、ベストアンサーにさせていただきました。 しかし、一番早くご回答いただき、また、ソースを示して頂いた事に対して 非常に感謝しております。 今後のプログラミングの際に、書いていただいたソースは使えるように 保存しておきます。 ご回答ありがとうございました!

関連するQ&A

専門家に質問してみよう