ページ 11

GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 19:33
by しろ
&DXライブラリ初心者です。

GetHitKeyStateAll_2関数がよく理解できません。(GetHitKeyStateAll関数は一応理解しています)

下記の説明は一応読んだのですが、私の理解力不足のせいか、どうもいまいち……
http://dixq.net/g/41.html

そこで、理解することはとりあえず後においといて、試しに下記のようなプログラムをつくりました。

-------------------------

(GetHitKeyStateAll_2関数を定義)


中略

int a_1=0;

while(ProcessMessage()==0 & ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){



if(a_1==0){

描画など //プログラム1

}



if(Key[KEY_INPUT_DOWN]==1 || a_1==0){

a_1=1;

            描画など //プログラム2



}

if(Key[KEY_INPUT_DOWN]==1 && a_1==1){


            描画など //プログラム3




}


}

--------------------

要は↓を押せば次のif文にいく(はずの)プログラムなのですが、真ん中のプログラムがスルーされてしまいます。(通過はするのですが、↓ぼたんを押すとプログラム2は一瞬で通過し、プログラム3へ移行します)

上のプログラムと絡めながらGetHitKeyStateAll_2についてご説明していただけますと大変助かります。何とぞよろしくお願いいたします。

※一部訂正します。すいません。上のプログラムは変ですね。とりあえずプログラムはおいておいて、関数について教えてください。
画像

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 19:41
by Dixq (管理人)
作りたいプログラムが大体解りました。
ifを連続して書くとよく陥るワナ(?)ですね。
私も困った経験が昔あります。
こういう時は

if
else if

を使います。
switch文でも出来るかもしれませんね。
以下41章に仰るプログラムを追加しました。
下ボタンが押されるたびにaの値が1つずつ増加します。


#include "DxLib.h"

int Key[256];

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

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

int a=0;

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
if( Key[KEY_INPUT_DOWN] == 1 ){
if( a==0 ){
a=1;
} else if( a==1) {
a=2;
} else if( a==2) {
a=3;
} else if( a==3) {
a=0;
}
}
DrawFormatString(0,0,GetColor(255,255,255),"%d",a);
ScreenFlip();
}

DxLib_End();
return 0;
}

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 19:46
by Dixq (管理人)
普通にaを増加させればいいだけならば

if( Key[KEY_INPUT_DOWN] == 1 )
a = (a+1) % 10;

でもいいですね。
10の値を変えれば好きな周期でループします。

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 19:58
by しろ
ご回答ありがとうございます。

下記のようにwhile文内のプログラムを変更してみたら解決しました。

-------------------


if( Key[KEY_INPUT_DOWN] == 1 ){

if( a_1==0 ){

a_1=1;
}
else if( a_1==1) {
a_1=2;
}
else if( a_1==2) {
a_1=0;
}

}


if(a_1==0){

DrawGraph(35,10,select1,TRUE);
DrawGraph(30,50,bar1,TRUE);


DrawGraph(32,68,tuduki0,TRUE);
DrawGraph(31,115,bar0,TRUE);

DrawGraph(35,135,SOS_kiroku0,TRUE);
DrawGraph(31,175,bar0,TRUE);



}

else if(a_1==1){

DrawGraph(38,11,select0,TRUE);
DrawGraph(30,50,bar0,TRUE);


DrawGraph(32,68,tuduki1,TRUE);
DrawGraph(30,115,bar1,TRUE);


DrawGraph(35,135,SOS_kiroku0,TRUE);
DrawGraph(31,175,bar0,TRUE);




}

else if(a_1==2){



DrawGraph(38,11,select0,TRUE);
DrawGraph(30,50,bar0,TRUE);


DrawGraph(32,68,tuduki0,TRUE);
DrawGraph(30,115,bar0,TRUE);


DrawGraph(35,135,SOS_kiroku1,TRUE);
DrawGraph(30,175,bar1,TRUE);



}

------------------

しかし、なぜ解決したかが理解ができません。そもそも勉強不足のせいかelse ifとifの違いがわかりません。Cを勉強した当初は2個以上続くときはelse ifを使ってたんですが、いつのまにかifしか使わないようになってしまいました。

いろいろ教えてもらえるとうれしいです。

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 20:05
by Dixq (管理人)
例えば

int a=1;

if( a==1 ){
a=2;
}

上記のプログラムでは「a=2」を通りますよね?
ですから、
最後にaは2になります。

int a=1;

if( a==1 ){
a=2;
}
if( a==2 ){
a=3;
}

このプログラムでは最初の条件式で真になり、a=2が行われ、
2つ目のifに差し掛かった時はaが2ですから、こちらの条件文も真になってしまい、両方実行されてしまいます。
では
「aが1の時処理(1)、それ以外の場合でもしaが2なら処理(2)」
というプログラムを書いてみましょう。
ifは「もし」を、elseは「それ以外」を意味しますよね。


int a=1;

if( a==1 ){
a=2;
}
else if( a==2 ){
a=3;
}

ですから、上のようにに書けば、

「aが1の時処理a=2、それ以外の場合でもしaが2なら処理a=3」

となります。
ここで、最初のifに入りますから、「それ以外の場合」にはあてはまりません。
よってelse ifの条件式は評価されなくなります。

従って、最初のifの中身しか実行されず、aが2になるというわけです。

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 20:26
by しろ
なるほど、わかりやすい説明ありがとうございました。理解できました。

ついでにといっては恐縮なのですが、上のプログラムはゲームのOP画面の制作に使っています。OPでBGMを流すためwhile文より前で


int main_sound=LoadSoundMem( "music\\OP.mp3" );

PlaySoundMem(main_sound, DX_PLAYTYPE_LOOP );//ループ再生

というプログラムを書きました。

        SetGraphMode(1024, 768 , 16 ); //画面サイズを変更

もその前で書いているのですがプログラムを実行すると画面が大きくなるところで一瞬固まります。(その後は問題なくwhile文に入ります)。ちなみに上にある最初の2行を書かないと、固まる症状は発生しません。

これはどうしようもない現象なのでしょうか?

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 21:07
by Dixq (管理人)
まず、SetGraphMode関数の仕様を確認してみましょう。

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html こちらで
「SetGraphMode」で検索してみて下さい。

何やら注意事項が出てきませんか?

省略しますので確認しておいてくださいね。

この関数はDxLib_Iniの前に呼ぶ必要があります。
もし呼んでから使用したい場合は、全てのロードしたデータをリロードしなければなりません。

Re:GetHitKeyStateAll_2関数について

Posted: 2010年6月19日(土) 22:20
by しろ
いろいろありがとうございました。

早速確認してみます。

クラス内でconstの使い方

Posted: 2010年6月28日(月) 15:38
by Limone
class A{
public:
A(const int x1);
const int x;
}
A::A((const int x1){
x = x1;
}

このような感じで
引数x1をxの値として、それ以後動かないようにしたいのですが
どうすればいいでしょう?

検索用語:「クラス」or「class」「引数」「const」

Re:クラス内でconstの使い方

Posted: 2010年6月28日(月) 15:40
by シエル
動かないようにというのは、値が変わらないようにしたいということでしょうか?

Re:クラス内でconstの使い方

Posted: 2010年6月28日(月) 15:43
by たかぎ
「コンストラクタ初期化子」でいますぐ検索

Re:クラス内でconstの使い方

Posted: 2010年6月28日(月) 16:41
by Limone
なるほど、出来ました
ありがとうございます。