敵が消えてしまいます・・・

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

敵が消えてしまいます・・・

#1

投稿記事 by gaia » 9年前

ゲーム中に突然敵がきえてしまいます。
なぜきえるのかがぜんぜんわかりません・・・。
どうすればいいのでしょうか。
お願いします

//------------------
//シューティングゲーム
//------------------
#include "DxLib.h"

struct CHARA{
int MModel; //キャラクタ用ハンドル
VECTOR3 Pos; //キャラクタの位置
VECTOR3 Deg; //キャラクタの向き
}slime,shot,hero,Tekishot;

int h2DFont; //2Dフォント用ハンドル
int Screen=0; //画面切り替えフラグ
bool changeScreen = true;
const int MENUE_SCREEN = 0; //メニュー画面切り替えフラグ
const int MAIN_SCREEN = 1; //プレイ画面切り替えフラグ
const int CLEAR_SCREEN = 2; //クリア画面切り替えフラグ
const int OVER_SCREEN = 3; //ゲームオーバー画面切り替えフラグ
const bool FULL_SCREEN = false ;

float Delta=0;

int ShotFlag; //ショット
int Tamakazu = 0; //弾の数
int zikan = 0; //ショットの存在時間

int TekiShotFlag; //敵ショット
int Tekizikan = 0; //敵ショットの存在時間

void Initialize();

void MenueScreen(); //メニュー画面
void MainScreen(); //プレイ画面
void ClearScreen(); //クリア画面
void OverScreen(); //ゲームオーバー画面

bool IsScreenChanged();
float GetVECTOR3_DegreeXZ(VECTOR3 , VECTOR3);


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

