ページ 11

止まります

Posted: 2011年8月28日(日) 16:09
by KSK
お願いします。
以前添付させていただいた、SolidFighters.cppについての質問なのですが、
Xキーを押してattack関数を実行すると、モデルが表示されるまでに一瞬、間が出来るのは何故なのでしょうか?
因みにWindows7&Visual C++ 2010です。
よろしくお願いします。

Re: 止まります

Posted: 2011年8月28日(日) 16:33
by softya(ソフト屋)
これですね?

「透ける! • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... 834#p73834

現状のコードをないので詳細は分かりませんが、キーの処理の後の描画処理がないと1フレーム遅れますが、それが原因ではありませんか?

Re: 止まります

Posted: 2011年8月28日(日) 16:42
by KSK
その関数は変えていませんので、そのままです。
1フレーム以上な気がします。

Re: 止まります

Posted: 2011年8月28日(日) 16:44
by softya(ソフト屋)
想像で話していてもしょうが無いので、ソースコードをお願いします。

Re: 止まります

Posted: 2011年8月28日(日) 18:02
by KSK

コード:

#include <DxLib.h>


typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}redball;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}bluecube;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}yellowpyramid;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}darkball;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}darkcube;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}darkpyramid;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}darkstar;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}p1;
typedef struct
{
	int model_normal;
	float x;
	float y;
	float speed;
	float width;
	float height;
	int model_attack;
}enemy;
typedef struct
{
	int model;
	float x;
	float y;
	float z;
	int back;
	int BGM;
}stage_1;

typedef struct
{
	int attack;
	int special;
	int shield;
	int grab;
	int appeal;
	int up;
	int down;
	int right;
	int left;
	int jump;
	int pause;
}key;

typedef struct
{
	float x;
	float y;
	float z;
}camera;

typedef struct
{
	float x;
    float y;
	float width;
	float height;
	float center_x;
	float center_y;
}screen;

typedef struct
{
	int frame_1_x;
	int frame_1_y;
	int frame_1_graph;
	int frame_2_x;
	int frame_2_y;
	int frame_2_graph;
	int back;
	int keyflag;
	int selectsound;
	int chosesound;
}menu_t;

