ページ 11

弾の発射がうまくいきません

Posted: 2013年9月04日(水) 13:36
by jios
お久しぶりです、jiosです。
今、自機の弾の発射のプログラムを組んでいます。
spaceきーを押すと弾が現れ、まっすぐに画面の上に飛んでいきます。
しかし、弾が現れる位置が自機の右に出現してしまいます。

作成したプロジェクトをそのまま書きます。

コード:

include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        int x=320, y=320;
        int Handle = LoadGraph("画像/キャラクタ01.png");

		int X = 320, Y = 30;
		int NUM = LoadGraph("画像/キャラクタ01.png");
		int NUMMuki = 1;


		int ShotX,ShotY,ShotFlag;
		int ShotGraph = LoadGraph("画像/弾00.png");
		ShotFlag = 0;



        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
        while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Key[KEY_INPUT_ESCAPE] == 0){

		//自機の制御
		{
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ // 右キーが押されていたら
			x++;                       // 右へ移動
		}
		if( Key[ KEY_INPUT_DOWN  ] >= 1 ){ // 下キーが押されていたら
			y++;                       // 下へ移動
		}
		if( Key[ KEY_INPUT_LEFT  ] >= 1 ){ // 左キーが押されていたら
			x--;                       // 左へ移動
		}
		if( Key[ KEY_INPUT_UP    ] >= 1 ){ // 上キーが押されていたら
			y--;                       // 上へ移動
		}
		if(CheckHitKey( KEY_INPUT_SPACE ) == 1 && ShotFlag == 0){
			int Hw,Hh,Sw,Sh;
			GetGraphSize( Handle,&Hw,&Hh);
			GetGraphSize(ShotGraph,&Sw,&Sh);

			ShotX = (Hw-Sw)/2+x;
			ShotY = (Hh-Sh)/2+y;
			ShotFlag = 1;
		}
		DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE ); // x,y の位置にキャラを描
		}
		
		//自機の移動ルーチン
		if( ShotFlag == 1 )
		{
			// 弾を16ドット上に移動させる
			ShotY -= 16 ;

			// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
			if( ShotY < -80 )
			{
				ShotFlag = 0 ;
			}

			// 画面に弾を描画する
			DrawRotaGraph( ShotX , ShotY ,1.0 , 0.0 , ShotGraph , TRUE ) ;
		}

		//敵の移動ルーチン
		{
			if(NUMMuki == 1){
				X += 3;
			}
			if(NUMMuki == 0){
				X -= 3;
			}

			if(X>576){
				X = 576;
				NUMMuki = 0;
			}

			if(X<0){
				X = 0;
				NUMMuki = 1;
			}
			DrawRotaGraph(X,Y,1.0,0.0,NUM,TRUE);
		}


	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
自機や弾の画像は新・ゲームプログラミングの館さんからお借りしました。

間違っている部分などが有りましたら、ご指摘お願いします。

Re: 弾の発射がうまくいきません

Posted: 2013年9月04日(水) 14:26
by みけCAT
DrawRotaGraph関数は、指定された座標を画像の中心として描画します。
回転や伸縮の値は固定のようなので、将来拡張しないのであれば素直にDrawGraphを使う方がいいと思います。

Re: 弾の発射がうまくいきません

Posted: 2013年9月04日(水) 14:53
by jios
ご指摘ありがとうございます。

コード:

//自機の移動ルーチン
		if( ShotFlag == 1 )
		{
			// 弾を16ドット上に移動させる
			ShotY -= 16 ;

			// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
			if( ShotY < -80 )
			{
				ShotFlag = 0 ;
			}

			// 画面に弾を描画する
			DrawGraph( ShotX ,ShotY , ShotGraph , TRUE ) ;
		}
このプログラムに変更して、弾の位置のせっていを変えたらうまく自機の前方から発射することができました。

あともうひとつ質問させてもらってもいいでしょうか。
自機をもう少し滑らかに移動させたいのですが、どこのプログラムを触ればいいのでしょうか。
質問のプログラムは最初に投稿したプログラムです。
勝手ながらすみませんが、どうかよろしくお願いします。

Re: 弾の発射がうまくいきません

Posted: 2013年9月04日(水) 21:53
by softya(ソフト屋)
すくなくとも1ピクセル単位で移動しているように見えますが、これより滑らかにしたいのでしょうか?

Re: 弾の発射がうまくいきません

Posted: 2013年9月04日(水) 22:47
by jios
返信遅くなってすみません。

自己解決しました。
ご指摘ありがとうございました。