EnemyShot

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KSK
記事: 79
登録日時: 14年前

EnemyShot

#1

投稿記事 by KSK » 14年前

コード:

#include "DxLib.h"
#include <math.h>


#define SHOT 1
#define SUPER_SHOT 100
#define HIGHPER_SHOT 100
#define ENEMY 6
#define ENEMY_SHOT 6



// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance,LPSTR lpCmdLine , int nCmdShow )
{

	int PlayerX , PlayerY , PlayerGraph ;
	int EnemyX[ENEMY] , EnemyY[ENEMY] , EnemyGraph , EnemyFlag[ENEMY] , EnemyClearCounter[ENEMY] ;
	int ShotX[SHOT] , ShotY[SHOT] , ShotFlag[SHOT] , ShotGraph , ShotCounter , ShotSound , ShotSoundFlag ;
	int SuperShotX[SUPER_SHOT] , SuperShotY[SUPER_SHOT] , SuperShotFlag[SUPER_SHOT] , SuperShotGraph , SuperShotSound , SuperShotSoundFlag ;
	int HighperShotX[HIGHPER_SHOT] , HighperShotY[HIGHPER_SHOT] , HighperShotFlag[HIGHPER_SHOT] , HighperShotGraph ;
	double EnemyShotX[ENEMY_SHOT] , EnemyShotY[ENEMY_SHOT] , EnemyShotEx[ENEMY_SHOT] , EnemyShotEy[ENEMY_SHOT] , Pe[ENEMY_SHOT] , PeX[ENEMY_SHOT] , PeY[ENEMY_SHOT] , PX[ENEMY_SHOT] , PY[ENEMY_SHOT] , EX[ENEMY_SHOT] , EY[ENEMY_SHOT] ;
	int EnemyShotGraph , EnemyShotFlag[ENEMY_SHOT] , EnemyShotCounter[ENEMY_SHOT] ;
	int GreenGraph , BlueGraph ;
	int i ;
	int v ;
	int white ;
	int e ;
	int s ;
	int score ;
	int MessageBoxFlag ;

	
	SetWindowIconID( 101 ) ;
	SetMainWindowText( "ACESHOOT" ) ;
	// 画面モードの設定
	SetGraphMode( 640 , 480 , 0 ) ;
	// 描画モードをネアレストネイバー法にする
	SetDrawMode( DX_DRAWMODE_NEAREST ) ;
	SetWindowStyleMode( 7 ) ;
	SetWindowSizeExtendRate( 1 ) ;

	MessageBoxFlag = MessageBox( NULL , TEXT( "WINDOW MODE?" ) , TEXT( "SCREEN MODE" ) , MB_YESNOCANCEL | MB_ICONQUESTION ) ;
	if( MessageBoxFlag == IDYES )
	{
		ChangeWindowMode( TRUE ) ;
	}
	if( MessageBoxFlag == IDCANCEL )
	{
		goto END ;
	}

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 ) return -1;


	// グラフィックの描画先を裏画面にセット
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// 自機のグラフィックをメモリにロード&表示座標をセット
	PlayerGraph = LoadGraph( "red.bmp" ) ;
	PlayerX = 320 - 32 ; PlayerY = 480 - 128 ;

	//敵のグラフィックをメモリにロード&表示座標をセット
	EnemyGraph = LoadGraph( "enemy.bmp" ) ;
	EnemyX[0] = 304 ;
	EnemyX[1] = 154 ;
	EnemyX[2] = 432 ;
	EnemyX[3] = 154 ;
	EnemyX[4] = 304 ;
	EnemyX[5] = 432 ;
	
	// 弾のグラフィックをメモリにロード
	HighperShotGraph = LoadGraph( "bighighpershot.bmp" ) ;

	SuperShotGraph = LoadGraph( "supershot.bmp" ) ;

	ShotGraph = LoadGraph( "shot.dat" ) ;
	ShotCounter = 0 ;

	ShotSound = LoadSoundMem( "shotsound.wav" ) ;
	ShotSoundFlag = 0 ;

	SuperShotSound = LoadSoundMem( "supershotsound.wav" ) ;
	SuperShotSoundFlag = 0 ;

	// 敵の弾のグラフィックをロード
	EnemyShotGraph = LoadGraph( "enemyshot.bmp" ) ;
	for( e = 0 ; e < ENEMY_SHOT ; e ++ )
	{
		EnemyShotX[e] = EnemyX[e] + 16 ;
		EnemyShotY[e] = EnemyY[e] + 32 ;
		EnemyShotFlag[e] = 0 ;
		EnemyShotCounter[e] = 0 ;
	}

	GreenGraph = LoadGraph( "green.bmp" ) ;

	BlueGraph = LoadGraph( "blue.bmp" ) ;

	white = GetColor( 255 , 255 , 255 ) ;

	score = 0 ;

	// 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく
	for( v = 0 ; v < SHOT ; v++ )
	{
		ShotFlag[v] = 0 ; 
	}
	for( i = 0 ; i < SUPER_SHOT ; i ++ )
	{
		SuperShotFlag[i] = 0 ;
	}
	for( e = 0 ; e < ENEMY ; e ++ )
	{
		EnemyY[e] = 0 ;
		EnemyFlag[e] = 0 ;
		EnemyClearCounter[e] = 0 ;
	}

	EnemyFlag[0] = 1 ;


	// 移動ルーチン
	while( 1 )
	{
		
		// 画面を初期化(真っ黒にする)
		ClearDrawScreen() ;	

		DrawGraph( 0 , 0 , GreenGraph , FALSE ) ;
		DrawFormatString( 528 , 32 , white , "SCORE:%d" , score ) ;

		// 自機の操作ルーチン
		{
			// ↑キーを押していたら自機を上に移動させる
			if( CheckHitKey( KEY_INPUT_UP ) == 1 ) PlayerY -= 5 ;

			// ↓キーを押していたら自機を下に移動させる
			if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) PlayerY += 5 ;

			// ←キーを押していたら自機を左に移動させる
			if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) PlayerX -= 5 ;

			// →キーを押していたら自機を右に移動させる
			if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) PlayerX += 5 ;

			if( score >= 100 )
			{
			if( CheckHitKey( KEY_INPUT_X ) )
			{
				// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
				for( i = 0 ; i < SUPER_SHOT ; i ++ )
				{
					// 弾iが画面上にでていない場合はその弾を画面に出す
					if( SuperShotFlag[i] == 0 )
					{
						// 弾iの位置をセット、位置はボール君の中心にする
						SuperShotX[i] = PlayerX + 48 ;
						SuperShotY[i] = PlayerY - 16 ;

						// 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する
						SuperShotFlag[i] = 1 ;

						if( SuperShotSoundFlag == 0 )
						{
							PlaySoundMem( SuperShotSound , DX_PLAYTYPE_BACK , TRUE ) ;
							ChangeVolumeSoundMem( 1 , SuperShotSound ) ;
							SuperShotSoundFlag = 1 ;
							if( SuperShotSoundFlag == 1 )
							{
								SuperShotSoundFlag = 0 ;
							}
						}	

						// 一つ弾を出したので弾を出すループから抜けます
						break ;
					}
				}
			}
			}

			if( CheckHitKey( KEY_INPUT_Z ) )
			{
				for( v = 0 ; v < SHOT ; v ++ )
				{
					if( ShotFlag[v] == 0)
					{
						ShotX[v] = PlayerX + 16 ;
						ShotY[v] = PlayerY - 22 ;

						ShotFlag[v] = 1 ;
					
						if( ShotSoundFlag == 0 )
						{
							PlaySoundMem( ShotSound , DX_PLAYTYPE_BACK , FALSE ) ;
							ChangeVolumeSoundMem( 1 , ShotSound ) ;
							ShotSoundFlag = 1 ;
							if( ShotSoundFlag == 1 )
							{
								ShotSoundFlag = 0 ;
							}
						}	
						break ;
					}
				}
			}

			// 自機が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる
			if( PlayerX < 123 ) PlayerX = 123 ;

			// 自機が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる
			if( PlayerX > 453 ) PlayerX = 453  ;

			// 自機が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる
			if( PlayerY < 0 ) PlayerY = 0 ;

			// 自機が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる
			if( PlayerY > 480 - 128 ) PlayerY = 480 - 128 ;

			// 自機を描画
			DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;
		}

		if( score >= 100 )
		{
			for( i = 0 ; i < SUPER_SHOT ; i ++ )
			{
				// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
				if( SuperShotFlag[ i ] == 1 )
				{
					// 弾iを16ドット上に移動させる
					SuperShotY[ i ] -= 16 ;

					// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
					if( SuperShotY[ i ] < -32 )
					{
						SuperShotFlag[ i ] = 0 ;
					}
				
					// 画面に弾iを描画する
					DrawGraph( SuperShotX[ i ] , SuperShotY[ i ] , SuperShotGraph , TRUE ) ;
				}
			}
			GreenGraph = 0 ;
			GreenGraph = BlueGraph ;
		}

		for( v = 0 ; v < SHOT ; v ++ )
		{
			// 自機の弾vの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
			if( ShotFlag[ v ] == 1 )
			{
				// 弾vを8ドット上に移動させる
				ShotY[ v ] -= 8 ;

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

				// 画面に弾vを描画する
				DrawGraph( ShotX[ v ] , ShotY[ v ] , ShotGraph , TRUE ) ;
			}
		}
		
		// 敵の移動ルーチン 
		for( e = 0 ; e < ENEMY ; e ++ )
		{
			if( EnemyY[e] == 480)
			{
					EnemyFlag[e] = 2 ;
			}
		}
		if(EnemyFlag[0] == 1 )
		{
			DrawGraph( EnemyX[0] , EnemyY[0] , EnemyGraph , TRUE ) ;
			EnemyY[0] += 2 ;
		}
		EnemyShotCounter[0] ++ ;
		if( EnemyFlag[0] == 2 )
		{
			EnemyClearCounter[0] ++ ;
			if( EnemyClearCounter[0] == 50 )
			{
				EnemyFlag[1] = 1 ;
			}
		}
		if(EnemyFlag[1] == 1 )
		{
			DrawGraph( EnemyX[1] , EnemyY[1] , EnemyGraph , TRUE ) ;
			EnemyY[1] += 2 ;
		}
		EnemyShotCounter[1] ++ ;
		if( EnemyFlag[1] == 2 )
		{
			EnemyClearCounter[1] ++ ;
			if( EnemyClearCounter[1] == 50 )				
			{
				EnemyFlag[2] = 1 ;
			}
		}
		if(EnemyFlag[2] == 1 )
		{
			DrawGraph( EnemyX[2] , EnemyY[2] , EnemyGraph , TRUE ) ;
			EnemyY[2] += 2 ;
		}
		EnemyShotCounter[2] ++ ;
		if( EnemyFlag[2] == 2 )
		{
			EnemyClearCounter[2] ++ ;
			if( EnemyClearCounter[2] == 50 )				
			{
				EnemyFlag[3] = 1 ;
				EnemyFlag[4] = 1 ;
				EnemyFlag[5] = 1 ;
			}
		}
		if(EnemyFlag[3] == 1 )
		{
			DrawGraph( EnemyX[3] , EnemyY[3] , EnemyGraph , TRUE ) ;
			EnemyY[3] += 2 ;
		}
		EnemyShotCounter[3] ++ ;
		if(EnemyFlag[4] == 1 )
		{
			DrawGraph( EnemyX[4] , EnemyY[4] , EnemyGraph , TRUE ) ;
			EnemyY[4] += 2 ;
		}
		EnemyShotCounter[4] ++ ;
		if(EnemyFlag[5] == 1 )
		{
			DrawGraph( EnemyX[5] , EnemyY[5] , EnemyGraph , TRUE ) ;
			EnemyY[5] += 2 ;
		}
		EnemyShotCounter[5] ++ ;
		for( e = 0 ; e < ENEMY ; e ++ )
		{
			if( EnemyShotCounter[e] == 60 )
			{
				if( EnemyFlag[e] == 0 )
				{
					EnemyShotX[e] = EnemyX[e] + 16 ;
					EnemyShotY[e] = EnemyY[e] + 32 ;
					{
						PX[e] = PlayerX[e] + 32 ;
						PY[e] = PlayerY[e] + 64 ;
						EX[e] = EnemyShotX[e] + 16 ;
						EY[e] = EnemyShotY[e] + 16 ;
						PeX[e] = PX[e] - EX[e] ;
						PeY[e] = PY[e] - EY[e] ;
						Pe[e] = sqrt( PeX[e] * PeX[e] + PeY[e] * PeY[e] ) ;
						EnemyShotEx[e] = PeX[e] / Pe[e] * 8 ;							
						EnemyShotEy[e] = PeY[e] / Pe[e] * 8 ;
					}
					EnemyShotFlag[e] = 1 ;
				}
				EnemyShotCounter[e] = 0 ;
			}
		}
		for( e = 0 ; e < ENEMY_SHOT ; e ++ )
		{
		if( EnemyShotFlag[e] == 1 )
		{
			EnemyShotX[e] += EnemyShotEx[e] ;
			EnemyShotY[e] += EnemyShotEy[e] ;
			if( EnemyShotX[e] > 640 || 
				EnemyShotX[e] < 0 ||
				EnemyShotY[e] > 480 || 
				EnemyShotY[e] < 0 )
			{
				EnemyShotFlag[e] = 0 ;
			}
			DrawGraph( ( int )EnemyShotX[e] , ( int )EnemyShotY[e] , EnemyGraph , TRUE ) ;
		}
		}

		for( v = 0 ; v < SHOT ; v ++ )
		{
			for( e = 0 ; e < ENEMY ; e ++ )
			{
			// 弾iが存在している場合のみ次の処理に移る
			if( ShotFlag[ v ] == 1 )				
			{
				if( EnemyFlag[e] == 1 )
				{
					// 四角君との当たり判定
					if( ( ( ShotX[v] + 12 > EnemyX[e] && ShotX[v] < EnemyX[e] + 32 ) ||
						( EnemyX[e] > ShotX[v] && EnemyX[e] < ShotX[v] + 32 ) ) &&
			            ( ( ShotY[v] > EnemyY[e] && ShotY[v] < EnemyY[e] + 32 ) ||
						( EnemyY[e] > ShotY[v] && EnemyY[e] < ShotY[v] + 32 ) ) )
					{
						// 接触している場合は当たった弾の存在を消す
						ShotFlag[ v ] = 0 ;
						EnemyFlag[e] = 2 ;
						score += 10 ;
					}
				}
			}
			}
		}

		if( score >= 100 )
		{
			for( i = 0 ; i < SUPER_SHOT ; i ++ )
			{
				for( e = 0 ; e < ENEMY ; e ++ )
				{
				// 弾iが存在している場合のみ次の処理に移る
				if( SuperShotFlag[ i ] == 1 )
				{
					if( EnemyFlag[e] == 1 )
					{
						// 四角君との当たり判定
						if( ( ( SuperShotX[i] > EnemyX[e] && SuperShotX[i] < EnemyX[e] + 32 ) ||
							( EnemyX[e] > SuperShotX[i] && EnemyX[e] < SuperShotX[i] + 32 ) ) &&
							( ( SuperShotY[i] > EnemyY[e] && SuperShotY[i] < EnemyY[e] + 32 ) ||
							( EnemyY[e] > SuperShotY[i] && EnemyY[e] < SuperShotY[i] + 32 ) ) )
						{
							// 接触している場合は当たった弾の存在を消す
							SuperShotFlag[ i ] = 0 ;
							EnemyFlag[e] = 2 ;
						}
					}
				}
				}
			}
		}

		// 裏画面の内容を表画面にコピーする
		ScreenFlip() ;


		// Windows 特有の面倒な処理をDXライブラリにやらせる
		// -1 が返ってきたらループを抜ける
		if( ProcessMessage() < 0 ) break ;

		// もしESCキーが押されていたらループから抜ける
		if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ;
	}

	END :

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}
このようなプログラムを書くと、
error C2109: 配列または、ポインターでない変数に添字が使われました。
error C2109: 配列または、ポインターでない変数に添字が使われました。
というエラーが出ます。
どうしたらよいでしょうか?


A


アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: EnemyShot

#2

投稿記事 by h2so5 » 14年前

ビルドエラーの場合、エラー行が表示されるのでそこを良くチェックしてください。

PX[e] = PlayerX[e] + 32 ;
PY[e] = PlayerY[e] + 64 ;

PlayerX は配列ではありません。

KSK
記事: 79
登録日時: 14年前

Re: EnemyShot

#3

投稿記事 by KSK » 14年前


ありがとうございました。
実行できました。


A


閉鎖

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