int attack(float attack_x,float attack_y,int attack_model)
{
	MV1SetPosition(attack_model,VGet(attack_x,attack_y,0.0f));
	MV1DrawModel(attack_model);
	return 0;
}
int attack_side(float attack_side_x,float attack_side_y,int attack_side_model)
{
	MV1SetPosition(attack_side_model,VGet(attack_side_x,attack_side_y,0.0f));
	MV1DrawModel(attack_side_model);
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	int DesktopWidth;
	int DesktopHeight;
	int DesktopColorBitDepth;
	redball rb;
	bluecube bc;
	yellowpyramid yp;
	darkball db;
	darkcube dc;
	darkpyramid dp;
	darkstar ds;
	p1 p1;
	enemy enemy;
	stage_1 stage_1;
	key key;
	camera camera;
	screen screen;
	menu_t menu;

	//GetDefaultState(&DesktopWidth,&DesktopHeight,&DesktopColorBitDepth);
	SetGraphMode(1024,768,16);
	SetWindowIconID(100);
	SetMainWindowText("SolidFighters");

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

	SetDrawScreen(DX_SCREEN_BACK);


	//REDBALL構造体
	rb.model_normal=MV1LoadModel("data\\characters\\redball\\redball.mqo");
	rb.x=-500.0f;
	rb.y=-5400.0f;
	rb.speed=25.0f;
	rb.width=200.0f;
	rb.height=200.0f;
	rb.model_attack=MV1LoadModel("data\\characters\\redball\\redball_attack.mqo");
	MV1SetPosition(rb.model_attack,VGet(rb.x,rb.y,0.0f));
	//BLUECUBE構造体
	bc.model_normal=MV1LoadModel("data\\characters\\bluecube\\bluecube.mqo");
	bc.x=-500.0f;
	bc.y=-5400.0f;
	bc.speed=10.0f;
	bc.width=200.0f;
	bc.height=200.0f;
	bc.model_attack=MV1LoadModel("data\\characters\\bluecube\\bluecube_attack.mqo");
	MV1SetPosition(bc.model_attack,VGet(bc.x,bc.y,0.0f));
	//YELLOWPYRAMID構造体
	yp.model_normal=MV1LoadModel("data\\characters\\yellowpyramid\\yellowpyramid.mqo");
	yp.x=-500.0f;
	yp.y=-5400.0f;
	yp.speed=50.0f;
	yp.width=200.0f;
	yp.height=200.0f;
	yp.model_attack=MV1LoadModel("data\\characters\\yellowpyramid\\yellowpyramid_attack.mqo");
	MV1SetPosition(yp.model_attack,VGet(yp.x,yp.y,0.0f));
	//DARKBALL構造体
	db.model_normal=MV1LoadModel("data\\characters\\darkball\\darkball.mqo");
	db.x=500.0f;
	db.y=-5400.0f;
	db.speed=50.0f;
	db.width=200.0f;
	db.height=200.0f;
	db.model_attack=MV1LoadModel("data\\characters\\darkball\\darkball_attack.mqo");
	MV1SetPosition(db.model_attack,VGet(db.x,db.y,0.0f));
	//DARKCUBE構造体
	dc.model_normal=MV1LoadModel("data\\characters\\darkcube\\darkcube.mqo");
	dc.x=500.0f;
	dc.y=-5400.0f;
	dc.speed=50.0f;
	dc.width=200.0f;
	dc.height=200.0f;
	dc.model_attack=MV1LoadModel("data\\characters\\darkcube\\darkcube_attack.mqo");
	MV1SetPosition(dc.model_attack,VGet(dc.x,dc.y,0.0f));
	//DARKPYRAMID構造体
	dp.model_normal=MV1LoadModel("data\\characters\\darkpyramid\\darkpyramid.mqo");
	dp.x=500.0f;
	dp.y=-5400.0f;
	dp.speed=50.0f;
	dp.width=200.0f;
	dp.height=200.0f;
	dp.model_attack=MV1LoadModel("data\\characters\\darkpyramid\\darkpyramid_attack.mqo");
	MV1SetPosition(dp.model_attack,VGet(dp.x,dp.y,0.0f));
	//DARKSTAR構造体
	ds.model_normal=MV1LoadModel("data\\characters\\darkstar\\darkstar.mqo");
	ds.x=500.0f;
	ds.y=-5400.0f;
	ds.speed=50.0f;
	ds.width=200.0f;
	ds.height=200.0f;
	ds.model_attack=MV1LoadModel("data\\characters\\darkstar\\darkpyramid_star.mqo");
	MV1SetPosition(ds.model_attack,VGet(ds.x,ds.y,0.0f));
	//STAGE_1構造体
	stage_1.model=MV1LoadModel("data\\stages\\stage_1\\stage_1.mqo");
	stage_1.x=0.0f;
	stage_1.y=-5500.0f;
	stage_1.back=LoadGraph("data\\stages\\stage_1\\stage_1_back.png",TRUE);
	stage_1.BGM=LoadSoundMem("data\\stages\\stage_1\\stage_1.mp3");
	//KEY構造体
	key.attack=(KEY_INPUT_Z);
	key.special=(KEY_INPUT_X);
	key.shield=(KEY_INPUT_C);
	key.grab=(KEY_INPUT_D);
	key.appeal=(KEY_INPUT_S);
	key.up=(KEY_INPUT_UP);
	key.down=(KEY_INPUT_DOWN);
	key.right=(KEY_INPUT_RIGHT);
	key.left=(KEY_INPUT_LEFT);
	key.jump=(KEY_INPUT_UP);
	key.pause=(KEY_INPUT_RETURN);
	//CAMERA構造体
	camera.x=0.0f;
	camera.y=-5000.0f;
	camera.z=-2000.0f;
	//SCREEN構造体
	screen.x=0.0f;
	screen.y=0.0f;
	screen.width=1024.0f;
	screen.height=768.0f;
	screen.center_x=(screen.x+screen.width)/2.0f;
	screen.center_y=(screen.y+screen.height)/2.0f-250.0f;
	//MENU構造体
	menu.frame_1_x=32;
	menu.frame_1_y=32;
	menu.frame_1_graph=LoadGraph("data\\menu\\frame_1.bmp");
	menu.frame_2_graph=LoadGraph("data\\menu\\frame_2.bmp");
	menu.back=LoadGraph("data\\menu\\back.bmp");
	menu.keyflag=0;
	menu.selectsound=LoadSoundMem("data\\menu\\select.wav");
	menu.chosesound=LoadSoundMem("data\\menu\\chose.wav");

	int bright;
	float jumppower;
	jumppower=0.0f;
    int moveflag;
	moveflag=0;
	int keyflag;
	keyflag=0;
	int battle_start_1;
	battle_start_1=LoadGraph("data\\menu\\BATTLE_START_1.bmp");
	int lose_x;
	lose_x=0;
	int lose_y;
	lose_y=-768;
	int lose;
	lose=LoadGraph("data\\menu\\lose.bmp");
	int black;
	black=LoadGraph("data\\menu\\black.bmp");
	int alpha;
	alpha=0;
	int counter_battle_start;
	counter_battle_start=0;
	int counter_bright;
	counter_bright=0;
	int counter_combo;
	counter_combo=0;

	while(!ProcessMessage()&&!ClearDrawScreen())
	{
		DrawGraph(0,0,menu.back,FALSE);
		DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_1_graph,TRUE);
		if(menu.keyflag==0)
		{
			if(menu.frame_1_x==32&&CheckHitKey(key.right))
			{
				menu.frame_1_x=352;
				PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
			}
			else if(menu.frame_1_x==352&&CheckHitKey(key.right))
			{
				menu.frame_1_x=672;
				PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
			}
            else if(menu.frame_1_x==352&&CheckHitKey(key.left))
			{
				menu.frame_1_x=32;
				PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
			}
            else if(menu.frame_1_x==672&&CheckHitKey(key.left))
			{
				menu.frame_1_x=352;
				PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
			}
			if(menu.frame_1_x==32&&CheckHitKey(key.pause))
			{
				menu.frame_1_graph=menu.frame_2_graph;
				DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
				PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
				p1.model_normal=rb.model_normal;
				p1.x=rb.x;
				p1.y=rb.y;
				p1.speed=rb.speed;
				p1.height=rb.height;
				p1.model_attack=rb.model_attack;
				break;
			}
			if(menu.frame_1_x==352&&CheckHitKey(key.pause))
			{
				menu.frame_1_graph=menu.frame_2_graph;
				DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
				PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
				p1.model_normal=bc.model_normal;
				p1.x=bc.x;
				p1.y=bc.y;
				p1.speed=bc.speed;
				p1.height=bc.height;
				p1.model_attack=bc.model_attack;
				break;
			}
			if(menu.frame_1_x==672&&CheckHitKey(key.pause))
			{
				menu.frame_1_graph=menu.frame_2_graph;
				DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
				PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
				p1.model_normal=yp.model_normal;
				p1.x=yp.x;
				p1.y=yp.y;
				p1.speed=yp.speed;
				p1.height=yp.height;
				p1.model_attack=yp.model_attack;
				break;
			}
			if(CheckHitKey(KEY_INPUT_ESCAPE))
		    {
				goto END;
		    }
		}
		if(CheckHitKeyAll()) menu.keyflag=1;
		if(!CheckHitKeyAll()) menu.keyflag=0;

		ScreenFlip();
	}

	DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
	for(bright=255;bright>0;bright-=5)
	{
		ClearDrawScreen();
		if(CheckHitKey(KEY_INPUT_ESCAPE)) break;
		DrawGraph(0,0,menu.back,FALSE);
		DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
		SetDrawBright(bright,bright,bright);
		ScreenFlip();
	}

	SetDrawBright(255,255,255);

	enemy.model_normal=db.model_normal;
	enemy.x=db.x;
	enemy.y=db.y;
	enemy.speed=db.speed;
	enemy.width=db.width;
	enemy.height=db.height;
	enemy.model_attack=db.model_attack;

	while(!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(key.pause))
	{
		counter_battle_start++;
		if(counter_battle_start<300)
		{
			DrawGraph(0,0,battle_start_1,FALSE);
		}
		else
		{
			break;
		}
		if(CheckHitKey(KEY_INPUT_ESCAPE))
		{
			goto END;
		}
		ScreenFlip();
	}
	bright=255;
	counter_battle_start=0;

	PlaySoundMem(stage_1.BGM,DX_PLAYTYPE_LOOP);

	while(!ProcessMessage()&&!ClearDrawScreen())
	{
		SetCameraPositionAndTargetAndUpVec(VGet(camera.x,camera.y,camera.z),VGet(stage_1.x,stage_1.y,0.0f),VGet(0.0f,1.0f,0.0f));
		SetLightDirection(VGet(-1.0f,-10.0f,1.0f));
		if(CheckHitKey(key.right)&&CheckHitKey(key.special))
		{
			counter_combo++;
		}
		if(CheckHitKey(key.right)&&moveflag==0)
		{
			p1.x+=p1.speed;
		}
		if(CheckHitKey(key.left)&&moveflag==0)
		{
			p1.x-=p1.speed;
		}
		p1.y+=jumppower;
		jumppower-=1.0f;
		if(p1.y==-5400.0f&&p1.x>-1100.0f&&p1.x<1100.0f)
		{
			p1.y=-5400.0f;
			jumppower=0.0f;
		}
		if(CheckHitKey(key.jump))
		{
			if(moveflag==0)
			{
				if(p1.y==-5400.0f)
				{
					if(keyflag==0)
			        {
						jumppower=25.0f;
					}
			    }
			    keyflag=1;
			}
		}
		else
		{			
			keyflag=0;
		}
		DrawGraph(0,0,stage_1.back,FALSE);
		//DrawFormatString(0,0,GetColor(255,0,0),"%g,%g",p1.x,p1.y);
		MV1SetPosition(p1.model_normal,VGet(p1.x,p1.y,0.0f));
		MV1DrawModel(p1.model_normal);
		//MV1SetPosition(p1.model_attack,VGet(p1.x,p1.y,0.0f));
		MV1SetPosition(enemy.model_normal,VGet(enemy.x,enemy.y,0.0f));
		MV1DrawModel(enemy.model_normal);
		MV1SetPosition(stage_1.model,VGet(stage_1.x,stage_1.y,0.0f));
		MV1DrawModel(stage_1.model);
		DrawGraph(lose_x,lose_y,lose,TRUE);
		if(p1.y<=-8000.0f)
		{
			counter_bright++;
			p1.x=-1100.0f;
			p1.y=-8000.0f;
			if(lose_y!=0)
			{
				lose_y+=6;
			}
			if(counter_bright>=300)
			{
				SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);
				DrawGraph(0,0,black,FALSE);
				alpha++;
				if(alpha>=255)
				{
					if(counter_bright>=600)
					{
						goto END;
					}
				}
			}
		}
		if(CheckHitKey(key.special))
		{
			attack(p1.x,p1.y,p1.model_attack);
			moveflag=1;
		}
		else
		{
			moveflag=0;
		}
		if(CheckHitKey(KEY_INPUT_ESCAPE))
		{
			goto END;
		}

		ScreenFlip();
	}

    END:

	DxLib_End();
	return 0;
}

