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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     斜めに移動しながら、弾を出す
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
10-feet
Åê¹ÆNo.37338
投稿日時: 2008-1-25 16:56
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
斜めに移動しながら、弾を出す
こんにちは、feetです。
過去ログや、他のサイトで調べてみたのですが
自分の書き方が初心者のせいかマッチするものが見当たりませんでした。
このまま悩み続けても時間が消費されるばかりだと思ったので
こちらに投稿させていただきます。

質問内容は「弾を撃ちながら斜め移動をする」です。
現状は、斜め移動は可能で、上下左右の移動も可能。
静止中、上下左右と斜め(右上)移動中に弾が発射できる状態です。
右上を除く斜め移動時にスペースを押しても弾が出ないのです・・・。
また、上と同じ意味ですが、先にスペースを押していると右上を除く斜め移動ができません。

行の位置を入れ替えたり、別々のフレームに書いたり
色々と試しましたが直りませんでした。
なぜ右上移動時だけ発射可能なのかもさっぱりです。

お手すきな方がいましたら、どの部分がまずいのかご指摘もらえないでしょうか?

以下ソースになります。
記述場所「_root上の1フレーム目」

//_root.field上に新しいMC"bulletField"深度1を作成
_root.createEmptyMovieClip("bulletField", 1);

//attachMovie の名前、深度につかう変数
var a:Number = 0;

//弾複製function
function createBullet():Void {
	_root.bulletField.attachMovie("bullet", "bullet"+a, a);
	a++;
}


記述場所「_root上に配置したplayer(MC)」

onClipEvent (load) {
	
	var speed:Number = 0;			//計算用のスピード変数
	var roboSpeed:Number = 6;	//roboのスピード
	var rot:Number = 0;				//roboの角度
	
	//ムービー上のミサイルの数を数える変数
	var bulletcounter:Number = 0;
	//ミサイルの最大連射数を持つ変数
	var maxbullet:Number = 5;

	var shot:Boolean = true;			//発射可能状態を表すため
	var getTime:Number = 0;			//現在の時間(秒数)を取得する為の変数
	var shotTimeNow:Number = 0;	//発射した時間を記憶させる為の変数
}

onClipEvent(enterFrame){
	
	//0?59.999秒を取得
	getTime = getTimer()/1000%60;

	//前回打った時に取得した秒数と、現在の秒数の差が0.1空いていれば発射可能状態にする
	if ( ((shotTimeNow - getTime) < -0.1) || ((shotTimeNow - getTime) > 0.1 ) ) { shot = true; }
	
	//スペースキーが押され、場にある弾がMAX以下で、発射可能状態のみ弾を発射する
	if ( (Key.isDown(Key.SPACE) == true ) && (shot == true)  &&  ( bulletcounter < maxbullet ) ){
		
		_parent.createBullet();
				
		//ミサイルが一発発射されたのでbulletcounterを1増やす
		bulletcounter++;
		shotTimeNow = getTimer()/1000%60;
		shot = false;
	}

	
	if (  (Key.isDown(Key.UP) && Key.isDown(Key.LEFT)) == true ) {
		rot = 215;
		speed = roboSpeed;
	}
	else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.LEFT)) == true ) {
		rot = 135;
		speed = roboSpeed;
	}
	else if ((Key.isDown(Key.UP)  && Key.isDown(Key.RIGHT)) == true ) {
		rot = 315;
		speed = roboSpeed;
	}
	else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.RIGHT)) == true ) {
		rot = 45;
		speed = roboSpeed;
	}
	else if( Key.isDown( Key.UP ) == true ){
		rot = 270;
		speed = roboSpeed;
	}
	else if( Key.isDown( Key.DOWN ) == true ){
		rot = 90;
		speed = roboSpeed;
	}
	else if( Key.isDown( Key.RIGHT ) == true ){
		rot = 0;
		speed = roboSpeed;
	}
	else if( Key.isDown( Key.LEFT ) == true ){
		rot = 180;
		speed = roboSpeed;
	}
	else{
		speed = 0;
	}
	
	// 移動量を求める
	this._x += Math.cos(rot * Math.PI / 180) * speed;
	this._y += Math.sin(rot * Math.PI / 180) * speed;
	
}


弾のMCには進むソースと画面外にいったらbulletcounterを-1して自身を消すソースが書かれているだけです。

