DXlivでの表画面表示がうまくできません
Posted: 2012年5月24日(木) 05:48
DXライブラリ使用です。ハードモードを選択したら、問題を表示できるようにしたいのですが何度やっても表示できません。誰かお助け下さい。
デバッグした様子だとちゃんと配列に数字は入っていると思います。number~は数字(1~9)の.pngファイルです。お願いします.
もしよろしければ参考までにナンプレの穴埋め(文字選択)をどのようにプログラムしたらよいかも教えて下さいm(__)m
デバッグした様子だとちゃんと配列に数字は入っていると思います。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