ページ 1 / 1
エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 20:53
by sadora3
エンターを押すたびに次のメッセージを表示する処理がどうしても出来ません。
最初は0が表示されていて、エンターが押されたら次はその下に1を表示したいです。
ですが、このソースコードでは0が消えて1が表示されてしまいます。
あと、
0
1
2
3
と表示された後に、エンターを押したら
1
2
3
4
という風に表示もさせたいです。以後エンターが押されたらカウントが増えていきます。
どうすればいいのでしょうか?
OS:Windows7
コンパイラ:Microsoft Visual Studio 2010
ライブラリ:DXライブラリ
言語:C
Cの知識はポインタ以外ならしっかり勉強してあります。
コード:
#include"DxLib.h"
int Cnt = 0;
int PutFlag = 1;
void F();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 32);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
while(ProcessLoop() == 0){
F();
ScreenFlip();
}
DxLib_End();
return 0;
}
void F(){
DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
if(CheckHitKey(KEY_INPUT_RETURN)){
if(PutFlag == 0){
Cnt++;
PutFlag = 1;
}
}else{
PutFlag = 0;
}
DrawFormatString(5, 400 + Cnt * 20, GetColor(255,255,255), "%d", Cnt);
}
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 21:38
by Dixq (管理人)
それは誰もが最初に疑問に思う壁ですよね。
うちのHPではそれに対する解決策として次のような方法を提案しています。
http://dixq.net/g/02_09.html
毎フレームキーの入力状態を監視し、キーに対応した配列要素をインクリメント。
キーの入力状態を知りたいときはKey配列を見ればよいという方法です。
そのKeyの配列要素が1のときのみ処理をするようにすれば1つずつ処理することができるでしょう。
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 21:40
by Tatu
Cntが3未満の時とそうでない時で文字の描画処理を分けてはどうでしょうか。
Cntが3未満の時は0からCntまで描画。
そうでない時はCnt-3からCntまで描画。
というように。
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 23:06
by sadora3
Tatuさんのヒントを頼りにCntの値が4以降の処理は出来ました!
コード:
#include"DxLib.h"
int Cnt = 0;
int PutFlag = 1;
void F();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 32);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
while(ProcessLoop() == 0){
F();
ScreenFlip();
}
DxLib_End();
return 0;
}
void F(){
DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
if(CheckHitKey(KEY_INPUT_RETURN)){
if(PutFlag == 0){
Cnt++;
PutFlag = 1;
}
}else{
PutFlag = 0;
}
if(Cnt < 4){
DrawFormatString(5, 400 + Cnt * 20, GetColor(255,255,255), "%d", Cnt);
}else{
for(int y = 0, Num = -3; y < 61; y += 20, Num++){
DrawFormatString(5, 400 + y, GetColor(255,255,255), "%d", Cnt + Num);
}
}
}
ですが、Cntの値が3以下の処理が思いつきません・・・。
助けて下さい・・・。
>Dixqさん
こんな便利なものがあるなんて知りませんでした!
ありがとうございます。
しかし、これは私の求めていた回答とは少し違いました(汗
>Tatuさん
おかげさまでCntの値が4以降の場合の処理は出来ました。
ありがとうございます。
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 23:24
by Dixq (管理人)
え、そうですか?
やりたいのはこういうことではないのですか?
コード:
#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;
}
char* txt[]= {
"テスト1です",
"テスト2です",
"テスト3です",
"テスト4です",
"テスト5です",
"テスト6です",
"テスト7です",
"テスト8です",
"テスト9です",
"これ以上押さないでください"
};
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int cnt=0;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
DrawFormatString( 0, 0, GetColor(255,255,255), txt[cnt] ); // 描画
if( Key[KEY_INPUT_RETURN] == 1 ){ // エンタキーが押された瞬間なら
cnt++; // 加算
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
実行結果
[youtube]
[/youtube]
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2014年12月31日(水) 23:54
by tk-xleader
たぶん、sadora3さんの作りたいプログラムは、こういうイメージのコードになるのかなと思います。
コード:
int start = Cnt - 3;
if(start < 0) start = 0;
for(int i = start; i <= Cnt; i++){
iの描画コード;
}
要するに、スタートを先に決めてしまい、スタートの値が0よりも小さければ強制的に0にしてしまうわけです。そうすれば、たぶんイメージどおりのコードが書けるのではないかと…
Re: エンターを押すたびに次のメッセージを表示する処理
Posted: 2015年1月01日(木) 00:38
by sadora3
コード:
#include"DxLib.h"
int Cnt = 0;
int PutFlag = 1;
void F();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 32);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
while(ProcessLoop() == 0){
F();
ScreenFlip();
}
DxLib_End();
return 0;
}
void F(){
DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
if(CheckHitKey(KEY_INPUT_RETURN)){
if(PutFlag == 0){
Cnt++;
PutFlag = 1;
}
}else{
PutFlag = 0;
}
if(Cnt < 4){
for(int i = 0; i <= Cnt; i++){
DrawFormatString(5, 400 + i * 20, GetColor(255,255,255), "%d", i);
}
}else{
for(int y = 0, Num = -3; y < 61; y += 20, Num++){
DrawFormatString(5, 400 + y, GetColor(255,255,255), "%d", Cnt + Num);
}
}
}
出来ました!私がやりたかったのはこういう処理でした!
>Dixqさん
紛らわしい書き方してすみませんでした。
やりたかったのは表示方法についてで、キーの入力についてではありませんでした(笑
>tk-xleaderさん
ヒントありがとうございました。
ですが、他に変数を使わずに自分のしたいことは出来ちゃいました。
回答してくださった皆さん本当にありがとうございました!
また何かあればよろしくお願いしますです。
[追記]
見返したらこれ、Cntの値が3以下の処理もTatuさんのヒント通りにやれば何も問題ありませんでした・・・。
よく読んでいませんでした。失礼しました(_ _)