それと質問内容とは違うのですが・・・
長いソースの場合は、どこかのサイトにファイルをUPしたほうがいいのでしょうか?
切り分けて載せるのが自分でも良いと思うのですが
何処が間違っているかわからない状態なのでほとんど載せてます。
Tonpoo (gaienboy改め)
Åê¹ÆNo.37341
投稿日時: 2008-1-25 18:52
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: 斜めに移動しながら、弾を出す
こんにちは、gaienboyです。

引用:
10-feetさんは書きました:
お手すきな方がいましたら、どの部分がまずいのかご指摘もらえないでしょうか?

まずい、というか、意図通りの動きになっていないのだとしたら、まずはどこにそ
の原因があるかというのを突き止めることが大事です。文末にご自分でも「切り分
けて載せるのが自分でも良いと思うのですが何処が間違っているかわからない状態
なのでほとんど載せてます。」と書かれていますが、「どこがまずい≒間違ってい
る≒原因となっている」かがわかれば、自然と掲載するスクリプトの量も減ります。

で、原因の見つけ方についてですが、これはとにかく処理を細かく切り分けて、最
小限の構成から一つ一つの処理が正しく行われているかどうかを地道に調べていく
のが確実です。

例えば今回のケースであれば、複数のキーを同時に押下しているので、その判定の
過程で不具合が起こっているのではないかと思います。なので、私ならば

1.十字キー押下の判定が正しく処理できているか調べる

onClipEvent(enterFrame){
    trace("判定開始-----------");
    if (  (Key.isDown(Key.UP) && Key.isDown(Key.LEFT)) == true ) {
        trace("UP+LEFT");
    }
    else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.LEFT)) == true ) {
        trace("DOWN+LEFT");
    }
    else if ((Key.isDown(Key.UP)  && Key.isDown(Key.RIGHT)) == true ) {
        trace("UP+RIGHT");
    }
    else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.RIGHT)) == true ) {
        trace("DOWN+RIGHT");
    }
    else if( Key.isDown( Key.UP ) == true ){
        trace("UP");
    }
    else if( Key.isDown( Key.DOWN ) == true ){
        trace("DOWN");
    }
    else if( Key.isDown( Key.RIGHT ) == true ){
        trace("RIGHT");
    }
    else if( Key.isDown( Key.LEFT ) == true ){
        trace("LEFT");
    }
    else{
        trace("NONE");
    }
    trace("判定終了-----------");
}

2.スペースキー押下の判定が正しく処理できているか調べる

onClipEvent(enterFrame){
    trace("判定開始-----------");
    if ( Key.isDown(Key.SPACE) == true){
        trace("SPACE");
    }
    trace("判定終了-----------");
}

3.十字キー+スペースキー押下の判定が正しく処理できているか調べる

onClipEvent(enterFrame){
    trace("判定開始-----------");
    if ( Key.isDown(Key.SPACE) == true){
        trace("SPACE");
    }
    if (  (Key.isDown(Key.UP) && Key.isDown(Key.LEFT)) == true ) {
        trace("UP+LEFT");
    }
    else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.LEFT)) == true ) {
        trace("DOWN+LEFT");
    }
    else if ((Key.isDown(Key.UP)  && Key.isDown(Key.RIGHT)) == true ) {
        trace("UP+RIGHT");
    }
    else if ((Key.isDown(Key.DOWN) && Key.isDown(Key.RIGHT)) == true ) {
        trace("DOWN+RIGHT");
    }
    else if( Key.isDown( Key.UP ) == true ){
        trace("UP");
    }
    else if( Key.isDown( Key.DOWN ) == true ){
        trace("DOWN");
    }
    else if( Key.isDown( Key.RIGHT ) == true ){
        trace("RIGHT");
    }
    else if( Key.isDown( Key.LEFT ) == true ){
        trace("LEFT");
    }
    else{
        trace("NONE");
    }
    trace("判定終了-----------");
}

これでもし右上を押したときにスペースを押して

判定開始-----------
SPACE
UP+RIGHT
判定終了-----------

とtraceされるのに、右下を押したときに

判定開始-----------
SPACE
DOWN+RIGHT
判定終了-----------

とtraceされないのであれば、このキー押下判定周りがあやしいということになり
ます。そうでなければ、他の処理(角度や位置の計算、弾丸の発射、弾丸の発射可
能状態の判定などなど)がまずい、という可能性が高いです。

