当たり判定もショットの発射位置もめちゃくちゃになってしまいました
どうすればうまくいくでしょうか
急いでいます
アドバイスおねがいします
#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);
}