Re: 止まります

Posted: 2011年8月28日(日) 18:10
by softya(ソフト屋)
えーと前になかったwhileループが増えているだけど?
while(!ProcessMessage()&&!ClearDrawScreen())
こんな事するとタイミング制御に失敗すると思いますよ。

普通は、
「34. メイン関数の書き方。」
http://dixq.net/g/37.html
と言うテクニックでwhileはひとつにします。

あとWinMain関数が長すぎるので関数分けを推奨します。

Re: 止まります

Posted: 2011年8月28日(日) 19:34
by KSK
読んでみましたが、よく分かりません。
softyaさんならどう分けますか?

Re: 止まります

Posted: 2011年8月28日(日) 19:40
by softya(ソフト屋)
まずメニューとゲーム本編と最後のをswitchで処理を切り分けて、それぞれ関数にして呼び出します。
[追記]
whileループはWinMain側に残しますので、各関数にはwhileループもScreenFlipもProcessMessage()&&!ClearDrawScreenもありません。

Re: 止まります

Posted: 2011年8月28日(日) 19:41
by Dixq (管理人)
すごい数の変数と同じ処理が・・。

DXライブラリにおける、必ず毎フレーム行わなければならない処理
ProcessMessage()
ClearDrawScreen()
ScreenFlip()
を3大プロセスと呼ぶことにしましょう。
この3大プロセスは、1か所にしか書かないよう、最初は努力して下さい。
同じ関数が2か所以上に出てきたらそれは設計が変です。

