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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jios

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

#1

投稿記事 by jios » 12年前

お久しぶりです、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;
}
自機や弾の画像は新・ゲームプログラミングの館さんからお借りしました。

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 12年前

DrawRotaGraph関数は、指定された座標を画像の中心として描画します。
回転や伸縮の値は固定のようなので、将来拡張しないのであれば素直にDrawGraphを使う方がいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jios

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

#3

投稿記事 by jios » 12年前

ご指摘ありがとうございます。

コード:

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

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

すくなくとも1ピクセル単位で移動しているように見えますが、これより滑らかにしたいのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jios

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

#5

投稿記事 by jios » 12年前

返信遅くなってすみません。

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

閉鎖

“C言語何でも質問掲示板” へ戻る