DXLib3Dで簡単なFPSのゲームをつくっていますが・・・

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

DXLib3Dで簡単なFPSのゲームをつくっていますが・・・

#1

投稿記事 by gaia » 15年前

ぜんぜんうまくできなくて困っています
当たり判定もショットの発射位置もめちゃくちゃになってしまいました
どうすればうまくいくでしょうか

急いでいます
アドバイスおねがいします

コード:

#include "DxLib.h"

#define SHOT 20


int Screen=0;
bool changeScreen = true;
const int MAIN_SCREEN = 0;
const int SUB_SCREEN = 1;
const int GAME_CLEAR =2;
const int GAME_OVER  =3;
const bool FULL_SCREEN = false ;

int hImage;		//スプライト用ハンドル

int hMModel;
VECTOR3 Pos(0,0,20),Deg(0,0,0);//キャラクターの位置と向き
float Delta=0;	//前後進の移動量

int h2DFont;	//2Dフォント用ハンドル

int ShotModel,ShotFlag;	//ショット
VECTOR3 ShotY(0,0,0),ShotX(0,0,0);

int TekiModel;		//敵データ
VECTOR3 Teki(0,0,-20);//敵キャラクターの位置と向き
int TekiMuki;//敵を左右に移動させる

int i ;
int Ground;//地面
int MISS=0;//ゲームオーバーのフラグ
int START = 0;//スタートボタンのフラグ

int zikan=0;//ショットの存在時間

int CameraX=0,CameraY=0,CameraZ=90;	//カメラ

int iZ,iRz;	//右スティック

int po=0,lo=0,ko=0;

int Zpl,Xpl;

void Initialize();
void MainScreen();
void SubScreen();
void ClearScreen();
void OverScreen();
bool IsScreenChanged();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	Initialize();

		// 敵の移動方向をセット
	TekiMuki = 1 ;



	while (SUCCEEDED( mL.MessageProcess()))
	{
		const int Key = mL.GetJoy(0);
		if(Key == 14 && START == 0){
			Screen = 1;
			START  = 1;
		}
		if(MISS==5) Screen = 3;
		switch(Screen){
			case MAIN_SCREEN:
						MainScreen();
						break;
				case SUB_SCREEN:
						SubScreen();
						break;
				case GAME_CLEAR:
						ClearScreen();
						break;
				case GAME_OVER:
						OverScreen();
						break;
		}
		
		// もしESCキーが押されていたらループから抜ける
		if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ;
}
	

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

//----------------
//3Dの初期化およびデータの読み込み
//----------------
void Initialize()
{
	mL.SetFullScreenEnable( FULL_SCREEN);
	if( !FULL_SCREEN )
	{
		mL.SetWindowSize(800,600);
		mL.SetWindowTitle( _T("テストプログラム"));
	}

	if( FAILED( mL.Init() )) //ライブラリの初期化処理
			mL.Exit();

	//---------------
		//2Dフォント設定
		h2DFont = mL.Load2DFont(_T("Arial") , 36 , 40);
		//(0,5,15)→(0,0,0)
		mL.SetCamera(VECTOR3(0, 90, 90),VECTOR3(0, 0, 0));
		// モーションモデル読み込み
		hMModel = mL.LoadModel(_T("data/x/"), _T("Gun.x") );
		ShotModel = mL.LoadModel(_T("data/x/"), _T("shot.x") );
		TekiModel = mL.LoadMotionModel(_T("data/x/"), _T("hero.x") );
		Ground    = mL.LoadModel(_T("data/x/"), _T("Ground0.x") );
		ShotFlag = 0;
		if(mL.GetJoyNum() == 0 )
		{
			mL.MesBox(_T("ゲームパッドがありません!!!"));
			mL.Exit();
		}
		//白を抜き色にして画像をロード
		hImage = mL.LoadImage(_T("data/img/target.png"),GetColor(255,255,255));
	//---------------

}
//----------------------
//タイトル画面
//----------------------
void MainScreen()
{
	if( IsScreenChanged() )
	{
	}

	mL.AdjustFPS( 60 );				//FPSの調節
	mL.CLS();						//グラフィック画面の消去
	mL.DrawFPS();					//FPSの表示
	mL.DrawCameraPoint(10,10);		//カメラの位置表示
	mL.ClearPrintf();
//-------------------------------
	//2Dフォントの描画
	mL.Draw2DFont(h2DFont,150,200,_T("PUSH THE START"));
//-------------------------------

	mL.ScreenFlip();  //裏画面を表画面に描画
}

