画面が点滅してしまう

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

画面が点滅してしまう

#1

投稿記事 by leat » 14年前

3キーで項目を選択しエンターキーを押すとvoid actを実行し、バックスペースキーを押すと前の画面に戻るプログラムを作ったのですが
前の画面に戻るとHandle0と真っ暗な画面が高速で点滅してしまいます。
点滅しているだけで通常の操作は行うことができ、void actを実行すれば点滅は止まるんですが、やはり戻ると点滅してしまいます。

help.cpp

コード:

#include "../include/GV.h"

	int func_help;
	int Handle0, Handle1, Handle2;
	int flag=0;

	void act(){
		DrawGraph( 0, 0, Handle2, TRUE );
		if (CheckHitKey( KEY_INPUT_BACK ) == 1){
		func_state=1;
		}
	}

	void help(){
		
		Handle0 = LoadGraph( "../data/image/bg.png" );
		Handle1 = LoadGraph( "../data/image/hp.png" );
		Handle2 = LoadGraph( "../data/image/help.png" );
		
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
			
			DrawGraph( 0, 0, Handle0, TRUE );
			
			if (CheckHitKey( KEY_INPUT_3 ) == 1){
				DrawGraph( 0, 300, Handle1, TRUE ); 
				func_help=1;
			}
			
			switch(func_help){

			case 1:
				DrawGraph( 0, 300, Handle1, TRUE ); 
				if (CheckHitKey( KEY_INPUT_RETURN ) == 1){
				func_state=2;
				flag=1;
				}
				break;
			}
				if(flag==1)break;
			}
		}
main.cpp

コード:

	while(ProcessLoop()==0){//メインループ
		switch(func_state){
		case 1:
			help();
			break;
		case 2:
			act();
			break;

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

Re: 画面が点滅してしまう

#2

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

いくつかDXライブラリで守るべき基本事項に問題があります。

・描画は毎フレーム行わなくてはいけません(前フレームの画像を当てにしない)。
・3大処理があちこちに登場してはいけません。
 「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
 http://dixq.net/g/h_11.html
・LoadGraphしたデータをDeleteGprahしない内に読み込んではいけません。helpに来る度にLoadGraph()で読み込まれてメモリが減ります。
これらを守らないと画像が点滅したり、重くなったり、メモリがどんどん減るバグに遭遇します。

その他気になるのは、
・インデントが正しくないのはバグのものとですので注意して下さい。
・func_stateをmain.cpp以外で変更するのは避けたほうが良いでしょう。
・KEY_INPUT_3を押した時DrawGraph( 0, 300, Handle1, TRUE ); が2回描画されるのが無意味です。
・flagって何を意味する変数でしょうか?もっと具体的な名前を付けましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

leat

Re: 画面が点滅してしまう

#3

投稿記事 by leat » 14年前

このようにしてみたんですが結果は同じでした。
DeleteGprahはどこで行えばいいのでしょうか?

コード:

#include "../include/GV.h"

int func_help;
int Handle0, Handle1, Handle2;
int flag=0;

void act(){
	DrawGraph( 0, 0, Handle2, TRUE );
	if (CheckHitKey( KEY_INPUT_BACK ) == 1){
		func_state=1;
	}
}

void help(){
	
	Handle0 = LoadGraph( "../data/image/menu.png" );
	Handle1 = LoadGraph( "../data/image/hp.png" );
	Handle2 = LoadGraph( "../data/image/help.png" );
	
	while( flag==1 ){
		
		DeleteGraph( Handle0 );
		DeleteGraph( Handle1 );
		DeleteGraph( Handle2 );
		
		DrawGraph( 0, 0, Handle0, TRUE );
		
		if (CheckHitKey( KEY_INPUT_3 ) == 1){
			DrawGraph( 0, 300, Handle1, TRUE );
			func_help=1;
		}
		
		switch(func_help){

		case 1:
			DrawGraph( 0, 300, Handle1, TRUE ); 
			if (CheckHitKey( KEY_INPUT_RETURN ) == 1){
				flag=1;
			}
			break;
		}
	}
}

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

Re: 画面が点滅してしまう

#4

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

意味的には逆でhelp()を呼び出す度にDeleteGprah()が必要な状況は作るべきではありません。
「書いてはいけない4つの処理」の説明のリンク先にありますが、Init/Update/Drawの処理は関数を分けてかならずWinMainから呼び出されるように組んで下さい。
今回の場合は、act_Init(),act_Update(),act_Draw()とhelp_Init(),help_Update(),help_Draw()に分けてWinMainから呼び出すようにしてくださいね。

ただ、act()とhelp()の役割分担や正しい意図した動作が私にはよくわかっていません。
現状のプログラムだと
1.help()が呼び出される。 → Handle0が表示される。 
2.3を押す → DrawGraph( 0, 300, Handle1, TRUE ); が表示される。
3.RETURNを押す → 何も起こらない。
本当の意図した動きとact()とhelp()の役割を説明してもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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