レベルが低い質問ですが・・・

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

レベルが低い質問ですが・・・

#1

投稿記事 by のま猫 » 4年前

今 DXライブラリの基本を勉強しているものです
「2.9 全てのキーの入力状態を取得する」で

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
のような部分があるのですが ここが一向に理解できません
for文なので繰り返すということはわかるのですが、何を繰り返しているのかがわかりません
それと iが何を意味しているのかもわかりません
for文でどのような処理をしているのか詳しく教えてもらいたいです
とてもレベルの低い質問なのですが 何卒説明の方よろしくお願いいたします

レベルはC言語は一通り理解しました

アバター
Dixq (管理人)
管理人
記事: 1659
登録日時: 8年前
住所: 北海道札幌市
連絡を取る:

Re: レベルが低い質問ですが・・・

#2

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

DXライブラリの内部でキーの状態が最大で256個あるのです。
Zキーの入力状態、
Xキーの入力状態、
Cキーの入力状態・・・を全部足すと256個(実際はもう少し少ないでしょうが)になるのです。

GetHitKeyStateAllで256種類のchar配列を渡すと、現在の256種類のキーの入力状態が0か1で入って来ます。
まずはこちらの関数を見て下さい。
http://homepage2.nifty.com/natupaji/DxL ... .html#R5N2

しかし、押してるか押してないかだけでは苦労することがあるのです。
試しに「右キーが押されたら円が50ピクセルずつ右に移動する」というプログラムを書いてみて下さい。
この重要性が分かることでしょう。

のま猫

Re: レベルが低い質問ですが・・・

#3

投稿記事 by のま猫 » 4年前

管理人様自ら とても早い回答本当にありがとうございます
一応管理人様に言われたコードは出来ました
私の力量不足だと思うのですが確かに苦労しました^^;

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        int x=0,y=0,z=0;

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

                DrawFormatString( x, y, GetColor(255,255,255), "○" );


				
                if( CheckHitKey(KEY_INPUT_RIGHT) == 1 ){
					z++;
				}
				if(CheckHitKey(KEY_INPUT_RIGHT) == 0){
					z=0;
				}
				if(z==1){
					x=50+x;
				}


        }

        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 
ひとつ分からないことがあるのですが

コード:

for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
この文でのiの意味がわかりません
iは入力されているキーの番号みたいなものなのですか?
例えば Yキーだったら i=50 みたいな感じなのですか?
それと
Key++;のiと for文の中のi++のiはなにか違うのですか?
何卒回答よろしくお願い致します

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: レベルが低い質問ですが・・・

#4

投稿記事 by みけCAT » 4年前

のま猫 さんが書きました:iは入力されているキーの番号みたいなものなのですか?
ここでのiは入力されているかに応じて状態を更新するキーの番号が入る変数です。
のま猫 さんが書きました:例えば Yキーだったら i=50 みたいな感じなのですか?
DXライブラリ Ver 3.13dではYキーはi=21のようです。
のま猫 さんが書きました:Key++;のiと for文の中のi++のiはなにか違うのですか?

細かい文法の話はよくわかりませんが、
Key++;のiは参照(読み取り)されるだけなので右辺値(リテラルなど)を書いても(動作はともかく、プログラム的には)validですが、
i++のiは値を更新されるので左辺値(変数など)でないといけない、という違いがあります。
基本的に指すものは同じはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

のま猫

Re: レベルが低い質問ですが・・・

#5

投稿記事 by のま猫 » 4年前

とても早い回答本当にありがとうございます

一つ質問よろしいですか?

for文でi++したならばKeyのiも+1されてしまうのではないのですか?
そうすると Keyのiの値が変わってしまうような気がするのですが・・・
例えば Y=21なのが i++されてY=22になってしまわないのですか?
ここがよくわからないのですが・・・

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: レベルが低い質問ですが・・・

#6

投稿記事 by みけCAT » 4年前

のま猫 さんが書きました:for文でi++したならばKeyのiも+1されてしまうのではないのですか?

もちろん+1されます。
どうしてそれが問題になると思うのですか?

のま猫 さんが書きました:そうすると Keyのiの値が変わってしまうような気がするのですが・・・

もちろん変わります。
むしろ変わらないとiを使う意味がありません。

のま猫 さんが書きました:例えば Y=21なのが i++されてY=22になってしまわないのですか?

DXライブラリ Ver 3.13dではキーの番号は#defineで定数として定義されているので、iの値が変わっても影響を受けません。
また、今回のiは参照ではなくただのint型なので、iの値を変えてもグローバル変数Yへの影響はもちろんないはずです。
もしY(キーYの番号とは関係ない)をY=21からY=22にしたかったら、i++ではなくY++などの式を用いなければいけません。