//----------------------
//プレイ画面
//----------------------
void SubScreen()
{
	if( IsScreenChanged() )
	{
	}

	mL.AdjustFPS( 60 );				//FPSの調節
	mL.CLS();						//グラフィック画面の消去
	mL.DrawFPS();					//FPSの表示
	mL.DrawCameraPoint(10,10);		//カメラの位置表示
	//mL.SetDebugMouseEnable( true );		//テスト用のマウス操作を有効化
	mL.ClearPrintf();
	mL.SetCamera(VECTOR3( 0, 0, CameraZ),VECTOR3(CameraY,0 , 0));

//---------------------------------------------
	Delta = 0;
	static int x,y;
	const int Key = mL.GetJoy(0);
	mL.GetJoyXY( 0 , &x , &y );
	
	mL.GetJoyRZ( 0 , &iZ ,&iRz );	//右アナログスティック情報取得
	if( iZ <0 )CameraY += 1;//左を向く
	if( iZ >0 )CameraY -= 1;	//右を向く
	if(  x <0 )CameraY += 1;	//上を向く
	if(	 x >0 )CameraY -= 1;	//横
	
	if( iZ <0 )Deg.y -= 2.0f;	//左を向く
	if( iZ >0 )Deg.y += 2.0f;	//右を向く

	if(  y >0 )CameraZ += 1;	//後ろ
	if(  y <0 )CameraZ -= 1;	//前

	if(CameraZ > 100) CameraZ = 100;
	if(CameraZ < 20) CameraZ = 20;
	if(CameraY < -90) CameraY = -90;
	if(CameraY > 90) CameraY = 90;

	mL.printf("iZ=%d iRz=%d", iZ , iRz);

	if( y !=0 )	Delta -= y/3000.0f;	//前後移動
	if( x !=0 )	Pos.x -= x/3000.0f;	//左右移動
	if( y !=0 )	Pos.z += y/3000.0f;	//前後移動

	Pos.x += sin(Deg.x * 0.0174f) * Delta ;	// 0.0174f == 3.14f/180
	Pos.z += cos(Deg.x * 0.0174f) * Delta ;
	mL.printf(_T("\n\n\nx=%5d y=%5d key=%3d"),x,y,Key);
	mL.printf(_T("\n\n\nx=%d y=%d"),Pos.x,Pos.y);
	mL.printf(_T("\n\n\nx=%5d y=%5d key=%3d"),x,y,Key);

	
				// ②ボタンを押していて、弾が撃ち出されていなかったら弾を発射する
			if( Key == 6 && ShotFlag == 0 )
			{
				ShotY.x = Pos.x;
				ShotY.y = -1;	//ショットの高さ
				ShotY.z = Pos.z;
				// 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する
				ShotFlag = 1 ;
			}

		if( ShotFlag == 1 )
		{
			// 弾を移動させる
			ShotY.z -= 1.0f ;
			zikan += 1;
			// 画面外に出てしまった場合は消す
			if( zikan > 120 )
			{
				zikan = 0;
				ShotFlag = 0 ;
				MISS += 1;
			}

			// 画面に弾を描画する
			mL.DrawModel( ShotModel , ShotY , ShotX , 1) ;
		}

	// 敵の移動ルーチン
		{
			// 敵の座標を移動している方向に移動する
			if( TekiMuki == 1 ) Teki.x += 0.3f ;
			if( TekiMuki == 0 ) Teki.x -= 0.3f ;
			Teki.z = -25.0f;
			// 敵が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
			if( Teki.x > 18.0f )
			{
				Teki.x = 18.0f ;
				TekiMuki = 0 ;
			}

			// 敵が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する
			if( Teki.x < -9.0f )
			{
				Teki.x = -9.0f ;
				TekiMuki = 1 ;
			}

			// 敵を描画
			mL.DrawMotionModel(TekiModel,Teki,VECTOR3(0,0,0),0.05);
		}

		Zpl = Teki.z + ShotY.z;
		Xpl = Teki.x + ShotY.x;

		// 弾と敵の当たり判定、弾の数だけ繰り返す
		for( i = 0 ; i < SHOT ; i ++ )
		{
			// 弾iが存在している場合のみ次の処理に映る
			if( ShotFlag == 1 )
			{
				//敵との当たり判定
				if( ( ( Zpl <  Teki.z - ShotY.z && Zpl >  Teki.z-3.0f - ShotY.z) ||
					( Zpl >  Teki.z + ShotY.z && Zpl <  Teki.z+3.0f + ShotY.z) ) &&
					(( ShotY.x > Teki.x && ShotY.x < Teki.x+2.0f ) ||
					( Teki.x > ShotY.x && Teki.x < ShotY.x+2.0f )))
				{
					// 接触している場合は当たった弾の存在を消す
					ShotFlag = 0 ;
					//クリア画面を表示
					Screen = 2;
				}
			}
		}
	mL.printf(_T("\npo=%d \nlo=%d \nko%d"),po,lo,ko);
	if(Key == 7) {
		po=0;
		lo=0;
		ko=0;
	}

	//画像を2D空間に描画
	mL.Draw2DImage(hImage,670/2,580/2); //スプライトの中心点を指示

	mL.printf(_T("\n\n\nx=%5d y=%5d key=%3d"),x,y,Key);
	mL.DrawModel(hMModel,Pos,Deg,1);//モーション再生
	mL.DrawModel(Ground,VECTOR3(0,-15,0),VECTOR3(0,0,0),200);

//---------------------

	mL.ScreenFlip();  //裏画面を表画面に描画
}

