ページ 11

ゲームのバグについて

Posted: 2009年3月16日(月) 16:40
by ひよこ
ゲームを作っていて実行中に右から落ちると左にいきなり出てくるのですがどうしてでしょうか?
#include "DxLib.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
        else                            GetHitKeyStateAll_InputKey=0;
    }
    return 0;
}
	static int count=0;

	
	
	typedef struct{
        int X,Y;
	}kyara1P;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	// 透過色を変更 白を透過
	SetTransColor( 255 , 255 ,255  ) ;

	int White = GetColor( 255 , 255 , 255 ) ;            // 白の色を取得
	kyara1P Player1P;
	Player1P.X=62;
	Player1P.Y=350;
	int haikei= LoadGraph("green.bmp");
	int kyaraimage[10];
	kyaraimage[0]= LoadGraph("picture[0].bmp");
	kyaraimage[1]= LoadGraph("picture[1].bmp");
	kyaraimage[2]= LoadGraph("picture[2].bmp");
	kyaraimage[3]= LoadGraph("picture[3].bmp");
	kyaraimage[4]= LoadGraph("picture[4].bmp");
	kyaraimage[5]= LoadGraph("picture[5].bmp");
	kyaraimage[6]= LoadGraph("picture[6].bmp");
	kyaraimage[7]= LoadGraph("picture[7].bmp");
	kyaraimage[8]= LoadGraph("picture[8].bmp");
	kyaraimage[9]= LoadGraph("picture[0].bmp");
	int muki=1;
	int jyuryoku=0;
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
		Player1P.Y+=jyuryoku;
		jyuryoku=2;
	
		if(Player1P.X>=16 && Player1P.X<=564 &&Player1P.Y > 350 && Player1P.Y<354  )
		{
			Player1P.Y = 350 ;
			jyuryoku = 0 ;
		}

		if(Player1P.X>=10 && Player1P.X<=16 && Player1P.Y>380 && Player1P.Y<400)
		{	
			jyuryoku = 0;
			muki=7;
		}
		if(Player1P.X>=564 && Player1P.X<=568 && Player1P.Y>380 && Player1P.Y<400)
		{	
			jyuryoku = 0;
			muki=8;
		}
		if(	Player1P.Y==480){Player1P.X=62; Player1P.Y=350; muki=1;}
		if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10)  && count%2){muki=2;Player1P.X-=2;}
		if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2){muki=1;Player1P.X+=2;}
		if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10)  && count%2 && Player1P.Y<=348) Player1P.Y+=2;
		if(  Key[ KEY_INPUT_Z] == 1 )
		{
			if(muki==1)muki=3;
			if(muki==2)muki=4;
		}                         
		
		if(  Key[ KEY_INPUT_A] == 1 && Player1P.Y==350){
			if(muki==1)muki=5;
			if(muki==2)muki=6;
			Player1P.Y-=100;
		}
		if(Player1P.X>12 && Player1P.Y > 400)
		{Player1P.X=12;}
		count++;
		if(Player1P.X<0)Player1P.X=0;
		if(Player1P.X>640-71)Player1P.X=640-71;
	
		DrawGraph(0,0,haikei,FALSE);	
		DrawFormatString( 0, 0, White, "Player1P.Xは%d\n",Player1P.X ) ;
		DrawFormatString( 0, 50, White, "Player1P.Yは%d\n",Player1P.Y) ;
        DrawGraph(Player1P.X,Player1P.Y,kyaraimage[muki],TRUE);
		
        
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 16:49
by 朽木
>ゲームを作っていて実行中に右から落ちると左にいきなり出てくるのですがどうしてでしょうか?

え?右の土管に入ると「イッツ ミー マーリオー」って言いながら左の土管から出てくるんですか?マリオ?


自分が経験した事 == 他人も経験している なんて事は殆どありません。

ですので、自分でもウザい位に説明するのが丁度良いくらいです。もう少し詳しく説明してください。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 16:54
by ひよこ
なぜか右へおちていくとYが400近くで左に勝手に移動してしまいます。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:05
by ベッキー
>なぜか右へおちていくとYが400近くで左に勝手に移動してしまいます。

という情報でもなかなか理解できませんが
コードを書く際には同人であっても後日なにをやっているのかわからないということが
多々あると思いますので、最低限コメントを書いていただけるとうれしいです。

また、右へ落ちていくというのはx、y座標をプラス方向に移動させると、ということでしょうか。


それと、if文の書き方に一貫性がないようなので
統一したほうが後々デバッグしやすいかもしれません。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:11
by ひよこ
いろいろ解析も大変そうなので
ソースと画像を添付します。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:17
by 朽木
それだけ言って済めばとても良いんですが、そうなりません。

なぜなら「コメント」という、人から見ても理解させるプログラムを書くことができる素晴らしい機能を

使おうとしていないからです。もう、見ただけで読む気が失せます。@@;

たとえば、今日投稿したばかりですが、http://www.play21.jp/board/formz.cgi?ac ... 0801#30800に私が投稿したプログラムがありますので、見てみて下さい。

そういう問題が起きて、「あれ?なんで?」と思った時に、すぐに「多分ここら辺だな」と問題部分を

見つけられるかどうかをみると、ひよこさんは目印になるものが無いので何がなんだかわからなくなってしまっています。

なので、今回のようにプログラム全貼りで「助けてくれぇえ」と他人に助けを乞う事になってしまったのではないでしょうか。

自分のためにも、未来の自分やほかの人が見るときのためにも、

30秒以内に理解できるような、人にも優しいプログラムを書くようにしてみてください。

自然と自分のミスにも気付けるようになります。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:33
by ひよこ
その通りですね。一番怪しいところにコメントつけてみました。
//プレイヤーのX座標が16と同じかそれより大きくて564と同じか564より小さいか
//プレイヤーのY座標が350より大きく354より小さい場合
//350にとどまる。
if(Player1P.X>=16 && Player1P.X<=564 &&Player1P.Y > 350 && Player1P.Y<354  )
		{
			Player1P.Y = 350 ;
			jyuryoku = 0 ;
		}
//プレイヤーのX座標が10と同じかそれより大きくて16と同じか16より小さいか
//プレイヤーのY座標が380より大きく400より小さい場合
//その場にとどまる。

		if(Player1P.X>=10 && Player1P.X<=16 && Player1P.Y>380 && Player1P.Y<400)
		{	
			jyuryoku = 0;
			muki=7;
		}
//プレイヤーのX座標が564と同じかそれより大きくて568と同じか568より小さいか
//プレイヤーのY座標が380より大きく400より小さい場合
//その場にとどまる。
		if(Player1P.X>=564 && Player1P.X<=568 && Player1P.Y>380 && Player1P.Y<400)
		{	
			jyuryoku = 0;
			muki=8;
		}
//一番下へついたら元の場所へ
		if(	Player1P.Y==480){Player1P.X=62; Player1P.Y=350; muki=1;}
		//移動用
         if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10)  && count%2)               {muki=2;Player1P.X-=2;}
		if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2)              {muki=1;Player1P.X+=2;}
		if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10)  && count%2 &&              Player1P.Y<=348) Player1P.Y+=2;
         //攻撃用
		if(  Key[ KEY_INPUT_Z] == 1 )
		{
			if(muki==1)muki=3;
			if(muki==2)muki=4;
		}

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:36
by Mist
自分の書いたプログラムが全然理解できていないから、間違い箇所が見つけられない、絞り込めないんじゃないですか。

よく言われることですが、「プログラムは思う通りには動きません、書いたとおりに動きます。」

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:38
by hss12
if(Player1P.X>12 && Player1P.Y > 400)
{Player1P.X=12;}

の部分ですね。Yが400より多くなるとXが12になっています。
コメントというより、動かしてみるとYが400あたりでXが12になっているわけですから
X=12と書いてあるところを探すだけで良いです。
移動ではなくて、Xの座標が何から何に変わってしまうと書いたほうが良かったと思います。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:45
by ひよこ
わかりやすく?かくとXが560くらいでYが400くらいになると右の30くらいに一気に飛んでしまうことです。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 17:48
by ひよこ
すみませんわかりにくいとかんじたので
右の30くらいにじゃなくてXが30くらいに変わりYはふえてそのまま落ちていきます。ってことです。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 18:26
by 朽木
あ。できた。

かなり手こずりましたが、要はひよこさんの見たとおり、座標判定だったようです。

コメントはあまり付けてないのであとは自分でがんばってみて下さい。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 18:36
by ひよこ
コメントは自分のよりかなり多かったです。いろいろ勉強になります。
プログラムに書いてある%3d %3d %3d %3d\nはどういう意味なんですか?
まんなかの二つはなんであるのでしょうか?

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 18:49
by 朽木
%3dは3桁幅に合わせて整数を表示します。4桁以上はその桁数に合わせられます。

あと、%03dというのがあります。3桁幅に合わせますが、空白ではなく 0 で埋めます。
" 25"  "025"
  %3d   %03d
2つは、←、↓、↑、→の順に、上部は押されているかどうか。下部は連続入力数(最大値127)を表します。

Re:ゲームのバグについて

Posted: 2009年3月16日(月) 18:55
by ひよこ
わかりました。回答してくださりありがとうございました。