長々となりましたが、このように処理を小分けにして試してみて下さい。

■追記
長々と書いておいてこんなこと言うのもなんですが、「flash キー 同時押し」で
Google検索かけたら、下記のページがヒットしました。ページ下の方にある
「同時に押せないキー」を読んでみて下さい。(それ以外の箇所も非常に参考に
なるので、読んでみることをおすすめします)


しっぽのブログ: コツのお話その5 インターフェース キー編


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

10-feet
Åê¹ÆNo.37345
投稿日時: 2008-1-25 19:41
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: 斜めに移動しながら、弾を出す
御早いレスありがとうございます。

引用:

gaienboyさんは書きました:
「どこがまずい≒間違っている≒原因となっている」かが
わかれば、自然と掲載するスクリプトの量も減ります。


その通りなんですよね


■追記
長々と書いておいてこんなこと言うのもなんですが、「flash キー 同時押し」で
Google検索かけたら、下記のページがヒットしました。ページ下の方にある
「同時に押せないキー」を読んでみて下さい。(それ以外の箇所も非常に参考に
なるので、読んでみることをおすすめします)


う、これは・・・。
根本的な組み立て方を変える必要がありそうですね・・・。

なんにせよ、gaienboyさんの助言を参考にして1つ1つ試してみます。(確認・勉強の意味も込めて)


それと私事で申し訳ないですが
土日にPCが使えなくなってしまうので、これ以降の返信が遅くなってしまいます。
使えるようになり次第、結果等書き込みます。

ありがとうございます
10-feet
Åê¹ÆNo.37375
投稿日時: 2008-1-28 12:25
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: 斜めに移動しながら、弾を出す
こんにちは、feetです。

traceを使い、キー判定が正しく行なわれているか試した所
やはりアローキーを含めた同時入力は認識されていませんでした。

アローキーの部分をそれぞれWASDに置き換えたところ
無事に斜めに移動しながら弾を打ってくれるようになりました。
スペースキーで弾が出るのは変わっていません。

	if (Key.isDown( 87 ) && Key.isDown( 65 )) {
		//移動処理
	}
	else if (Key.isDown( 83 ) && Key.isDown( 65 )) {
		//移動処理
	}
	else if (Key.isDown( 87 )  && Key.isDown( 68 )) {
		//移動処理
	}
	else if (Key.isDown( 83 ) && Key.isDown( 68 )) {
		//移動処理
	}


一応は解決したのですが、1つ疑問があります。
上記の事がわかってから色々と調べてみたのですが

アローキーで斜め移動+スペースキーで弾発射

というのはキーボードで操作している以上、Flashでは実現不可能な事なんでしょうか?
他のシューティングゲームの操作方法などもこの組み合わせの物は見当たりませんでした。
見当たらない=使えないってことなのかもしれませんが
1人で結論を出すのは危険な気がしたので・・・。

ものすごく初心者臭い質問ですが、どうか宜しくお願いします。
Tonpoo (gaienboy改め)
Åê¹ÆNo.37376
投稿日時: 2008-1-28 12:50
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: 斜めに移動しながら、弾を出す
「同時 キー 押せない」でGoogle検索してみたところ、下記のページがヒットしました。

キーが三つ同時に押せない(反応しない) | True Combat: Japan
左斜め上とスペースキーを同時に押せないのですが・・・ - 教えて!goo

これらのページに書いてあることから判断すると、一部のキーボードでキーが三つ
同時に押せないのは、ハードウェア的な制約だということになります。とすると、
ユーザーがキーボードを交換するかキーバインドを変更するかなどをしなければ
ならないということになりそうですが、これらはどちらもFlash側ではどうにも
ならないことであると思います。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

10-feet
Åê¹ÆNo.37377
投稿日時: 2008-1-28 14:30
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: 斜めに移動しながら、弾を出す
解答ありがとうございます。

引用:

gaienboyさんは書きました:
これらのページに書いてあることから判断すると、一部のキーボードでキーが三つ
同時に押せないのは、ハードウェア的な制約だということになります。とすると、
ユーザーがキーボードを交換するかキーバインドを変更するかなどをしなければ
ならないということになりそうですが、これらはどちらもFlash側ではどうにも
ならないことであると思います。


ありがとうございます!すっきりしました
同時入力では認識出来ないキーがあることを覚えておきます。
今回はありがとうございました。
また機会があれば宜しくお願いします
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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