無題

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

無題

#1

投稿記事 by Be helped » 16年前

このプログラムの、
#include "DxLib.h"

int i=0,j,ch_i=0,counter=0,White;
char Key[256],oldKey[256]={},disp[80]="",ch[5][80]={
"プログラムを習得するには、実際に自分で書いてみることが大事。",
"参考書を読むことも重要だが、数学のように演習を通して、",
"体に身につけるようにしよう。",
"きっと、よりはっきりと、関数の使い方、",
"プログラムの書き方がわかるだろう。"
};


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ;

White=GetColor(255,255,255);

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

※ここから! for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)
Key[j]=2;
oldKey[j]=Key[j];
}

if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら
i=0; // iを初期値に戻し
ch_i++; // 表示する配列を1つずらす
if(ch_i==5) // これ以上表示する配列がなくなったらbreak;
break;
}※ここまで!

// 配列の終端-2以下で、今回コピーするiまでの配列要素のi番目が\0じゃなくカウンターが5の倍数なら
if(i<=80-2 && ch[ch_i]!='\0' && counter%5==0){
i+=2; // 全角文字なので配列要素2つずつカウントアップ
strncpy(disp,ch[ch_i],i);// iバイトまでの配列要素をdisp配列にコピー
disp='\0'; // 終端記号を代入
}

DrawFormatString(10,420,White,"%s",disp);//disp配列の文字データを表示

counter++;
ScreenFlip() ;

}

DxLib_End() ;
return 0 ;
}
※~※のところがよくわかりません。 どなたか解説をよろしくお願いします。
(とくに、oldKeyのある意味と、Enterを押したときになぜ2なのか?)

ねこ

Re:無題

#2

投稿記事 by ねこ » 16年前

プログラムの中ではキーボードを押している判定を「今押されているか否か」しか判定できません。
そのため「押された瞬間」を判定するには「前回押されていない」かつ「今回押されている」時の1回のみになります。
このプログラムでは
・押されてない⇒0
・押されている⇒1
・押された瞬間⇒2
というように振り分けています。
前回押されているかどうかを判定するためにoldKeyがあります。

Be helped

Re:無題

#3

投稿記事 by Be helped » 16年前

ありがとうございます^^
これは前回からずっとおされていても次に行かないようにしてるのですね。

Dixq (管理人)

Re:無題

#4

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

今押された瞬間かどうか判定する関数についても別の章で解説していますのでよければそちらもご覧下さいm(_ _)m

閉鎖

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