DXlivでの表画面表示がうまくできません

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

DXlivでの表画面表示がうまくできません

#1

投稿記事 by telepas » 14年前

DXライブラリ使用です。ハードモードを選択したら、問題を表示できるようにしたいのですが何度やっても表示できません。誰かお助け下さい。
デバッグした様子だとちゃんと配列に数字は入っていると思います。number~は数字(1~9)の.pngファイルです。お願いします.    

コード:

// メニュ-処理基本
#include "DxLib.h"

int SPoint ;	// 選択カーソルの位置

// 各処理の関数
void GameStart( void ) ;	// ゲームをスタートする関数
void Ranking( void ) ;	// ランキング関数
void Discription( void ) ;		// ルール説明を描く関数
void Osimai(void);
void Hard( int *gh ) ;	// ハードモード関数
void Normal( int *gh ) ;	// ノーマルモード関数
void Easy( int *gh ) ;		// イージーモード関数



// 処理ポインタ配列
void ( *Method1[] )( void ) =
{
	GameStart , Ranking , Discription , Osimai 
} ;
void ( *Method2[] )( int *gh ) =
{
	Hard , Normal , Easy 
} ;


// 選択項目の文字列
char *String[] =
{
	"ゲームスタート" ,
	"ランキング" ,
	"ルール説明",
	"終了",
	NULL
} ;

char *Sentaku[] =
{
	"むずかしい" ,
	"ふつう" ,
	"かんたん",
	NULL
} ;
//グラフィックハンドル格納用配列
int gh[10];


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

	SetGraphMode( 640 , 480 , 16 ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 WaitKey();			// エラーが起きたら直ちに終了
	}
	
	//画像読み込み
	gh[0] = LoadGraph("number0.png");gh[1] = LoadGraph("number1.png");gh[2] = LoadGraph("number2.png");
	gh[3] = LoadGraph("number3.png");gh[4] = LoadGraph("number4.png");gh[5] = LoadGraph("number5.png");
	gh[6] = LoadGraph("number6.png");gh[7] = LoadGraph("number7.png");gh[8] = LoadGraph("number8.png");
	gh[9] = LoadGraph("number9.png");


	// 選択ポインタの位置初期化
	SPoint = 0 ;

	// 選択項目の数を取得&ついでに項目描画
	SenntakuNum = 0 ; 
	while( String[ SenntakuNum ] != NULL )
	{
		DrawString( 32 , SenntakuNum * 32 , String[ SenntakuNum ] , GetColor( 255 , 255 , 255 ) ) ;
		SenntakuNum ++ ;
	}

	// ループ
	while( ProcessMessage() == 0 )
	{
		// 前のカーソル消去
		DrawBox( 0 , 0 , 32 , SenntakuNum * 32 , 0 , TRUE ) ;

		// カーソル描画
		DrawBox( 0 , SPoint * 32 , 16 , SPoint * 32 + 16 , 
				GetColor( 255 , 255 , 0 ) , TRUE ) ;

		// キー入力
		{
			// キー入力待ち
			while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
			while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
	
			// キー入力に応じて処理

			// カーソル移動
			if( CheckHitKey( KEY_INPUT_UP ) != 0 && SPoint != 0 ) SPoint -- ;
			if( CheckHitKey( KEY_INPUT_DOWN ) != 0 && SPoint < SenntakuNum - 1 ) SPoint ++ ;

			// 決定キー時処理
			if( CheckHitKey( KEY_INPUT_SPACE ) != 0 )
			{
				// 項目に応じた処理を行う
				Method1[ SPoint ]() ;

				// キー入力待ち
				WaitKey() ;

				// ループから抜ける
				break ;
			}
		}
	}

	/*DxLib_End() ;*/				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}


// ゲームをスタートする関数
void GameStart( void )
{
	int SPoint ;	// 選択カーソルの位置

	int SenntakuNum ;

	SetGraphMode( 640 , 480 , 16 ) ;
	
	// 選択ポインタの位置初期化
	SPoint = 0 ;

	// 選択項目の数を取得&ついでに項目描画
	SenntakuNum = 0 ; 
	while( Sentaku[ SenntakuNum ] != NULL )
	{
		DrawString( 32 , SenntakuNum * 32 , Sentaku[ SenntakuNum ] , GetColor( 255 , 255 , 255 ) ) ;
		SenntakuNum ++ ;
	}

	// ループ
	while( ProcessMessage() == 0 )
	{
		// 前のカーソル消去
		DrawBox( 0 , 0 , 32 , SenntakuNum * 32 , 0 , TRUE ) ;

		// カーソル描画
		DrawBox( 0 , SPoint * 32 , 16 , SPoint * 32 + 16 , 
				GetColor( 255 , 255 , 0 ) , TRUE ) ;

		// キー入力
		{
			// キー入力待ち
			while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
			while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
	
			// キー入力に応じて処理

			// カーソル移動
			if( CheckHitKey( KEY_INPUT_UP ) != 0 && SPoint != 0 ) SPoint -- ;
			if( CheckHitKey( KEY_INPUT_DOWN ) != 0 && SPoint < SenntakuNum - 1 ) SPoint ++ ;

			// 決定キー時処理
			if( CheckHitKey( KEY_INPUT_SPACE ) != 0 )
			{
				// 項目に応じた処理を行う
				Method2[ SPoint ](gh) ;

				// キー入力待ち
				WaitKey() ;

				// ループから抜ける
				break ;
			}
		}
	}
}