何か処理を終えたらループを抜けて下に行くのではなく、毎回メインループは同じところを回り、コールする先を変更するようにして下さい。

こちらにサンプルコードを書きましたのでご覧ください。
http://dixq.net/forum/viewtopic.php?f=3&t=9166#p74294

Re: 止まります

Posted: 2011年8月28日(日) 19:42
by box
同じメンバー構成を持っている複数の構造体にそれぞれ別名を与えている箇所は、
1つにまとめられるのではないかと思います。

本題とは無関係な、どうでもいいことかもしれませんが。

Re: 止まります

Posted: 2011年8月29日(月) 20:56
by KSK
すみません。
このように分けたのですが、おかしな事になってしまいました。

コード:

#include <DxLib.h>
 
 
enum STATUS
{
	STATUS_GAME_START,
	STATUS_MENU,
	STATUS_BATTLE_START_1,
	STATUS_BATTLE_1,
	STATUS_BATTLE_START_2,
	STATUS_BATTLE_2,
	STATUS_BATTLE_START_3,
	STATUS_BATTLE_3,
	STATUS_BATTLE_START_FINAL,
	STATUS_BATTLE_FINAL,
	STATUS_WIN,
	STATUS_LOSE,
};

typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}redball;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}bluecube;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}yellowpyramid;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}darkball;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}darkcube;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}darkpyramid;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}darkstar;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}p1_t;
typedef struct
{
    int model_normal;
    float x;
    float y;
    float speed;
    float width;
    float height;
    int model_attack;
}enemy_t;
typedef struct
{
    int model;
    float x;
    float y;
    float z;
    int back;
    int BGM;
}stage_1_t;
 
