オプション画面で選択した画像を何回か選んでいるとどんどん動きが重くなるのはどうしてでしょうか?
あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
作成したプログラムをんのせます。
#include "DxLib.h"
int function_status=0,White;
char KeyBuf[ 256 ] ;
void Menu();
void Games();
void Option();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
SetWindowText("Defend the fish!!");
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
White = GetColor( 255 , 255 , 255 ) ; //色の取得
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る
switch(function_status){
case 0:
Menu();
break;
case 1:
Games();
break;
case 2:
Option();
break;
case 3:
Menu();
break;
case 4:
Option();
LoadGraphScreen( 410 , 50 , "EN1.bmp" , TRUE ) ;
break;
case 5:
Option();
LoadGraphScreen( 410 , 50 , "EN2.bmp" , TRUE ) ;
break;
case 6:
Option();
LoadGraphScreen( 410 , 50 , "EN3.bmp" , TRUE ) ;
break;
case 7:
Option();
LoadGraphScreen( 410 , 50 , "EN4.bmp" , TRUE ) ;
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終
ScreenFlip() ; // 裏画面データを表画面へ反映
}
DxLib_End();
return 0;
}
void Menu(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "back1.bmp" ) ; //back1.bmpのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //画像を表示
SetFontSize( 50 ) ; //サイズを30に変更
SetFontThickness( 10 ) ; //太さを8に変更
ChangeFont( "MS 明朝" ) ; //種類をMS明朝に変更
ChangeFontType( DX_FONTTYPE_ANTIALIASING ); //アンチエイリアスフォントに変更
DrawString(200,200,"Defend the fish!!",GetColor(0,0,0));
SetFontSize( 20 ) ;
DrawString(320,310,"スタート(S)",GetColor(0,0,0));
if(KeyBuf[KEY_INPUT_S]==1)
function_status=1;
DrawString(320,360,"オプション(O)",GetColor(0,0,0)); //サイズを20に変更
if(KeyBuf[KEY_INPUT_O]==1)
function_status=2;
DrawString(320,410,"終了(E)",GetColor(0,0,0));
if(KeyBuf[KEY_INPUT_E]==1)
function_status=8;
}
void Games(){
if(KeyBuf[KEY_INPUT_[/url]==1)
function_status=3;
}
void Option(){
int White,Red,G_Blue;
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "back1.bmp" ) ; //back2.bmpのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //画像を表示
White = GetColor( 0 , 0 , 0 ) ; // 白色の値を取得
Red = GetColor( 255 , 0 , 0 ) ; // 赤色の値を取得
G_Blue = GetColor( 0 , 255 , 255 ) ; // 緑と青の混合色の値を取得
DrawBox ( 720 , 50 , 410 , 400 , White , FALSE) ; // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
DrawBox ( 30 , 50 , 400 , 200 , White , FALSE) ; // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
DrawString(60,60,"カスタム1(キー1)",White);
if(KeyBuf[KEY_INPUT_1]==1)
function_status=4;
DrawString(60,90,"カスタム2(キー2)",White);
if(KeyBuf[KEY_INPUT_2]==1)
function_status=5;
DrawString(60,120,"カスタム3(キー3)",White);
if(KeyBuf[KEY_INPUT_3]==1)
function_status=6;
DrawString(60,150,"カスタム4(キー4)",White);
if(KeyBuf[KEY_INPUT_4]==1)
function_status=7;
DrawString(160,250,"変更",White);
DrawString(660,560,"もどる(R)",White);
if(KeyBuf[KEY_INPUT_[/url]==1)
function_status=3;
}
処理が重くなっていく
Re:処理が重くなっていく
初の回答してみようかな(;^^
えっと・・・
詳しくは見てないですが、Menu()関数の中でLoadGraph()関数を何回も呼び出しているのは問題ですね。
初期化の際に1回呼び出せば十分です。
> あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
カーソル位置を記憶しておく変数を用意して、矢印キーが押されるたびにそれを変更すればいいです。
で、Zが押された場合にカーソル位置に応じて処理を振り分けると良いかと。。。
えっと・・・
詳しくは見てないですが、Menu()関数の中でLoadGraph()関数を何回も呼び出しているのは問題ですね。
初期化の際に1回呼び出せば十分です。
> あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
カーソル位置を記憶しておく変数を用意して、矢印キーが押されるたびにそれを変更すればいいです。
で、Zが押された場合にカーソル位置に応じて処理を振り分けると良いかと。。。
Re:処理が重くなっていく
まず、毎ループLoadGraphScreen
はしないほうがよいようです。処理的に重くなるらしいです。
(試したことがないのではっきりとは言えませんが・・・。)
毎ループ描写するものは、LoadGraphにして、イメージハンドルを生成
してから描写するとよいかと思います。
あとMenu,Optionなどの関数に入ると、どの関数でも、
LoadGraphしています。そのハンドルで初期化している変数はローカル変数なので、
スコープ(関数)を抜けると、使えなくなります。
再度関数に入ったとき、またイメージハンドルが作られ、初期化としているので、
イメージハンドルは毎ループ「放り投げられる」わけです。
これがメモリに蓄積されるので、重くなるのでしょう。
いろいろ解決策がありますが、イメージ管理はグローバル変数にして、
初期化の関数を作り、あらかじめ生成しておくなどなど。
>あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
二つのキーの入力の論理積を取ればよいです。
Key[KEY_INPUT_Z] && Key[KEY_INPUT_矢印]
みたいにですね。
はしないほうがよいようです。処理的に重くなるらしいです。
(試したことがないのではっきりとは言えませんが・・・。)
毎ループ描写するものは、LoadGraphにして、イメージハンドルを生成
してから描写するとよいかと思います。
あとMenu,Optionなどの関数に入ると、どの関数でも、
LoadGraphしています。そのハンドルで初期化している変数はローカル変数なので、
スコープ(関数)を抜けると、使えなくなります。
再度関数に入ったとき、またイメージハンドルが作られ、初期化としているので、
イメージハンドルは毎ループ「放り投げられる」わけです。
これがメモリに蓄積されるので、重くなるのでしょう。
いろいろ解決策がありますが、イメージ管理はグローバル変数にして、
初期化の関数を作り、あらかじめ生成しておくなどなど。
>あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
二つのキーの入力の論理積を取ればよいです。
Key[KEY_INPUT_Z] && Key[KEY_INPUT_矢印]
みたいにですね。
Re:処理が重くなっていく
既にkazuoniさんが書かれている通りなのですが・・・(汗)
何もないのもアレなので、
kazuoniさんの回答を参考に昼飯前に書いてみました。
実行できる環境がないのでテストはしていませんが、
参考にしてみてください^^
何もないのもアレなので、
kazuoniさんの回答を参考に昼飯前に書いてみました。
実行できる環境がないのでテストはしていませんが、
参考にしてみてください^^
#include "DxLib.h" #include <stdio.h> int function_status; int White, Red, G_Blue; int hFont;/*追加*/ int hFontS;/*追加*/ int menuImg;/*追加*/ int optionImg;/*追加*/ int enImg[4];/*追加*/ int cursorPos;/*追加*/ char KeyBuf[256]; void init();/*追加*/ void setState( int );/*追加*/ void Menu(); void Games(); void Option(); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // 初期化 init(); while( 1 ) { ClearDrawScreen(); // 裏画面のデータを全て削除 GetHitKeyStateAll( KeyBuf ); // すべてのキーの状態を得る switch( function_status ) { case 0: Menu(); break; case 1: Games(); break; case 2: Option(); break; case 3: Menu(); break; case 4: Option(); DrawGraph( 410, 50, enImg[0], TRUE ); break; case 5: Option(); DrawGraph( 410, 50, enImg[1], TRUE ); break; case 6: Option(); DrawGraph( 410, 50, enImg[2], TRUE ); break; case 7: Option(); DrawGraph( 410, 50, enImg[3], TRUE ); break; // DXライブラリ使用の終了処理 default: DxLib_End(); return 0; } if( ProcessMessage() == -1 ) break; // エラーが起きたら終了 ScreenFlip(); // 裏画面データを表画面へ反映 } DxLib_End(); return 0; } void init()/*追加*/ { ChangeWindowMode( TRUE ); // ウィンドウモードに変更 SetWindowText( "Defend the fish!!" ); SetGraphMode( 800, 600, 32 ); if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 White = GetColor( 0, 0, 0 ); // 白色の値を取得 Red = GetColor( 255, 0, 0 ); // 赤色の値を取得 G_Blue = GetColor( 0, 255, 255 ); // 緑と青の混合色の値を取得 SetDrawScreen( DX_SCREEN_BACK ); // 描画先を裏画面に設定 hFont = CreateFontToHandle( "MS 明朝", 50, 10, DX_FONTTYPE_ANTIALIASING );/*追加*/ hFontS = CreateFontToHandle( "MS 明朝", 20, 10, DX_FONTTYPE_ANTIALIASING );/*追加*/ menuImg = LoadGraph( "back1.bmp" );/*追加*/ optionImg = LoadGraph( "back1.bmp" );/*追加*/ for( int i = 0; i < 4; ++i )/*追加*/ { char[16] name; sprintf( name, "EN%d.bmp", i + 1 ); enImg = LoadGraph( name ); } function_status = 0; } void setState( int state )/*追加*/ { function_status = state; cursorPos = 0; } void Menu() { DrawGraph( 0, 0, menuImg, FALSE ); // 画像を表示 DrawStringToHandle( 200, 200, "Defend the fish!!", White, hFont ); DrawStringToHandle( 320, 310, "スタート(S)", White, hFontS ); if( KeyBuf[KEY_INPUT_S] == 1 ) setState( 1 ); DrawStringToHandle( 320, 360, "オプション(O)", White ); // サイズを20に変更 if( KeyBuf[KEY_INPUT_O] == 1 ) setState( 2 ); DrawStringToHandle( 320, 410, "終了(E)", White ); if( KeyBuf[KEY_INPUT_E] == 1 ) setState( 8 ); } void Games() { if( KeyBuf[KEY_INPUT_[/url] == 1 ) setState( 3 ); } void Option() { DrawGraph( 0, 0, optionImg, FALSE ); // 画像を表示 DrawBox( 720, 50, 410, 400, White, FALSE ); // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標) DrawBox( 30, 50, 400, 200, White, FALSE ); // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標) DrawStringToHandle( 60, 60, "カスタム1(キー1)", White, hFont ); if( KeyBuf[KEY_INPUT_1] == 1 ) setState( 4 ); DrawStringToHandle( 60, 90, "カスタム2(キー2)", White, hFont ); if( KeyBuf[KEY_INPUT_2] == 1 ) setState( 5 ); DrawStringToHandle( 60, 120, "カスタム3(キー3)", White, hFont ); if( KeyBuf[KEY_INPUT_3] == 1 ) setState( 6 ); DrawStringToHandle( 60, 150, "カスタム4(キー4)", White, hFont ); if( KeyBuf[KEY_INPUT_4] == 1 ) setState( 7 ); DrawStringToHandle( 160, 250, "変更", White, hFont ); DrawStringToHandle( 660, 560, "もどる(R)", White, hFont ); if( KeyBuf[KEY_INPUT_[/url] == 1 ) setState( 3 ); // カーソル移動処理 const int HEAD = 0; const int TAIL = 4; if( KeyBuf[KEY_INPUT_UP] == 1 ) cursorPos = (cursorPos == HEAD) ? TAIL : (cursorPos - 1); else if( KeyBuf[KEY_INPUT_DOWN] == 1 ) cursorPos = (cursorPos == TAIL) ? HEAD : (cursorPos + 1); // 決定処理 if( KeyBuf[KEY_INPUT_Z] == 1 ) { switch( cursorPos ) { case 0: setState( 4 ); break; case 1: setState( 5 ); break; case 2: setState( 6 ); break; case 3: setState( 7 ); break; case 4: setState( 3 ); break; // default: break; } } }