トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     fpsに同期したmcの移動
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ibm-old
Åê¹ÆNo.47878
投稿日時: 2011-8-12 0:21
新米
居住地:
投稿: 5
使用環境:
Mac OSX,Flash CS5
fpsに同期したmcの移動
初めて投稿させて頂きます。宜しくお願い致します。

プログラミングもFlashも全くの素人ですが、アクションゲームを作成しようと思いactionscriptをいじっています。バージョンは3.0で、環境はFlash CS5 (Mac) です。

まずはプレイヤーを動かせるようにするため、以下のようなスクリプトを組んでみました。

var move:uint = 8;

Object(root).player_mc.addEventListener(Event.ENTER_FRAME,enterframe);
function enterframe(e:Event):void
{

	stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeydown);
	function onKeydown(e:KeyboardEvent):void
	{

		if (e.keyCode == Keyboard.RIGHT)
		{
			Object(root).player_mc.x +=  move;
		}
		if (e.keyCode == Keyboard.LEFT)
		{
			Object(root).player_mc.x -=  move;
		}
		if (e.keyCode == Keyboard.UP)
		{
			Object(root).player_mc.y -=  move;
		}
		if (e.keyCode == Keyboard.DOWN)
		{
			Object(root).player_mc.y +=  move;
		}

		e.updateAfterEvent();

	}
}


2,3行目でEnterFrameを使っていますが、これを入れないとムービークリップがfpsに関係なく同じスピードで動く為です。(KEY_DOWNイベントはユーザがキーを押している間、一定間隔で送出されるらしいので、それで正しいのかもしれません。)

そこで、上のようにして単純にfpsに同期するようにしようとしてみたのですが、うまく働きませんでした。
具体的には、
 1.fpsに関係なく更新される
 2.fpsを上げると1フレームあたりの移動距離が異様に大きくなる
という感じです。

色々と調べてはみましたが、ややニッチな目的のため、中々良い情報が見つからず、こうして質問させて戴くことにいたしました。
お知恵を貸していただけると有難いです。
ひろゆき
Åê¹ÆNo.47879
投稿日時: 2011-8-12 11:22
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: fpsに同期したmcの移動
メインのタイムラインに、ムービークリップ(インスタンス名: player_mc)を配置。
以下のスクリプトは、ステージ第1フレームに記述します。
(メインタイムラインは1フレームしかないものとします)

[case1]
var move:Number = 1;

player_mc.addEventListener(Event.ENTER_FRAME, enterframe);
function enterframe(e:Event):void {
	stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown);
	function onKeydown(e:KeyboardEvent):void {
		trace("onKeydown");
		if (e.keyCode == Keyboard.RIGHT) {
			player_mc.x +=  move;
		}
		if (e.keyCode == Keyboard.LEFT) {
			player_mc.x -=  move;
		}
		if (e.keyCode == Keyboard.UP) {
			player_mc.y -=  move;
		}
		if (e.keyCode == Keyboard.DOWN) {
			player_mc.y +=  move;
		}
		e.updateAfterEvent();
	}
}
trace結果を見ると、必要以上に、onKeydownが呼び出されているように思います。
enterframeのたびに、関数を何度も定義する必要はないように思います。

[case2]
var move:Number = 1;

player_mc.addEventListener(Event.ENTER_FRAME, enterframe);
function enterframe(e:Event):void {
	stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown);
}
function onKeydown(e:KeyboardEvent):void {
	trace("onKeydown");
	if (e.keyCode == Keyboard.RIGHT) {
		player_mc.x +=  move;
	}
	if (e.keyCode == Keyboard.LEFT) {
		player_mc.x -=  move;
	}
	if (e.keyCode == Keyboard.UP) {
		player_mc.y -=  move;
	}
	if (e.keyCode == Keyboard.DOWN) {
		player_mc.y +=  move;
	}
	e.updateAfterEvent();
}
で、行けるはずです。
ただし、fpsに合わせる話は別です。

onKeydownは、キーボードのイベントで呼び出されるわけですから、fpsに関係なく動くはずです。

fpsに合わせたいということであれば、
あくまでも、enterframeで、キーが押されているかどうかをチェックする
必要があるのではないでしょうか?

[case3]
var move:Number = 1;
var keyCode:uint = 0;
//チェックしたいキーコード(37, 38, 39, 40)以外の値を指定