typedef struct
{
    int attack;
    int special;
    int shield;
    int grab;
    int appeal;
    int up;
    int down;
    int right;
    int left;
    int jump;
    int pause;
}key_t;
 
typedef struct
{
    float x;
    float y;
    float z;
}camera_t;
 
typedef struct
{
    float x;
    float y;
    float width;
    float height;
    float center_x;
    float center_y;
}screen_t;
 
typedef struct
{
    int frame_1_x;
    int frame_1_y;
    int frame_1_graph;
    int frame_2_x;
    int frame_2_y;
    int frame_2_graph;
    int back;
    int keyflag;
    int selectsound;
    int chosesound;
}menu_t;

STATUS Status=STATUS_MENU;
redball rb;
bluecube bc;
yellowpyramid yp;
darkball db;
darkcube dc;
darkpyramid dp;
darkstar ds;
p1_t p1;
enemy_t enemy;
stage_1_t stage_1;
key_t key;
camera_t camera;
screen_t screen;
menu_t menu;
int bright;
float jumppower;
int moveflag;
int keyflag;
int battle_start_1;
int lose_x;
int lose_y;
int lose;
int black;
int alpha;
int counter_battle_start;
int counter_bright;
int counter_combo;
int BGM_volume;

int attack(float attack_x,float attack_y,int attack_model)
{
    MV1SetPosition(attack_model,VGet(attack_x,attack_y,0.0f));
    MV1DrawModel(attack_model);
    return 0;
}
int attack_side(float attack_side_x,float attack_side_y,int attack_side_model)
{
    MV1SetPosition(attack_side_model,VGet(attack_side_x,attack_side_y,0.0f));
    MV1DrawModel(attack_side_model);
    return 0;
}
void MENU()
{
	DrawGraph(0,0,menu.back,FALSE);
    DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_1_graph,TRUE);
    if(menu.keyflag==0)
	{
		if(menu.frame_1_x==32&&CheckHitKey(key.right))
        {
			menu.frame_1_x=352;
            PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
        }
        else if(menu.frame_1_x==352&&CheckHitKey(key.right))
        {
			menu.frame_1_x=672;
            PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
        }
        else if(menu.frame_1_x==352&&CheckHitKey(key.left))
        {
            menu.frame_1_x=32;
            PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
        }
        else if(menu.frame_1_x==672&&CheckHitKey(key.left))
        {
            menu.frame_1_x=352;
            PlaySoundMem(menu.selectsound,DX_PLAYTYPE_BACK);
        }
        if(menu.frame_1_x==32&&CheckHitKey(key.pause))
        {
            menu.frame_1_graph=menu.frame_2_graph;
            DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
            PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
            p1.model_normal=rb.model_normal;
            p1.x=rb.x;
            p1.y=rb.y;
            p1.speed=rb.speed;
            p1.height=rb.height;
            p1.model_attack=rb.model_attack;
            Status=STATUS_BATTLE_START_1;
			for(bright=255;bright>0;bright-=5)
			{
				SetDrawBright(bright,bright,bright);
			}
        }
        if(menu.frame_1_x==352&&CheckHitKey(key.pause))
        {
            menu.frame_1_graph=menu.frame_2_graph;
            DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
            PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
            p1.model_normal=bc.model_normal;
            p1.x=bc.x;
            p1.y=bc.y;
            p1.speed=bc.speed;
            p1.height=bc.height;
            p1.model_attack=bc.model_attack;
            Status=STATUS_BATTLE_START_1;
			for(bright=255;bright>0;bright-=5)
			{
				SetDrawBright(bright,bright,bright);
			}
        }
        if(menu.frame_1_x==672&&CheckHitKey(key.pause))
        {
            menu.frame_1_graph=menu.frame_2_graph;
            DrawGraph(menu.frame_1_x,menu.frame_1_y,menu.frame_2_graph,TRUE);
            PlaySoundMem(menu.chosesound,DX_PLAYTYPE_NORMAL);
            p1.model_normal=yp.model_normal;
            p1.x=yp.x;
            p1.y=yp.y;
            p1.speed=yp.speed;
            p1.height=yp.height;
            p1.model_attack=yp.model_attack;
            Status=STATUS_BATTLE_START_1;
			for(bright=255;bright>0;bright-=5)
			{
				SetDrawBright(bright,bright,bright);
			}
		}
    }
    if(CheckHitKeyAll()) menu.keyflag=1;
    if(!CheckHitKeyAll()) menu.keyflag=0;
}
void BATTLE_START_1()
{
	counter_battle_start++;
    if(counter_battle_start<300)
    {
		DrawGraph(0,0,battle_start_1,FALSE);
    }
    else
    {
		Status=STATUS_BATTLE_1;
    }
}
void BATTLE_1()
{
	ChangeVolumeSoundMem(BGM_volume,stage_1.BGM);
    SetCameraPositionAndTargetAndUpVec(VGet(camera.x,camera.y,camera.z),VGet(stage_1.x,stage_1.y,0.0f),VGet(0.0f,1.0f,0.0f));
    SetLightDirection(VGet(-1.0f,-10.0f,1.0f));
    if(CheckHitKey(key.right)&&CheckHitKey(key.special))
    {
		counter_combo++;
    }
    if(CheckHitKey(key.right)&&moveflag==0)
    {
        p1.x+=p1.speed;
    }
    if(CheckHitKey(key.left)&&moveflag==0)
    {
        p1.x-=p1.speed;
    }
    p1.y+=jumppower;
    jumppower-=1.0f;
    if(p1.y==-5400.0f&&p1.x>-1100.0f&&p1.x<1100.0f)
    {
        p1.y=-5400.0f;
        jumppower=0.0f;
    }
    if(CheckHitKey(key.jump))
    {
        if(moveflag==0)
        {
            if(p1.y==-5400.0f)
            {
                if(keyflag==0)
                {
                    jumppower=25.0f;
                }
            }
            keyflag=1;
        }
    }
    else
    {           
        keyflag=0;
    }
    DrawGraph(0,0,stage_1.back,FALSE);
    //DrawFormatString(0,0,GetColor(255,0,0),"%g,%g",p1.x,p1.y);
    MV1SetPosition(p1.model_normal,VGet(p1.x,p1.y,0.0f));
    MV1DrawModel(p1.model_normal);
    //MV1SetPosition(p1.model_attack,VGet(p1.x,p1.y,0.0f));
    MV1SetPosition(enemy.model_normal,VGet(enemy.x,enemy.y,0.0f));
    MV1DrawModel(enemy.model_normal);
    MV1SetPosition(stage_1.model,VGet(stage_1.x,stage_1.y,0.0f));
    MV1DrawModel(stage_1.model);
    DrawGraph(lose_x,lose_y,lose,TRUE);
    if(p1.y<=-8000.0f)
    {
        counter_bright++;
        p1.x=-1100.0f;
        p1.y=-8000.0f;
        if(lose_y!=0)
        {
            lose_y+=6;
        }
        if(counter_bright>=300)
        {
            SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);
            DrawGraph(0,0,black,FALSE);
            alpha++;
			BGM_volume--;
            if(alpha>=255)
            {
                if(counter_bright>=600)
                {
					Status=STATUS_LOSE;
                }
            }
        }
    }
    if(CheckHitKey(key.special))
    {
        attack(p1.x,p1.y,p1.model_attack);
        moveflag=1;
    }
    else
    {
        moveflag=0;
	}
}
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	SetGraphMode(1024,768,16);
    SetWindowIconID(100);
    SetMainWindowText("SolidFighters");
 
    ChangeWindowMode(TRUE);
    if(DxLib_Init()==-1) return -1;
    SetDrawScreen(DX_SCREEN_BACK);
 
 
    //REDBALL構造体
    rb.model_normal=MV1LoadModel("data\\characters\\redball\\redball.mqo");
    rb.x=-500.0f;
    rb.y=-5400.0f;
    rb.speed=25.0f;
    rb.width=200.0f;
    rb.height=200.0f;
    rb.model_attack=MV1LoadModel("data\\characters\\redball\\redball_attack.mqo");
    MV1SetPosition(rb.model_attack,VGet(rb.x,rb.y,0.0f));
    //BLUECUBE構造体
    bc.model_normal=MV1LoadModel("data\\characters\\bluecube\\bluecube.mqo");
    bc.x=-500.0f;
    bc.y=-5400.0f;
    bc.speed=10.0f;
    bc.width=200.0f;
    bc.height=200.0f;
    bc.model_attack=MV1LoadModel("data\\characters\\bluecube\\bluecube_attack.mqo");
    MV1SetPosition(bc.model_attack,VGet(bc.x,bc.y,0.0f));
    //YELLOWPYRAMID構造体
    yp.model_normal=MV1LoadModel("data\\characters\\yellowpyramid\\yellowpyramid.mqo");
    yp.x=-500.0f;
    yp.y=-5400.0f;
    yp.speed=50.0f;
    yp.width=200.0f;
    yp.height=200.0f;
    yp.model_attack=MV1LoadModel("data\\characters\\yellowpyramid\\yellowpyramid_attack.mqo");
    MV1SetPosition(yp.model_attack,VGet(yp.x,yp.y,0.0f));
    //DARKBALL構造体
    db.model_normal=MV1LoadModel("data\\characters\\darkball\\darkball.mqo");
    db.x=500.0f;
    db.y=-5400.0f;
    db.speed=50.0f;
    db.width=200.0f;
    db.height=200.0f;
    db.model_attack=MV1LoadModel("data\\characters\\darkball\\darkball_attack.mqo");
    MV1SetPosition(db.model_attack,VGet(db.x,db.y,0.0f));
    //DARKCUBE構造体
    dc.model_normal=MV1LoadModel("data\\characters\\darkcube\\darkcube.mqo");
    dc.x=500.0f;
    dc.y=-5400.0f;
    dc.speed=50.0f;
    dc.width=200.0f;
    dc.height=200.0f;
    dc.model_attack=MV1LoadModel("data\\characters\\darkcube\\darkcube_attack.mqo");
    MV1SetPosition(dc.model_attack,VGet(dc.x,dc.y,0.0f));
    //DARKPYRAMID構造体
    dp.model_normal=MV1LoadModel("data\\characters\\darkpyramid\\darkpyramid.mqo");
    dp.x=500.0f;
    dp.y=-5400.0f;
    dp.speed=50.0f;
    dp.width=200.0f;
    dp.height=200.0f;
    dp.model_attack=MV1LoadModel("data\\characters\\darkpyramid\\darkpyramid_attack.mqo");
    MV1SetPosition(dp.model_attack,VGet(dp.x,dp.y,0.0f));
    //DARKSTAR構造体
    ds.model_normal=MV1LoadModel("data\\characters\\darkstar\\darkstar.mqo");
    ds.x=500.0f;
    ds.y=-5400.0f;
    ds.speed=50.0f;
    ds.width=200.0f;
    ds.height=200.0f;
    ds.model_attack=MV1LoadModel("data\\characters\\darkstar\\darkpyramid_star.mqo");
    MV1SetPosition(ds.model_attack,VGet(ds.x,ds.y,0.0f));
    //STAGE_1構造体
    stage_1.model=MV1LoadModel("data\\stages\\stage_1\\stage_1.mqo");
    stage_1.x=0.0f;
    stage_1.y=-5500.0f;
    stage_1.back=LoadGraph("data\\stages\\stage_1\\stage_1_back.png",TRUE);
    stage_1.BGM=LoadSoundMem("data\\stages\\stage_1\\stage_1.mp3");
    //KEY構造体
    key.attack=(KEY_INPUT_Z);
    key.special=(KEY_INPUT_X);
    key.shield=(KEY_INPUT_C);
    key.grab=(KEY_INPUT_D);
    key.appeal=(KEY_INPUT_S);
    key.up=(KEY_INPUT_UP);
    key.down=(KEY_INPUT_DOWN);
    key.right=(KEY_INPUT_RIGHT);
    key.left=(KEY_INPUT_LEFT);
    key.jump=(KEY_INPUT_UP);
    key.pause=(KEY_INPUT_RETURN);
    //CAMERA構造体
    camera.x=0.0f;
    camera.y=-5000.0f;
    camera.z=-2000.0f;
    //SCREEN構造体
    screen.x=0.0f;
    screen.y=0.0f;
    screen.width=1024.0f;
    screen.height=768.0f;
    screen.center_x=(screen.x+screen.width)/2.0f;
    screen.center_y=(screen.y+screen.height)/2.0f-250.0f;
    //MENU構造体
    menu.frame_1_x=32;
    menu.frame_1_y=32;
    menu.frame_1_graph=LoadGraph("data\\menu\\frame_1.bmp");
    menu.frame_2_graph=LoadGraph("data\\menu\\frame_2.bmp");
    menu.back=LoadGraph("data\\menu\\back.bmp");
    menu.keyflag=0;
    menu.selectsound=LoadSoundMem("data\\menu\\select.wav");
    menu.chosesound=LoadSoundMem("data\\menu\\chose.wav");
 
    bright=255;
    jumppower=0.0f;
    moveflag=0;
    keyflag=0;
    battle_start_1=LoadGraph("data\\menu\\BATTLE_START_1.bmp");
    lose_x=0;
    lose_y=-768;
    lose=LoadGraph("data\\menu\\lose.bmp");
    black=LoadGraph("data\\menu\\black.bmp");
    alpha=0;
    counter_battle_start=0;
    counter_bright=0;
    counter_combo=0;
	BGM_volume=255;
 
	while(!ProcessMessage()&&!ScreenFlip()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE))
	{
		switch(Status)
		{
			case STATUS_MENU:
				MENU();
			case STATUS_BATTLE_START_1:
				BATTLE_START_1();
			case STATUS_BATTLE_1:
				BATTLE_1();
			case STATUS_LOSE:
				break;
		}
	}

    DxLib_End();
    return 0;
}
どうしたら良いのでしょうか?

Re: 止まります

Posted: 2011年8月29日(月) 22:02
by softya(ソフト屋)
とりあえずswitch文の変なところ(break抜け)を修正しました。

コード:

    while(!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE))
    {
        switch(Status)
        {
            case STATUS_MENU:
                MENU();
                break;
            case STATUS_BATTLE_START_1:
                BATTLE_START_1();
                break;
            case STATUS_BATTLE_1:
                BATTLE_1();
                break;
            case STATUS_LOSE:
                break;
        }
        ScreenFlip();
    }
それでも変なので、上の修正を入れた上で現状の問題点を詳しくもう一度説明してください。
あと、前回よりデータ増えてません?
1167:モデルファイル data\characters\bluecube\bluecube_attack.mqo が読み込めませんでした
1174:モデルファイル data\characters\yellowpyramid\yellowpyramid_attack.mqo が読み込めませんでした
1178:モデルファイル data\characters\darkball\darkball.mqo が読み込めませんでした
1182:モデルファイル data\characters\darkball\darkball_attack.mqo が読み込めませんでした
1186:モデルファイル data\characters\darkcube\darkcube.mqo が読み込めませんでした
1190:モデルファイル data\characters\darkcube\darkcube_attack.mqo が読み込めませんでした
1194:モデルファイル data\characters\darkpyramid\darkpyramid.mqo が読み込めませんでした
1199:モデルファイル data\characters\darkpyramid\darkpyramid_attack.mqo が読み込めませんでした
1202:モデルファイル data\characters\darkstar\darkstar.mqo が読み込めませんでした
1206:モデルファイル data\characters\darkstar\darkpyramid_star.mqo が読み込めませんでした
1265:右記のファイルのオープンに失敗しました:data\stages\stage_1\stage_1.mp3
1268:右記の音声ファイルのロードに失敗しました_1:data\stages\stage_1\stage_1.mp3
1307:グラフィックファイル data\menu\BATTLE_START_1.bmp がありません
1312:グラフィックファイル data\menu\lose.bmp がありません
1316:グラフィックファイル data\menu\black.bmp がありません
と出るので、こちらでは問題点を確認できません。
最新のデータを頂きたいです。

