どうしても、ゲームオーバー画面になりません。

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

どうしても、ゲームオーバー画面になりません。

#1

投稿記事 by KEYONN_ » 15年前

NES(海外のファミコンの事)プログラミングしているTKOZです。
縦スクロールSTGを作っているのですが、さすがにcでは、
asmに比べて速度が遅い事を痛感させられました。

さて、質問なのですが、ゲームオーバー画面で"GAME OVER"とスプライトで表示したいのですが、
どうしても、うまくいきません。具体的には、STARTキーを押していないのに、スプライトが
x=255,y=255に移動してしまいます。どうしてでしょうか?

追記:今度はゲームオーバーが消えなくなりました
// メイン関数
char NesMain()
{
	char r;
	const char string[/url] = "PRESS START!";
	const char string2[/url] = "STG SAMPLE01     ";
	const char palettes[/url] = {
		0x0f, 0x11, 0x21, 0x30,
		0x0f, 0x11, 0x21, 0x30,
		0x0f, 0x11, 0x21, 0x30,
		0x0f, 0x11, 0x21, 0x30,
		0x0f, 0x00, 0x10, 0x21,
		0x0f, 0x0f, 0x10, 0x21,
		0x0f, 0x09, 0x19, 0x21,
		0x0f, 0x15, 0x27, 0x30
	};
	char GameMode=TITLE;
	char y=0;
	char i;
	char prev=0;
	char cnt=0;
	Init(0);
back:
	GameMode=TITLE;
	r=*(char*)0x2002;
	if(r>0) goto back;
	Init(1);
	ShowScreen(0);
	
	
	
	// パレットを書き込み
	*(char*)0x2006 = 0x3f;
	*(char*)0x2006 = 0x00;
	for (i = 0; i < 0x20; i ++)
		*(char*)0x2007 = palettes;
	
	// ネームテーブルへ書き込み
	
	*(char*)0x2006 = 0x21;
	*(char*)0x2006 = 0xc9;
	for (i = 0; i < 16; i ++)
		*(char*)0x2007 = string2;
	//BGwrite(15,10,"STG SAMPLE01    ");
	*(char*)0x2006 = 0x22;
	*(char*)0x2006 = 0x09;
	for(i=0;i<16;i++)
	{
		*(char*)0x2007 = string;
	}
	//BGwrite(17,10,"PRESS START!");

	SetScroll(0, 0);
	ShowScreen(1);
	
	while(1){
	// メインループ
		KeyInput();
		switch(GameMode)
		{
			case TITLE:
				Title(&GameMode);
				break;
			case OPTION:
				break;
			case GAME:
				if(PauseFlag==0 && GameMode==GAME)
				{
				y--;
				}
				SetScroll(0, y);
				MainLoop();
				HitCheck2(&GameMode);
				break;
			case GAMEOVER:
				
				if((Pad & START)){cnt++;if(cnt>5){cnt=0;GameOverX=255;GameOverY=255; goto back;}}
				break;
		}
		prev=(Pad & START);
	}

	
	return 0;
}


あっ、一応ネットカフェからの書き込みなので、ご注意を。

softya

Re:どうしても、ゲームオーバー画面になりません。

#2

投稿記事 by softya » 15年前

すいません、ソースコードを見る限りスプライトを表示したりしている部分がありません。
http://crystal.freespace.jp/pgate1/nes/nes_ppu.htm
>cnt=0;GameOverX=255;GameOverY=255
これらの初期値もわかりません。

全部のソースコードを提示してもらった方が良いかもしれません。

KEYONN_

Re:どうしても、ゲームオーバー画面になりません。

#3

投稿記事 by KEYONN_ » 15年前

>>softyaさんへ

>全部のソースコードを提示してもらった方が良いかもしれません。
分かりました。
ただし、質問中にもソースコードを大分書き換えてしまった部分があるので、
ご注意ください。

ソースファイルのみを添付します。

KEYONN_

Re:どうしても、ゲームオーバー画面になりません。

#4

投稿記事 by KEYONN_ » 15年前

せっかくなので、自作ROMファイルも添付します。

softya

Re:どうしても、ゲームオーバー画面になりません。

#5

投稿記事 by softya » 15年前

失礼!最初の答えは大勘違いなので訂正しました。

ソースを見て思ったんですが、DrawSprite()ってバッファを
static char flag=0;
で管理してますよね。
で今のバッファ位置を気にせずに使っているので、前のスプライトが残ったりしますが大丈夫ですか?

で、xxとyyは
case TITLE:
xx=255;yy=255;
となってますので、GAMEOVERは必ず(255,255)に表示されます。

KEYONN_

Re:どうしても、ゲームオーバー画面になりません。

#6

投稿記事 by KEYONN_ » 15年前

>>softyaさんへ

ありがとうございます。きちんとゲームオーバー画面が出ました。

しかし、ファミコンの機能が分からないとデバッグしずらいですね。

閉鎖

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