// ランキング関数
void Ranking( void )
{
	int i ;

	for( i = 0 ; i < 1000 ; i ++ )
	{
		DrawPixel( GetRand( 639 ) , GetRand( 479 ) ,
				 GetColor( GetRand( 255 ) , GetRand( 255 ) , GetRand( 255 ) ) ) ;
	}
}

// ルール説明関数
void Discription( void )
{
	int i ;

	for( i = 0 ; i < 480 ; i ++ )
	{
		DrawLine( 0 , i , 640 , i + 1 , GetColor( 255 , 255 , 255 * i / 480 ) ) ;
	}
}

void Osimai( void )
{
	DrawGraph( 0 , 0 , gh[3] , TRUE ) ;
	DrawGraph( 0 , 32 , gh[3] , TRUE ) ;
	DrawGraph( 32 , 0 , gh[9] , TRUE ) ;
	DrawGraph( 32 , 32 , gh[7] , TRUE ) ;
	DrawGraph( 32 , 64 , gh[8] , TRUE ) ;
	DrawGraph( 0 , 64 , gh[0] , TRUE ) ;
	WaitKey();
	/*DxLib_End() ;*/
}

コード:

#include<stdio.h>
#include"DxLib.h"

void Hard(int *gh){
	
	/*int *map_handle;*/
	static BYTE mapdata[]={ //mapdataの配列は0~80までの要素
		0,5,6,0,0,2,0,9,7,
		0,0,0,0,0,0,1,6,3,
		0,0,1,0,8,0,0,0,0,
		2,0,5,8,1,6,0,0,9,
		0,0,0,5,7,4,2,8,0,
		6,7,0,0,2,3,4,0,0,
		0,2,0,3,9,0,0,4,8,
		1,9,3,4,6,0,7,5,0,
		8,0,4,0,5,7,9,3,1,
	};


	//マップの数
	static int map_num = sizeof(mapdata) * sizeof(BYTE);
	//マップチップ一つのサイズ
	const int map_chip_width = 32;
	const int map_chip_height = 32;
	//画面すべてに表示するマップの縦横個数
	const int map_width_num = 9;
	const int map_height_num = 9;
	/*bool DrawFlag = false;*/

	
  //マップを表示
    int wc,hc,data;
    int i;
    //wcはX座標のカウンタ hcはY座標のカウンタ
    wc = hc = 0;
	ClearDrawScreen();
	//描画先を裏画面に設定
	SetDrawScreen(DX_SCREEN_BACK);
		for(i = 0;i<map_num;i++)
		{
			if(ProcessMessage()==0)
			{
				data = mapdata[i];
				if(wc >= map_width_num)
				{//mapの右端まできたらyをインクリメントxを0に
					wc = 0;
					hc ++;
				}
				if(data > map_num)
				{
					printfDx("out of range");
					return;
				}
			
				//DrawGraphで描画。 カウンタとmap_chipの縦、横をかけ算している。
				//ここが肝。map_handleの添え字にマップチップのデータを使っている。
				DrawGraph(wc * map_chip_width ,hc * map_chip_height,gh[data],TRUE);
				/*if(DrawFlag)
				{*/
				/*ScreenFlip();*/
				/*}*/
				wc++;
			}
		}
		ScreenFlip();
		WaitKey();
		DxLib_End() ;		// DXライブラリ使用の終了処理
}
   
void Normal(int *gh){
	DxLib_End() ;
}
   
void Easy(int *gh){
	DxLib_End() ;
}

もしよろしければ参考までにナンプレの穴埋め(文字選択)をどのようにプログラムしたらよいかも教えて下さいm(__)m

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

Re: DXlivでの表画面表示がうまくできません

#2

投稿記事 by naohiro19 » 14年前

  1. SetDrawScreen(DX_SCREEN_BACK); がない。
  2. 書いてはいけない4つの処理に違反してる可能性がある。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXlivでの表画面表示がうまくできません

#3

投稿記事 by softya(ソフト屋) » 14年前

naohiro19さんの言われる通り怪しい処理をしています。
あと、ナンプレの入力はキーではダメなのでしょうか?
マウス操作では無いみたいなので、キーの数値をそのまま入力で良い気がするんですが。
※ ナンプレに詳しくないので問題があったらごめんなさい。

[補足]
画像を使わず動かしてみたら数値は出ましたが異常終了します。
って事は画像が読み込めていない可能性があります。
異常終了の原因はDxLib_End()が途中にあること。

その他にも怪しい処理がチラホラと。
(例)
ProcessMessage()やWaitKey();やDxLib_End()が不適当極まりない。
static int map_num = sizeof(mapdata) * sizeof(BYTE); → 割り算では?
if(data > map_num) → 比較相手が違います。

あと関数ポインタを使っていますが、高速性の追求(これもコンパイラが大半解決してくれる)や長くなって可読性が低くなる時に使うものでムヤミヤタラと使うとバグの温床になります。
素直にswitch~caseをおすすめします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

telepas

Re: DXlivでの表画面表示がうまくできません

#4

投稿記事 by telepas » 14年前

解決しました!
ありがとうございました。

閉鎖

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