[追記]
あと、問題の処理が何処かわからないので関係する部分にだけでもコメントをお願いします。

Re: 止まります

Posted: 2011年8月29日(月) 23:25
by Dixq (管理人)
boxさんも言ってますが、重複している要素が多すぎる気がします。
用意している構造体や変数、処理等は本当に全部必要ですか?
例えば

redball;
bluecube;
yellowpyramid;
darkball;
darkcube;
darkpyramid;
darkstar;
p1_t;
enemy_t;

は全て要素が同じなので一つで良いですよね。
値の代入も、全く同じことをするならループで回さないと間違いの元だし、手間もかかると思います。

CheckHitKey系があちこちにありますが、1ループに1度全てのキーの入力状態を保存しておけばいちいちこの関数をコールする必要はないです。

計算部と描画部は明確にわけておかないと描画順序等をソートしたくなっても出来なくなってしまうと思います。

ということで、非効率なコードのままコードが肥大化しているようなので、もう少し単純なコードでスマートに書けるようにしてみませんか?

Re: 止まります

Posted: 2011年8月30日(火) 12:03
by KSK
実行して頂ければわかると思います。
お願いします。

Re: 止まります

Posted: 2011年8月30日(火) 12:29
by softya(ソフト屋)
現状で確認出来るのは、最初選択画面を選ぶと黒い画面が表示されること(STATUS_BATTLE_START_1の状態)でしょうか?

[追記]
これは、MENUの終りにSetDrawBright(5,5,5);が実行されているのが原因です。
関数を抜けるときにはSetDrawBright(255,255,255);に戻しておきましょう。

あと、フェードアウトのつもりみたいですが、

コード:

			for(bright=255;bright>0;bright-=5)
			{
				SetDrawBright(bright,bright,bright);
			}
1フレーム内で255→5まで変化しています。
フレームごとに処理しないと意味がありませんよ。

[追記の追記]
Dixq (管理人)さんも言われているように全体を整理しないと他者がソースコードを読み解くことがかなり困難な状態になっています。
ご自分のためにも整理される事をお勧めします。

Re: 止まります

Posted: 2012年4月14日(土) 22:45
by KSK
すみません、いろいろあってかなり遅れました。
ありがとうございました。