ページ 11

ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 15:17
by ひよこ
ボタンを押すたびに音を鳴らそうと思うんですけど下のようなプログラムだとZを一回押すと終了してしまうのですがどうすればいいでしょうか。


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモード
if( DxLib_Init() == -1 ) return -1; // 初期化





char KeyBuf[ 256 ] ;


while( 1 ){
GetHitKeyStateAll(KeyBuf ) ; // すべてのキーの状態を得る

int Sound ;

Sound = LoadSoundMem( "test.wav" ); //wavファイルを読み込み、ハンドルをint型変数へ格納

if(KeyBuf[KEY_INPUT_Z]==1) {
if(CheckSoundMem(Sound)==0) //現在ショット音が再生されていなければ
PlaySoundMem(Sound,DX_PLAYTYPE_BACK); //ショット音を再生する

break;}




if(KeyBuf[KEY_INPUT_ESCAPE]==1)
break ;

if( ProcessMessage() == -1 ) break ;//エラーが起きたら終了
}

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

Re:ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 15:27
by Dixq (管理人)
まず、ループして何度も何度も同じデータをロードしているので、メモリ使用量がドンドン増えてしまうと思います。
そしてZキーを押したら再生、と同時に、ループから抜けるようにかいてあるので、
終了してしまいます。
breakを書く必要があるのでしょうか?

Re:ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 15:29
by kazuoni
理由は
if(KeyBuf[KEY_INPUT_Z]==1)
の時breakしているからです。
breakは繰り返しwhile,forから抜けてしまいます。
breakするとwhile(1)から抜けます。ゆえに終了してしまいます。

改善するためにはbreakをとってください。
あと、LoadSoundMemは一回だけ読み込めばいいので、
whileから出したほうが良いです。

あと規約のとおり、次回からはコードをpreタグで囲むようにしてください。

Re:ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 16:00
by ひよこ
ありがとうございます。
whileからだしたら見事に成功しました。
しかし今おもったんですけど、そしたら whileはどういうときにつかえばいいでしょうか。

Re:ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 16:06
by Dixq (管理人)
読み込みは一度しかしませんが、描画は何度もしますよね。
キャラが移動する様子を描画するには、ループ処理無しには出来ません。
1ピクセル移動してはその場所に描画、1ピクセル移動してはその場所に描画、そんな感じですよね。
その辺はゲームプログラミングの館を参考にして下さい。
裏画面を使った移動処理は13章あたりから解説しています。

Re:ボタンを押すと消えてしまうんですが

Posted: 2008年12月28日(日) 16:09
by ひよこ
ありがとうございます。よくわかりました。
またわからなくなったらここに来ますのでよろしくお願いします。