ページ 11

タイトル画面

Posted: 2010年10月07日(木) 20:38
by エメ
初めての投稿となります。
DXライブラリを始めて1週間程度なんですが2日間ここで困っています。
タイトル画面を作ろうとしているのですがキーを押しても動きません。

#include "DxLib.h"

void message_box(){
int flag;
flag=MessageBox(
NULL ,
TEXT("Yでフルスクリーン、Nでウィンドウモードです。") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}


void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "SHOOTING" , White );
DrawString( 170 , 150 , "QUIT" , White );
}

void Background(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //taitoru2.pngのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //taitoru2.pngを表示
}

void Backmusic(){
int music; //ハンドルを受け取るためのint型変数を宣言
music = LoadGraph( "music/03.mid" ) ; //0.3midのハンドルを代入
PlayMusic( "music/03.mid" , DX_PLAYTYPE_BACK ) ; // 03.midのバックグラウンド演奏



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

int Key[256];
int White , y=100; //色とy座標の宣言

SetMainWindowText( "とあるしゅーてぃんぐ。" ) ;// タイトルを変更

message_box(); //ウィンドウ処理
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

White = GetColor( 255 , 255 , 255 ) ; //色の取得

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない



Background(); //背景描画
Backmusic(); //バックグラウンド演奏
char_disp(White,y); // 文字を描画

if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=50;
if(y==150) // y座標が150なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了

}

Re:タイトル画面

Posted: 2010年10月07日(木) 20:44
by みけCAT
最初はy=100です。
y+=50によりy=150になります。
y==150なのでyを100にします。
この処理が行われるため動きません。

Re:タイトル画面

Posted: 2010年10月07日(木) 20:48
by シエル
キーの処理は問題ありません。
↓の部分が問題です。あとは自分お願いします。
あえて答えは教えません。

if(y==150) // y座標が150なら(選択が一番下なら)
y=100;

Re:タイトル画面

Posted: 2010年10月07日(木) 21:50
by やっくん
こんばんは。
後々のことを考えたら次のようにするとわかりやすい、バグも少ないかもしれません。
参考にどうぞ。

①タイトル項目のための文字列や画像の座標はdefineで定義
②カーソルのy座標は0,1,2,・・・とする。

define定義は以下のような感じで。

#define DISPLAY_POS_X 170
#define DISPLAY_POS_Y(i) (100 + 50 * (i))
#define N 2 // 項目数

カーソルの座標は

int y = 0;

などと宣言し、上下キーによってインクリメントorデクリメント
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){ 
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度 
  y++;                                       
  if(y==N)  // y座標がNなら(選択が一番下なら) 
  y=0;      // 選択座標を一番上に 
} 
  

DrawString( DISPLAY_POS_X - 20 , DISPLAY_POS_Y(y)  , "■"       , White ); 
DrawString( DISPLAY_POS_X      , DISPLAY_POS_Y(0)  , "SHOOTING" , White ); 
DrawString( DISPLAY_POS_X      , DISPLAY_POS_Y(1)  , "QUIT"     , White );

Re:タイトル画面

Posted: 2010年10月07日(木) 23:17
by エメ
キーを押すとyが150になるのにすぐ100の位置に戻してしまうから動かないっていうことですよね。

if(y==200)
y=100;

さらに1個下にさげようとすると100まで戻す という風にしたのですが…。
なにか間違えて理解してしまったのでしょうか

それと背景が数十秒表示されると表示されなくなってしまいます

度々の質問すみません 画像

Re:タイトル画面

Posted: 2010年10月07日(木) 23:43
by wing
void Background(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //taitoru2.pngのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //taitoru2.pngを表示
}

この関数の中でLoadGraphすると、何度も何度もtaitoru2.pngをLoadしてしまいます。
whileのそとに移したほうがいいと思います。

Re:タイトル画面

Posted: 2010年10月08日(金) 17:25
by エメ
みけCAT さん シエル さん やっくん さん wing さん
ありがとうございました。
無事解決することができました。
もしかしたら同じことになる人がいるかもしれないのでそのときの参考のために(なるのか?)
残しておきます

#include "DxLib.h"

int counter=0;
int color_white;
int y = 0;


#define DISPLAY_POS_X 170
#define DISPLAY_POS_Y(i) (100 + 50 * (i))
#define N 2 // 項目数



void message_box(){ //スクリーン設定
int flag;
flag=MessageBox(
NULL ,
TEXT("Yでフルスクリーン、Nでウィンドウモードです。") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}


void char_disp(int White,int y){
DrawString( DISPLAY_POS_X - 20 , DISPLAY_POS_Y(y) , "■" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(0) , "SHOOTING" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(1) , "QUIT" , White );
}



void SetColor(){
color_white = GetColor(255,255,255); //白色ハンドルを取得
}




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

SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。

int RefreshTime=0;

SetMainWindowText( "時鏡 鉢帳録" ) ;// タイトルを変更

SetColor(); //色を取得

int Key[256];
int White ; //色とy座標の宣言



message_box(); //ウィンドウ処理




if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

int Sound ;
Sound = LoadSoundMem( "music/harutoman.wav" ); //wavファイルを読み込み、ハンドルをint型変数へ格納
PlaySoundMem( Sound , DX_PLAYTYPE_BACK );//バックグラウンド再生



White = GetColor( 255 , 255 , 255 ) ; //色の取得

RefreshTime = GetNowCount(); //今の時間を取得

int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //gazo/taitoru2.pngのハンドルを代入


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

DrawGraph( 0 , 0 , image , FALSE ) ; //gazo/taitoru2.pngを表示

char_disp(White,y); // 文字を描画


if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に


}

ScreenFlip();//裏画面を表画面に反映


}

DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了

}