player_mc.addEventListener(Event.ENTER_FRAME, enterframe);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyup);
function enterframe(e:Event):void {
	if (keyCode == Keyboard.RIGHT) {
		player_mc.x +=  move;
	}
	if (keyCode == Keyboard.LEFT) {
		player_mc.x -=  move;
	}
	if (keyCode == Keyboard.UP) {
		player_mc.y -=  move;
	}
	if (keyCode == Keyboard.DOWN) {
		player_mc.y +=  move;
	}
	//e.updateAfterEvent();
}
function onKeydown(e:KeyboardEvent):void {
	keyCode = e.keyCode;
	trace(keyCode);
}
function onKeyup(e:KeyboardEvent):void {
	keyCode = 0;
}


また、スクリプトはコードを貼り付けるだけでなく、
どこに記述したとか、どんなインスタンスをどこに配置してあるかの情報も必要です。
第三者が再現しやすいような説明を心がけてください。


----------------
質問する際は、回答者に具体的な情報を与えてください。

ibm-old
Åê¹ÆNo.47880
投稿日時: 2011-8-12 21:22
新米
居住地:
投稿: 5
使用環境:
Mac OSX,Flash CS5
Re: fpsに同期したmcの移動
ご回答戴きありがとうございます。

確かに、スクリプトの記述場所を書いていませんでした…
スクリプトは絶対パスにしてメインタイムラインやplayer_mcのタイムラインに書きこんでいました。結果、どちらに書きこんでも挙動は同じでした。
あとは、ステージ上にインスタンス名player_mcとしたムービークリップを配置しただけです。申し訳ございません…

なお、まことに勝手ながら、非常に不細工なスクリプトを書くことで一応は解決していました。しかし、挙動がおかしい理由が解らないため、回答を待たせて頂きました。
参考になる回答を有難うございます!特に、[case3]のような書き方ができるとは知りませんでした。もっと勉強していきます。
野中文雄
Åê¹ÆNo.47881
投稿日時: 2011-8-12 22:17
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: fpsに同期したmcの移動
いろいろな書き方が知りたいということでしたら、ご参考までに。

[case 4]
var move:Number = 0;
var keyCode:uint = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyup);
function onKeydown(eventObject:KeyboardEvent):void {
	var keyCode:uint = eventObject.keyCode;
	switch (keyCode) {
		case Keyboard.LEFT:
			move = -1;
			player_mc.addEventListener(Event.ENTER_FRAME, moveX);
			break;
		case Keyboard.RIGHT:
			move = 1;
			player_mc.addEventListener(Event.ENTER_FRAME, moveX);
			break;
		case Keyboard.UP:
			move = -1;
			player_mc.addEventListener(Event.ENTER_FRAME, moveY);
			break;
		case Keyboard.DOWN:
			move = 1;
			player_mc.addEventListener(Event.ENTER_FRAME, moveY);
			break;
	}
	// trace(keyCode);
}
function onKeyup(eventObject:KeyboardEvent):void {
	player_mc.removeEventListener(Event.ENTER_FRAME, moveX);
	player_mc.removeEventListener(Event.ENTER_FRAME, moveY);
}
function moveX(eventObject:Event):void {
	player_mc.x += move;
}
function moveY(eventObject:Event):void {
	player_mc.y += move;
}


----------------
 

野中文雄
Åê¹ÆNo.47882
投稿日時: 2011-8-12 22:31
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: fpsに同期したmcの移動
配列を使う手もあります。

[参考]「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第15回「配列を使ったキーコードとプロパティの扱い
var move:Number = 0;
var keyCode:uint = 0;
var moveFunction:Function;
var movements:Array = [];
movements[Keyboard.LEFT] = [-1, moveX];
movements[Keyboard.RIGHT] = [1, moveX];
movements[Keyboard.UP] = [-1, moveY];
movements[Keyboard.DOWN] = [1, moveY];
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyup);
function onKeydown(eventObject:KeyboardEvent):void {
	var movement:Array = movements[eventObject.keyCode];
	if (movement) {
		move = movement[0];
		moveFunction = movement[1];
		player_mc.addEventListener(Event.ENTER_FRAME, moveFunction);
	}
	// trace(keyCode);
}
function onKeyup(eventObject:KeyboardEvent):void {
	player_mc.removeEventListener(Event.ENTER_FRAME, moveX);
	player_mc.removeEventListener(Event.ENTER_FRAME, moveY);
}
function moveX(eventObject:Event):void {
	player_mc.x +=  move;
}
function moveY(eventObject:Event):void {
	player_mc.y +=  move;
}


----------------
 

ibm-old
Åê¹ÆNo.47883
投稿日時: 2011-8-13 3:17
新米
居住地:
投稿: 5
使用環境:
Mac OSX,Flash CS5
Re: fpsに同期したmcの移動
ご回答ありがとうございます。こちらの書き方もスマートで良いですね!
まだif~switch文や配列までは手が及んでいなかったので、リンク先のHPは大変参考になりそうです。少しずつ読んでいきたいと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops