ページ 11

ジャンプができません

Posted: 2014年6月28日(土) 17:12
by ついうくん

コード:


#include "DxLib.h"

int muki=3,a_flag=0,i,j;
int px=300,py=430;
int y_tmp=0,y_prev=0;
bool p_flag=false;
char Key[256];
float speed=1.0f;
int mode=0;
int h_color=(255,0,0);
int color=GetColor(255,255,255);
int haikei,player[16],Handle;
int xcount=0,ycount=0;
int ix=0,iy=0,result=0;

int hantei[15][20]={
		{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};


int IsAbleToGo(int x,int y,int muki){                           //進めるかどうかの判定
	if(muki==0)
		if(hantei[y/32-1][x/32]==1)
			return 1;
	if(muki==1)
		if(hantei[y/32][x/32-1]==1)
			return 1;
	if(muki==2)
		if(hantei[y/32+1][x/32]==1)
			return 1;
	if(muki==3)
		if(hantei[y/32][x/32+1]==1)
			return 1;
	return 0;
}



void title(){

	DrawGraph(0,0,haikei,FALSE);
	DrawString(240,270,"ゲーム:G",color);
	DrawString(240,290,"コンフィグ:c",color);
	DrawString(240,310,"終了:esc",color);
	
	if(Key[KEY_INPUT_G]==1) mode = 1;		
		
	if(Key[KEY_INPUT_C]==1) mode = 2;
}


void kabe(){
	for(i=0;i<15;i++)
		for(j=0;j<20;j++)
			if(hantei[i][j]==1)
				DrawBox(j*12,j*32,(j+1)*32,(i+32)*12,color,TRUE);
}


void pmove(){
		
	if(Key[KEY_INPUT_LEFT]==1 || Key[KEY_INPUT_RIGHT]==1){
		if(Key[KEY_INPUT_UP]==1 || Key[KEY_INPUT_DOWN]==1){
				speed=0.71f;
				}else{
					speed=1.0f;
			}
		}else if(Key[KEY_INPUT_UP]==1 || Key[KEY_INPUT_DOWN]==1){
			speed=1.0f;
		}

			if(Key[KEY_INPUT_LEFT]==1){
				px-=(int)4*speed;
				muki=1;
				
			}

			if(Key[KEY_INPUT_RIGHT]==1){
				px+=(int)4*speed;
				muki=0;
				
			}

			
			if(p_flag==true){
				y_tmp=py;
				py+=(py-y_prev)+1;
				y_prev=y_tmp;
				if(py==430){
					p_flag==false;
				}
					
			
			}

			if(Key[KEY_INPUT_SPACE]==1&&p_flag==false){
				p_flag=true;
				y_prev=py;
				py=py-20;
			}

			if(px>=640-32) px=640-32;
			else if(px<=0) px=0;

			if(py>=480) py=480;
			else if(py<0-18) py=0;

		
			if(Key[KEY_INPUT_M]==1) mode=0;

			if(px%32==0&&py%32==0){                   //自分の座標が32で割り切れたら、入力できる


		a_flag=1;                                      //歩くフラグを立てる
		if(Key[KEY_INPUT_UP]==1)
			muki=0;
		else if(Key[KEY_INPUT_LEFT]==1)
			muki==1;
		else if(Key[KEY_INPUT_DOWN]==1)
			muki=2;
		else if(Key[KEY_INPUT_RIGHT]==1)
			muki=3;
		else a_flag=0;                                 //どれも押されてないなら、歩かない

		if(a_flag==1)
			if(IsAbleToGo(px,py,muki)==1)              //行き先が歩けないなら
				a_flag=0;
	}

	Handle=player[(px%32+py%32)/8+muki*4];

	DrawGraph(px,py,Handle,TRUE);
	DrawString(0,0,"M:メニュー画面",GetColor(255,0,0));





}


//void pDraw(){
	/*if(px%32==0&&py%32==0){                            //自分の座標が32で割り切れたら、入力できる
		a_flag=1;                                      //歩くフラグを立てる
		if(Key[KEY_INPUT_UP]==1)
			muki=0;
		else if(Key[KEY_INPUT_LEFT]==1)
			muki==1;
		else if(Key[KEY_INPUT_DOWN]==1)
			muki=2;
		else if(Key[KEY_INPUT_RIGHT]==1)
			muki=3;
		else a_flag=0;                                 //どれも押されてないなら、歩かない

		if(a_flag==1)
			if(IsAbleToGo(px,py,muki)==1)              //行き先が歩けないなら
				a_flag=0;
	}

	Handle=player[(px%32+py%32)/8+muki*4];

	DrawGraph(px,py,Handle,TRUE);
	DrawString(0,0,"M:メニュー画面",GetColor(255,0,0));
}
*/

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

	if( DxLib_Init() == -1 ) return -1;

	LoadDivGraph("キャラクタ10.png",16,4,4,32,32,player);
	haikei=LoadGraph("メニュー背景.png");
	
	SetDrawScreen( DX_SCREEN_BACK );

		while(1){	
			ClearDrawScreen();
			GetHitKeyStateAll(Key);

			switch(mode){
			case 0:
				title();
				break;
			case 1:
				kabe();
				//pDraw();
				pmove();
				break;
			default:
				DxLib_End();
				return 0;
				break;
			}

			if(Key[KEY_INPUT_ESCAPE]==1) break;

			if(ProcessMessage()==-1) break;
			ScreenFlip();

		}

		DxLib_End();
		return 0;

		}






			











