キー監視を使用するとちらつきます・・・・

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

キー監視を使用するとちらつきます・・・・

#1

投稿記事 by OWN » 11年前

はじめまして
サウンドノベルのようなものを練習として作ってみようと思って作ってみたものなんですが・・・。

「Enterキーを押しやがれ」と表示され、押すと次の画面に切り替わり、(↓)
「一行目」を表示したら、Enterキーを押す事によって「2行目」を表示するというプログラムを組んでみたのですが、「2行目」がちらついてしまいます(「一行目」はちらつきません)。

どういうことなのか、自分には全く分かりませんので、状況などを具体的に書くことはできません。
東方弾幕風でプログラミングについて理解し、C言語をちょっぴりだけ知りました。
そして、新・ゲームプログラミングの館を見て、正式なC言語プログラミングとしていろいろと作ってみました。

ですが、やはり奥が深くて自分には難しいため状況の説明ができません

自分が知りたいのは、
「2行目」のちらつきをなくす方法です

開発ソフトにはVC++を使用しています。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
		ChangeWindowMode( TRUE );
        DxLib_Init();   // DXライブラリ初期化処理





		int Bamen = 0;  //場面を表す変数。まだ未使用です
		int Boom0101 = 0;   //場面1のID1という意味です
		int Boom0102 = 0;   //場面1のID2という意味です
		int boom0101g;  //場面1の画像一枚目という意味です
		int A = 0;   //ID1のα値です
		int A2 = 0;   //ID2のα値です
		boom0101g = LoadGraph( "tex/text12343.png" ); // 画像のロード









		while( 1 ){



			if(Boom0101 == 0){
			DrawFormatString( 100, 100, GetColor( 0, 255, 0 ), "Enterキー押しやがれ", 0, 0 ); // 文字を描画する
						if(CheckHitKey(KEY_INPUT_RETURN) == 1 ){
							if(Boom0101 = 1);
                }
			}

			










			
			//if(CheckHitKey(KEY_INPUT_RETURN) == 1 ){
				//			if(Boom0101 = 1);
                //}




			if(Boom0101 == 1){		//←間違っても「=」にしない
				ClearDrawScreen();
				SetDrawBlendMode( DX_BLENDMODE_ALPHA, A/200 );
				DrawGraph( 250, 100,boom0101g, TRUE ); // 画像を描画する
				DrawFormatString( 100, 200, GetColor( 127, 245, 127 ), "一行目", 0, 0 );
				if(A < 60001){
					A++;
					}
				}







			if(A > 60000){
				if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){
					if(Boom0102 = 1);
				}
			}







			if(Boom0102 == 1){
				SetDrawBlendMode( DX_BLENDMODE_ALPHA, A2/200 );
				DrawFormatString( 100, 220, GetColor( 127, 245, 127 ), "二行目", 0, 0 );
				A2++;
			}









			if( ProcessMessage() != 0 ){
				break;
                }

		}


        DxLib_End();    // DXライブラリ終了処理
        return 0;
}

それで、

コード:

			if(A > 60000){
				if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){
					if(Boom0102 = 1);
				}
			}
から
if(CheckHitKey(KEY_INPUT_RETURN) == 1 )
を含んだ

コード:

			if(A > 60000){
				if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){
					if(Boom0102 = 1);
				}
			}
を消して、

コード:

			if(Boom0102 == 1){
				SetDrawBlendMode( DX_BLENDMODE_ALPHA, A2/200 );
				DrawFormatString( 100, 220, GetColor( 127, 245, 127 ), "二行目", 0, 0 );
				A2++;
			}

if(Boom0102 == 1)

if(A > 60000)
として実行すると、普通にきれいにちらつかずに表示されます。

if( CheckHitKey( KEY_INPUT_RETURN ) == 1 )
が悪さをしているのは把握しました。

何度もいいますが、始めたての自分にはどういうことなのかが分からずに状況を書くことができません
詳しい方、解説をお願いします

nil
記事: 428
登録日時: 12年前

Re: キー監視を使用するとちらつきます・・・・

#2

投稿記事 by nil » 11年前

現在非常にコードが読みづらく、
何をしているのかがよくわからない状態です。

下記のところが私が見難いと感じた点です。
1.過度の改行
  コード同士の繋がりが見えにくく、目で追いづらいです。
2.変数名の意味が分かりづらい
  省略のされすぎ、似たような名前の変数が多い、命名記法がバラバラでこれもまた追いかけづらいです。
3.マジックナンバー
  if(A>60000)などの60000といった数値の意味は大抵の場合書いた本人にしかわかりません。
  定数を使ってコード中にマジックナンバーが出てこないようにしましょう。

最後に疑問を
  34行目 if(Boom0101 = 1);
  75行目 if(Boom0102 = 1);
  これらの意図は何ですか?

追記
 チラつきの原因はおそらく裏画面処理をおこなっていないからです。
 SetDrawScreenを使えばいいでしょうが、そもそもの設計に問題があります。ClearDrawScreenを特定の条件下でのみ呼び出すのは今のうちはやめておいたほうがいいように思われます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: キー監視を使用するとちらつきます・・・・

#3

投稿記事 by softya(ソフト屋) » 11年前

はじめまして。
涼雅さんの補足的になりますが、色々問題がありますので次の点を直してもらうと良いと思います。
(1)裏画面を使用して、毎フレームClearDrawScreen()を呼んで画面をクリアします。当然として毎フレームテキストを描画してScreenFlip()する必要があります。
(2)CheckHitKeyではなくキーを押したフレームだけ反応するプログラムにします。
※ どれもゲームプログラミングの館に説明があります。

出来れば、配列を使って文字列を管理することを勉強したほうが良いと思います。
なお、「ゲームプログラミングの館」はあくまでのDXライブラリの入門講座なのでC言語の勉強は別に行ってくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

OWN

Re: キー監視を使用するとちらつきます・・・・

#4

投稿記事 by OWN » 11年前

いろいろ調べてきました

やはり、最初から作り直してみることにします

回答していただいた方々、ありがとうございました。

閉鎖

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