while (SUCCEEDED( mL.MessageProcess()))
{
switch(Screen){
case MENUE_SCREEN:
MenueScreen();
break;
case MAIN_SCREEN:
MainScreen();
break;
case CLEAR_SCREEN:
ClearScreen();
break;
case OVER_SCREEN:
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();

//---------------
// (0,10,-10)→(0,0,0)
mL.SetCamera(VECTOR3(0,10,-10),VECTOR3(0,0,0));
// モーションモデル読み込み
slime.MModel = mL.LoadMotionModel(_T("data/x/"), _T("Slime.x"));
hero.MModel = mL.LoadMotionModel(_T("data/x/"), _T("hero.x"));
shot.MModel = mL.LoadModel(_T("data/x/"), _T("shot.x"));
Tekishot.MModel = mL.LoadModel(_T("data/x/"), _T("Tekishot.x"));
ShotFlag = 0;
TekiShotFlag = 0;
if(mL.GetJoyNum() == 0 )
{
mL.MesBox(_T("ゲームパッドがありません!!!"));
mL.Exit();
}

slime.Pos.z = 5.0f; //スライム初期位置
//---------------

}


//-------------------------
//メニュー画面
//-------------------------
void MenueScreen()
{
if( IsScreenChanged() )
{
}

mL.AdjustFPS( 60 ); //FPSの調節
mL.CLS(); //グラフィック画面の消去
int fps = mL.DrawFPS(); //FPSの表示
mL.DrawCameraPoint(10,10); //カメラの位置表示
mL.SetDebugEnable( true ); //テスト用のマウス操作を有効化
//-------------------------------------------
//2Dフォントの描画
const int Key = mL.GetJoy(0);
mL.Draw2DFont(h2DFont,10,10, _T("START"));
if( Key == 14) Screen = 1;
//-------------------------------------------
mL.ScreenFlip(); //裏画面を表画面に描画
}

//----------------------
//プログラムのメイン処理
//----------------------
void MainScreen()
{
if( IsScreenChanged() )
{
slime.Pos = VECTOR3(0,0,0) ;
slime.Deg = VECTOR3(0,0,0);
shot.Pos = VECTOR3(0,0,0);
Tekishot.Pos = VECTOR3(0,0,0);
hero.Pos = VECTOR3(0,0,0);
hero.Deg = VECTOR3(0,0,0);
}

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

//---------------------
//-----------------------------------
//プレイヤー

Delta = 0;
static int x,y;
const int Key = mL.GetJoy(0);
mL.GetJoyXY( 0 , &x , &y );

if( y !=0 )Delta = y/8000.0f;
if( x < 0 )hero.Deg.y += 3.0f;
if( x > 0 )hero.Deg.y -= 3.0f;
hero.Pos.x -= sin((hero.Deg.y+180) * 0.0174f) * Delta;
hero.Pos.z -= cos((hero.Deg.y+180) * 0.0174f) * Delta;

if(mL.GetDistVECTOR3(hero.Pos, slime.Pos)>0.5f){
//2つの座標間の角度を取得(取得角度は±180の範囲)
slime.Deg.y=GetVECTOR3_DegreeXZ( slime.Pos , hero.Pos );
//HEROの新位置決定(0.02fは移動速度 0.0174f==3.14f/180)
slime.Pos.x += sin((slime.Deg.y+180) * 0.0174f) * 0.02f;
slime.Pos.z += cos((slime.Deg.y+180) * 0.0174f) * 0.02;
}

// ②ボタンを押していて、弾が撃ち出されていなかったら弾を発射する
if( Key == 6 && ShotFlag == 0 )
{
shot.Deg.y=hero.Deg.y;
ShotFlag = 1 ;
}
if( ShotFlag == 0 )
{
shot.Pos = hero.Pos;
mL.DrawModel( shot.MModel , hero.Pos , VECTOR3(0,0,0));
}

if( ShotFlag == 1 )
{
shot.Pos.x += sin((shot.Deg.y+180) * 0.0174f) * 0.2f;
shot.Pos.z += cos((shot.Deg.y+180) * 0.0174f) * 0.2;
mL.DrawModel( shot.MModel , shot.Pos , VECTOR3(0,0,0));
zikan += 1;

if( ( ( shot.Pos.x > slime.Pos.x && shot.Pos.x < slime.Pos.x + 0.4f ) ||
( slime.Pos.x > shot.Pos.x && slime.Pos.x < shot.Pos.x + 0.8f ) ) &&
( ( shot.Pos.z > slime.Pos.z && shot.Pos.z < slime.Pos.z + 0.4f ) ||
( slime.Pos.z > shot.Pos.z && slime.Pos.z < shot.Pos.z + 0.8f ) ) )
{
// 接触している場合は当たった弾の存在を消す
ShotFlag = 0 ;
Screen = 2;
}

if(zikan > 300){
ShotFlag = 0 ;
zikan = 0;
Tamakazu += 1;
}


if(Tamakazu > 4) {
Screen = 3;
}
}
//-----------------------------------
//スライム
if( Tekizikan > 120 && TekiShotFlag == 0 )
{
Tekishot.Deg.y=slime.Deg.y;
TekiShotFlag = 1 ;
}
if( TekiShotFlag == 0 )
{
Tekishot.Pos = slime.Pos;
Tekizikan += 1;
}

if( TekiShotFlag == 1 )
{
Tekishot.Pos.x += sin((Tekishot.Deg.y+180) * 0.0174f) * 0.1f;
Tekishot.Pos.z += cos((Tekishot.Deg.y+180) * 0.0174f) * 0.1f;
mL.DrawModel( Tekishot.MModel , Tekishot.Pos , VECTOR3(0,0,0),0.3);
Tekizikan += 1;

if( ( ( Tekishot.Pos.x > hero.Pos.x && Tekishot.Pos.x < hero.Pos.x + 0.4f ) ||
( hero.Pos.x > Tekishot.Pos.x && hero.Pos.x < Tekishot.Pos.x + 0.8f ) ) &&
( ( Tekishot.Pos.z > hero.Pos.z && Tekishot.Pos.z < hero.Pos.z + 0.4f ) ||
( hero.Pos.z > Tekishot.Pos.z && hero.Pos.z < Tekishot.Pos.z + 0.8f ) ) )
{
// 接触している場合は当たった弾の存在を消す
TekiShotFlag = 0 ;
Screen = 3;
}

if(Tekizikan > 360){
TekiShotFlag = 0 ;
Tekizikan = 0;
}
}

// スライムモーション再生
mL.DrawMotionModel( slime.MModel , slime.Pos , slime.Deg);
//HEROモーション再生
mL.DrawMotionModel( hero.MModel , hero.Pos , hero.Deg ,0.01);
//fpsからモーションをどれだけ進めるか決定
float AdvanceTime = (60.0f / (fps + 0.01f) ) * 0.01f;
//モーション進める
mL.MotionAdvanceTime( slime.MModel, AdvanceTime );
//舞台表示
mL.DrawCube( VECTOR3(0,-1,0) , VECTOR3( 10 , 0.1f , 10 ), VECTOR3(0,0,0) , VECTOR3(1,1,1), 1, LCOLOR( COLOR4(0 , 0.1f , 1) , COLOR4(0, 0 , 0), COLOR4(0, 0 , 0)) ,false);
//---------------------

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


//-------------------------
//クリア画面表示
//-------------------------
void ClearScreen()
{
if( IsScreenChanged() )
{
}

mL.AdjustFPS( 60 ); //FPSの調節
mL.CLS(); //グラフィック画面の消去
int fps = mL.DrawFPS(); //FPSの表示
mL.DrawCameraPoint(10,10); //カメラの位置表示
mL.SetDebugEnable( true ); //テスト用のマウス操作を有効化
//-------------------------------------------
//2Dフォントの描画
mL.Draw2DFont(h2DFont,10,10, _T("げーむくりあー"));
//-------------------------------------------
mL.ScreenFlip(); //裏画面を表画面に描画
}

//-------------------------
//ゲームオーバー画面表示
//-------------------------
void OverScreen()
{
if( IsScreenChanged() )
{
}

mL.AdjustFPS( 60 ); //FPSの調節
mL.CLS(); //グラフィック画面の消去
int fps = mL.DrawFPS(); //FPSの表示
mL.DrawCameraPoint(10,10); //カメラの位置表示
mL.SetDebugEnable( true ); //テスト用のマウス操作を有効化
//-------------------------------------------
//2Dフォントの描画
mL.Draw2DFont(h2DFont,10,10, _T("げーむおーばー"));
//-------------------------------------------
mL.ScreenFlip(); //裏画面を表画面に描画
}

//-------------------------
//画面切り替え直後か判定
//-------------------------
bool IsScreenChanged()
{
bool change = changeScreen;
changeScreen = false;
return(change);
}

float GetVECTOR3_DegreeXZ(VECTOR3 p1 , VECTOR3 p2)
{
float ret = pL -> Get3DTriangleDegree(VECTOR3(0,0,-100) , VECTOR3(p1.x + 0.01f,0,p1.z),VECTOR3(p2.x,0,p2.z + 0.01f) );

if (p1.x < p2.x) return(-ret);

return(ret);
}

maru
記事: 150
登録日時: 9年前

Re: 敵が消えてしまいます・・・

#2

投稿記事 by maru » 9年前

gaia さんが書きました:ゲーム中に突然敵がきえてしまいます。
なぜきえるのかがぜんぜんわかりません・・・。
どうすればいいのでしょうか。
お願いします
デバッグ作業の丸投げでしょうか?
こんな長いコードを見ただけで間違いを見つけることが出来る人はそうそういませんよ。

プログラムが自分の思った通りに動かない場合、ソースファイルを見るだけで原因を特定し対策するのは非常に困難です。
まず、起きている現象を整理し、原因を突き止めて、その後対策を行います。

「突然」は本当に突然ですか?
再現性はありますか?再現性が或る場合、その条件を特定しましょう。
再現性がない場合、その再現性を見つけるようにしましょう。
何か操作をした時ではありませんか?
一定時間後ではないですか?
何か操作をしてから一定時間後ではないですか?
何回かの操作をした後ではないですか。
敵の位置がどこか特定の場所ではないですか?
etc.

再現性を見つけることが出来ればそのバグ対策は50%以上終わったといってもいいでしょう。
次に、その再現する条件を整理し、その条件に合うプログラムコードを特定します。
何かの操作を行った時なら、その操作に対するイベントハンドラ、一定時間後なら定周期で起動される関数など。
コードが特定出来たら、そのコードにブレークポイントを仕掛け、変数の値を確認しながらステップ実行等でコードを少しずつ実行して変数の値がおかしな値になっていないかを確認していきます。
変数の値がおかしな値になるところがあればそこが原因なのでコードを修正して対策します。

再現性を見つけることが出来ない場合は...
正しくない動作(ここでは敵が消えること)を検査できるコードをプログラム中のあちこちにばらまいて、そのどこかが引っかかるのを待ちます。
コードを見たわけではありませんが、敵が消えるということは、敵の位置を保持している座標の値が表示範囲外になっている等のことが考えられます。だったら、敵の位置を変更している部分に
assert(敵の位置が範囲内であることを確認する処理);
といったコードを入れます。例えば

コード:

assert(X_MIN <= teki_x && teki_x <= X_MAX);
といったコードです。

以上のような手順で原因を特定して、対策するのがデバッグ作業というものです。

gaia

Re: 敵が消えてしまいます・・・

#3

投稿記事 by gaia » 9年前

ありがとうございます
でもけっきょくわからなかったのであきらめます

閉鎖

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