質問ページ3 / 135


質問ページ3 / 135

質問ページ3/135

概要RPGの歩行グラフィック
投稿者Parafla Quality
状態
カテゴリーParaFla!
投稿日2009-12-11 (金) 22:31:22
バージョン1.37

質問内容

キーボード操作で歩行アニメーションをしたキャラクターの移動をさせたいです。

スプライトの中に、正面、後向き、左向き、右向きの4つのラベルを作り、各ラベルには、歩行画像2枚、何もしない数フレーム、停止画像1枚、アクションの停止で構成しました。 そのスプライトに以下のASを書きました。

onClipEvent (enterFrame) {
	
	if (Key.isDown(Key.UP)) {
		_y -= 10;
	this.gotoAndPlay("正面");
	}
	
	if (Key.isDown(Key.DOWN)) {
		_y += 10;
	this.gotoAndPlay("後向き");
	}
	
	if (Key.isDown(Key.LEFT)) {
		_x -= 10;
	this.gotoAndPlay("左向き");
	}
	
	if (Key.isDown(Key.RIGHT)) {
		_x += 10;
	this.gotoAndPlay("右向き");
	}
}

この場合だと、キーを一回ずつ押した時には、歩行グラフィックが正常に再生されます。 しかし、キーを押しっぱなしにすると最初の画像でとまったまま移動してしまいます。画像にチラつきもみられます。 キーを押しっぱなしにした状態でも、毎回歩行アニメが再生されるようにするにはどうしたらいいですか?

回答

  • それぞれの歩行画像2枚を更にそれぞれのスプライトに入れてみる -- 2009-12-12 (土) 22:50:17
  • スプライトに入れてみたところ、4方向のアニメーションが順番に繰り返してしまう状態になってしまいます。
    その状態でキーを押しっぱなしにしてみましたが、1枚の画像で停止したまま移動してしまいます。
    アクションの停止などを入れてみましたが、今度は全く動きません。
  • 新たな質問を追加します。
    こちらのサンプルpflのキーボード操作にあるジャンプpflに書かれているASの一部にある jump = 1; は、真偽の意味で使われているのでしょうか?
    以下ジャンプpflのAS一部
onClipEvent (load) {
	jump = 0;
	takasa = -15;				//※詳細は下記
}
-
onClipEvent (enterFrame) {

//━━━━━ジャンプさせるスクリプト↓━━━━━

	if (Key.isDown(Key.UP)) {
		jump = 1;		//空中でジャンプできないように着地するまでフラグを立てる
		this.gotoAndPlay("アップ");
	}
	if(_y > 250 ){
		_y = 250;
		jump = 0;		//着地したらフラグを外す
		takasa = -15;
	}
	else if (jump == 1) {
		_y += takasa;		//ここがジャンプの命令、フラグが外れるまで毎フレームここを通ることになる
		takasa ++;		//※-15⇒-14⇒…⇒-3⇒-1⇒0⇒1⇒2⇒3…と重量のように減速加速する役割をする
	}
}

  -- 質問者? 2009-12-14 (月) 02:05:31

  • gotoAndPlay?ではなくgotoAndStop?にしてもスプライトなら動くのではないでしょうか。追加質問の場合の0・1はfalse・trueでもよさそうですがあとあと第三の動きに対処させるために数字にしているのかもしれませんね -- 2009-12-14 (月) 02:49:57
  • PlayでもStopでも、キー判定のたびにラベルに飛ばされるため1コマ目しか表示されないのでは。
    キーを押されたらフラグを立てラベル移動→次のキーが前のものと同じなら移動せず、別のものならラベル移動 のような感じにしては。停止時に足踏みをとめるならもう一工夫いるかもしれません。ラベルはboolean型を4つでもいいし、数値で0〜5(0は待機とか)にしてもいけると思います。 -- 2009-12-14 (月) 15:16:44
  • >gotoAndStop?にすると動きません。ジャンプのサンプルが参考になるかと思ったのですが、微妙に違うようです。
    >キーを押されたらフラグを立てラベル移動
    変数を作り、移動したラベルでその値を変更しても結局キー判定で最初のラベルに飛ばされてしまいます。
    フラグを立て、そのフラグを潰すという処理を合理的に表現出来ません。
    以下は考えてみたASですが、フラグが機能しない上にキーボード操作もできない状態でした。
    親スプライトに以下のASを書きました。(Key.UPのみ貼り付け)
    onClipEvent (load) {
    	var aruita = ""; 
    }
    -
    onClipEvent (enterFrame) {
    	if (Key.isDown(Key.UP)) {
    	aruita = 1;
    	this.gotoAndPlay("移動判定");
    	}
    その中に移動判定というラベルを作って変数の値を変更
    	if(aruita == 1){		//Key.UP
    		his.gotoAndPlay("アップ");
    アップというラベルのスプライトに書いたAS&br;
    onClipEvent(load){
    }
    -
    onClipEvent (enterFrame) {
    	aruita = 5;
    	this._y -= 5;
    	aruita = "";
    	_parent.gotoAndStop(idou);
    }

何か修正やヒントを頂けると嬉しいです。 -- 質問者? 2009-12-15 (火) 22:54:50

  • 変数aruitaは初期値0(数値型)、上を1とする。
    上キー押下時、aruitaが1以外であれば1を代入し、スプライトhisをy方向に-5移動、かつ「アップ」ラベルに移動する。aruitaが1であった場合は移動とラベル移動処理をしない。
    その後aruitaの再初期化はせずに入力待ちに戻る。
    aruita=""とすると文字列型と認識されるため判定に不具合が出る可能性がある。無駄を省くためにフラグを立てているのに移動後再初期化をしてしまえば意味がない。またhis内に実際の移動処理を組み込んでしまうと、フラグの都合で移動できるときと出来ないときが出るため不都合。移動はキー判定と一括で行い(ウェイトを掛けるなら移動判定ラベルは有効だがなくても問題ない)、hisはアニメーションの入れ物と割り切る。これでどうですか -- 2009-12-16 (水) 21:16:15
  • 的確な返答をありがとうございます。
    ・>その後aruitaの再初期化はせずに入力待ちに戻る。
    同じ方向に進もうとすると進めなくなってしまうので、ラベルの先の歩いた後の停止画像の後で変数を初期値0にしました。
    無事に歩行アニメを作る事ができました。とても勉強になりました。回答下さった方々、ありがとうございました。 -- 質問者? 2009-12-19 (土) 18:39:41