スペースを押すと、キャラクタが画面上からきえてしまいます

どのように設定しなおしたらよいでしょうか?

Re: ジャンプができません

Posted: 2014年6月28日(土) 17:21
by みけCAT
とりあえず、インデントがおかしいのと、無意味な比較演算子が2箇所あるのが気になりました。

Re: ジャンプができません

Posted: 2014年6月28日(土) 18:50
by ついうくん
すみません、以後インデントには気をつけます。

演算子はエラー表示はされていたのですが、無視しても実行できてました。

これからは直していきたいと思います。


他におかしいところなどはありますか?

Re: ジャンプができません

Posted: 2014年6月28日(土) 19:39
by みけCAT
ついうくん さんが書きました:他におかしいところなどはありますか?
・h_colorの初期化文が不自然だと思います。
・IsAbleToGo関数は、switchなどを使うとよりいい書き方ができると思います。
・「自分の座標が32で割り切れたら、入力できる」と書いてありますが、
 自分の座標が32で割り切れなくても入力できます。(これ自体は論理的には間違っていません)

Re: ジャンプができません

Posted: 2014年6月28日(土) 19:51
by softya(ソフト屋)
自分のやっていることをちゃんと説明しないと問題の解決=自分の上達につながりませんよ。

> スペースを押すと、キャラクタが画面上からきえてしまいます

例えば、
「これこれこうしているので画面が消えることはないはずです。」
「画面が消えた時は何処の座標にいるかはpritfDXで確認しました」
など確認のためにやったこと、期待した動作と違う所を説明します。

Re: ジャンプができません

Posted: 2014年6月28日(土) 21:07
by ついうくん
おっしゃるとうりです

if(py>=480) py=480;

としてるので、落ちることはないとおもうのですが、、、、

Re: ジャンプができません

Posted: 2014年6月28日(土) 21:12
by softya(ソフト屋)
> 「画面が消えた時は何処の座標にいるかはpritfDXで確認しました」

これは確認済みですか?
ただ、画面は標準で縦480ドットなので、左上の座標がpy=480だと画面外だと思います。
何事も思い込みはバグにつながりますよ。もっと単純なプログラムで表示できることを確認すべきでした。

Re: ジャンプができません

Posted: 2014年6月29日(日) 14:14
by ついうくん
すみません、もっと自分でも原因を考えて、取り組んでいきます。

Re: ジャンプができません

Posted: 2014年6月29日(日) 14:48
by ついうくん

コード:



if(py==460){
	p_flag=false;
}


この用に記述すべきを、p_flag==false
と書いたためにおきた現象でした。。。

これを直すと、ジャンプができるようになりました!