もし関数型言語やOCamlに親しんでいるなどの理由でiの値が変わることが気持ち悪いのでしたら、iを使わずに

コード:

if( tmpKey[0] != 0 )Key[0]++; else Key[0] = 0;
if( tmpKey[1] != 0 )Key[1]++; else Key[1] = 0;
if( tmpKey[2] != 0 )Key[2]++; else Key[2] = 0;
if( tmpKey[3] != 0 )Key[3]++; else Key[3] = 0;
if( tmpKey[4] != 0 )Key[4]++; else Key[4] = 0;
if( tmpKey[5] != 0 )Key[5]++; else Key[5] = 0;
// 中略
if( tmpKey[253] != 0 )Key[253]++; else Key[253] = 0;
if( tmpKey[254] != 0 )Key[254]++; else Key[254] = 0;
if( tmpKey[255] != 0 )Key[255]++; else Key[255] = 0;
と書いていただいても構いません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: レベルが低い質問ですが・・・

#7

投稿記事 by Tatu » 4年前

iはfor文でカウンタ(何回目の繰り返しかを表す変数、配列の要素の指定に使われることがよくある)としてよく使われます。
今回、カウンタは今どのキーを扱っているかを示すことになります。

「iが0,Key[0]が0,Key[1]が0」の状態で
Key++;
i++;
が実行された場合、
1行目でKey[0]が1増えた後で2行目でiが1増えるので
「iが1,Key[0]が1,Key[1]が0」となります。

さらにこの状態からもう一度実行したら
「iが2,Key[0]が1,Key[1]が1」となります。

のま猫さんはどのようになると考えていましたか?

のま猫

Re: レベルが低い質問ですが・・・

#8

投稿記事 by のま猫 » 4年前

お二人とも回答ありがとうございます
つまり

コード:

for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
この文だったら

コード:

if( tmpKey[0] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[0]++;     // 加算
                } else {              // 押されていなければ
                        Key[0] = 0;   // 0にする
                }
        }


if( tmpKey[1] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[1]++;     // 加算
                } else {              // 押されていなければ
                        Key[1] = 0;   // 0にする
                }
        }
・
・省略
・
・
if( tmpKey[255] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[255]++;     // 加算
                } else {              // 押されていなければ
                        Key[255] = 0;   // 0にする
                }
        }
をfor文で短くしているということでよろしいですか?
例えば
Yキーが押されていたら

コード:

・
・
・
・省略
if( tmpKey[21] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[21]++;     // 加算
                } else {              // 押されていなければ
                        Key[21] = 0;   // 0にする
                }
        }
・
・
・
・省略
でYが押されているときだけ
Key[21]++;
を1フレームに1回繰り返すということですか?
つまり1秒でKey[21]=60になるということですか?

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: レベルが低い質問ですが・・・

#9

投稿記事 by みけCAT » 4年前

のま猫 さんが書きました:つまり

コード:

for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
この文だったら

コード:

if( tmpKey[0] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[0]++;     // 加算
                } else {              // 押されていなければ
                        Key[0] = 0;   // 0にする
                }
        }


if( tmpKey[1] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[1]++;     // 加算
                } else {              // 押されていなければ
                        Key[1] = 0;   // 0にする
                }
        }
・
・省略
・
・
if( tmpKey[255] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[255]++;     // 加算
                } else {              // 押されていなければ
                        Key[255] = 0;   // 0にする
                }
        }
をfor文で短くしているということでよろしいですか?
そんな感じでいいと思います。
のま猫 さんが書きました:例えば
Yキーが押されていたら

コード:

・
・
・
・省略
if( tmpKey[21] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[21]++;     // 加算
                } else {              // 押されていなければ
                        Key[21] = 0;   // 0にする
                }
        }
・
・
・
・省略
でYが押されているときだけ
Key[21]++;
を1フレームに1回繰り返すということですか?
gpUpdateKey関数を1フレームに1回呼び出せば、そうなると思います。
のま猫 さんが書きました:つまり1秒でKey[21]=60になるということですか?
fpsや、Yキーが押された状態になってからどの時点で「1秒」を測り始めるかによります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

のま猫

Re: レベルが低い質問ですが・・・

#10

投稿記事 by のま猫 » 4年前

回答ありがとうございます
やっと理解することができました

とてもはやいうちに回答をくださり感謝しきれないくらいです
回答をしてくださった方、この度は本当にありがとうございました
機会がありましたら またよろしくお願いいたします

閉鎖

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