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

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

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

#1

投稿記事 by ひよこ » 16年前

ボタンを押すたびに音を鳴らそうと思うんですけど下のようなプログラムだと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 ; // ソフトの終了
}

Dixq (管理人)

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

#2

投稿記事 by Dixq (管理人) » 16年前

まず、ループして何度も何度も同じデータをロードしているので、メモリ使用量がドンドン増えてしまうと思います。
そしてZキーを押したら再生、と同時に、ループから抜けるようにかいてあるので、
終了してしまいます。
breakを書く必要があるのでしょうか?

kazuoni

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

#3

投稿記事 by kazuoni » 16年前

理由は
if(KeyBuf[KEY_INPUT_Z]==1)
の時breakしているからです。
breakは繰り返しwhile,forから抜けてしまいます。
breakするとwhile(1)から抜けます。ゆえに終了してしまいます。

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

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

ひよこ

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

#4

投稿記事 by ひよこ » 16年前

ありがとうございます。
whileからだしたら見事に成功しました。
しかし今おもったんですけど、そしたら whileはどういうときにつかえばいいでしょうか。

Dixq (管理人)

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

#5

投稿記事 by Dixq (管理人) » 16年前

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

ひよこ

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

#6

投稿記事 by ひよこ » 16年前

ありがとうございます。よくわかりました。
またわからなくなったらここに来ますのでよろしくお願いします。

閉鎖

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