void ClearScreen()
{
		if( IsScreenChanged() )
	{
	}
	
	mL.AdjustFPS( 60 );				//FPSの調節
	mL.CLS();						//グラフィック画面の消去
	mL.DrawFPS();					//FPSの表示
	mL.DrawCameraPoint(10,10);		//カメラの位置表示
	//mL.SetDebugMouseEnable( true );		//テスト用のマウス操作を有効化
	mL.ClearPrintf();
//-------------------------------
	//2Dフォントの描画
	mL.Draw2DFont(h2DFont,150,200,_T("GAME CLEAR"));
//-------------------------------
			const int Key = mL.GetJoy(0);
		if(Key == 7){
			MISS = 0;
			Screen = 0;
			Pos.x = 0;
			Pos.y = 0;
			Teki.x = 0;
			ShotFlag = 0 ;
			START = 0;
		}

	mL.ScreenFlip();  //裏画面を表画面に描画
}
void OverScreen()
{
		if( IsScreenChanged() )
	{
	}

	mL.AdjustFPS( 60 );				//FPSの調節
	mL.CLS();						//グラフィック画面の消去
	mL.DrawFPS();					//FPSの表示
	mL.DrawCameraPoint(10,10);		//カメラの位置表示
	//mL.SetDebugMouseEnable( true );		//テスト用のマウス操作を有効化
	mL.ClearPrintf();
//-------------------------------
	//2Dフォントの描画
	mL.Draw2DFont(h2DFont,150,200,_T("GAME OVER"));
//-------------------------------
		const int Key = mL.GetJoy(0);
		if(Key == 7){
			MISS = 0;
			Screen = 0;
			Pos.x = 0;
			Pos.y = 0;
			Teki.x = 0;
			ShotFlag = 0 ;
			START = 0;

		}
		
	mL.ScreenFlip();  //裏画面を表画面に描画
	

}

//-------------------------
//画面切り替え直後か判定
//-------------------------
bool IsScreenChanged()
{
	bool change = changeScreen;
	changeScreen = false;
	return(change);
}
codeタグを使ってくださいね。 by softya(ソフト屋)

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

Re: DXLib3Dで簡単なFPSのゲームをつくっていますが・・・

#2

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

上にも書きましたが、codeタグを使ってくださいね。
で、急いでいるとは何時まででしょうか?
それと同じような内容と時刻に投稿されたkirakiraさんは同じ方?あるいは、知人の方でしょうか?

[追記]
このコードは最新のDXライブラリでコンパイルが通りません。
どのバージョンのDXライブラリや派生ライブラリを使われていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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