文字が重なって表示される

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 文字が重なって表示される

Re: 文字が重なって表示される

#16

by royal » 8年前

わかりました!難しい所もありますが頑張ります

Re: 文字が重なって表示される

#15

by Dixq (管理人) » 8年前

まずプログラムを組む前にプログラミング手法を学びましょう
http://dixq.net/g/
こちらの「メニュー画面の作り方」「ゲームプログラミング設計」を読んでください。
内容がもし理解できなければそれぞれ最初の章だけでも構いません。
賢者は経験ではなく歴史から学ぶのです。

Re: 文字が重なって表示される

#14

by royal » 8年前

ありがとうございます!引き続きクイズのプログラムを組んでいきたいと思います

Re: 文字が重なって表示される

#13

by Dixq (管理人) » 8年前

素晴らしいです。
その要領でプログラムを汲んで行きましょう。
クイズで色んなシーンがあるなら、
各関数を関数分けし、switch文かif文で
シーンの呼び分けをしてみましょう。

Re: 文字が重なって表示される

#12

by royal » 8年前

学校があったため返信が遅れました
Dixq (管理人) さんが書きました:
60カウント後に終了するのではなく、1秒間に60回、1フレーム毎に、裏画面への描画、表画面への反映、裏画面の全消しを繰り返し続けるのです。
申し訳ありません...ではAという文字を横に動かすという感じで組んでみましたがどうでしょうか

コード:

#include "DxLib.h"

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

	int i=0;
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		
		DrawFormatString(i, 0, GetColor(255, 255, 255), "A"); // Aを動かす
		i = i + 1;

		
	}

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

Re: 文字が重なって表示される

#11

by Dixq (管理人) » 8年前

上で示しているみけCAT君のリンク先ご覧になりしたか?
書いてはいけない処理が書かれています。
私が書いた基本形は崩さないでください。

また、解釈がちがっています。
60カウント後に終了するのではなく、1秒間に60回、1フレーム毎に、裏画面への描画、表画面への反映、裏画面の全消しを繰り返し続けるのです。
この関数は複数書いてはいけません。
これを基本形にして行いたいことが行えるように作るのです。
1秒後になにかやりたいとき60フレーム後に処理するという考え方はあっています。

DXライブラリの終了関数の場所は変えないでください。

Re: 文字が重なって表示される

#10

by royal » 8年前

1秒間60回描いて消すというプログラムを作りましたがどうでしょうか

コード:


#include "DxLib.h"

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

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

		int Count = 0;
		while (!ScreenFlip() && !ClearDrawScreen() && !ProcessMessage())
		{
			
			Count++;
			
			DrawFormatString(0, 0, GetColor(255, 255, 255), "%d",Count);
		
			
			if (Count == 60) {
				DxLib_End(); // DXライブラリ終了処理
			}
			
		}

	}

	
	return 0;
}

Re: 文字が重なって表示される

#9

by royal » 8年前

誤解を招く行動をとってしまいました、申し訳ありません

自分のプログラムはそれぞれ
・main.cpp
・game.cpp
・game.h
・MoviePlayer.cpp
・MoviePlayer.h
・Movieplayer02.cpp
・Movieplayer02.h

と分けて設計していて上で記載したプログラムはgame.cppのものとなっています
Dixq (管理人) さんが書きました:まずは1秒間に60回、描いて消して、描いて消してを繰り返して成立するプログラムコードを書いてみて下さい。
今回のコードを変更するのが難しければ画像を少しずつ動かすだけのテストコードから着手してみてください。
わかりました、やってみます

Re: 文字が重なって表示される

#8

by Dixq (管理人) » 8年前

ソースコードは全文を載せるようにしてください。こちらで実行して試せないからです。
また、このコードは非常に良くないコードになってしまっています。
ゲームプログラミングの館の方はご覧頂けましたでしょうか。
入門時は基本形として必ずこうなると思ってください。
これ以外の形になっているとしたら何かが間違っています。

コード:

#include "DxLib.h"

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

        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

                //ここに処理を追加

        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}
まずは1秒間に60回、描いて消して、描いて消してを繰り返して成立するプログラムコードを書いてみて下さい。
今回のコードを変更するのが難しければ画像を少しずつ動かすだけのテストコードから着手してみてください。

Re: 文字が重なって表示される

#7

by royal » 8年前

返信が遅れてしまいました... WaitTimerを除いたプログラムです

コード:


	do {

		DrawGraph(0, 0, Handle02, TRUE);
		SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255);		//ブレンドモードをα(128/255)に設定
		DrawGraph(430, 30, Handle03, TRUE);

		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

		r = GetRand(2);

		DrawGraph(430, 30, Handle04, TRUE);
		DrawGraph(550, 520, Handle05, TRUE);

		DrawFormatStringToHandle(1500, 120,w, FontHandle, "%d点", a);

		strcpyDx(cpy, data1[i].mon);
		bx = strlen(cpy);


		DrawFormatString(665, 200, w, data1[i].mon);
		DrawFormatString(665, 260, w, data1[i].mon2);
		DrawFormatString(780, 615, blk, data2[i].sen1);
		DrawFormatString(780, 745, blk, data2[i].sen2);
		DrawFormatString(780, 877, blk, data2[i].sen3);
		DrawFormatString(780, 999, blk, data2[i].sen4);
		DrawFormatString(630, 120, w, data2[i].janru);
		DrawFormatString(1180, 120, w, "第 %d 問", i + 1);


		
			while (1) {
				//キー入力判定
				if (CheckHitKey(KEY_INPUT_1) == 1) {

					j = 1;
					DrawGraph(860, 570, Handle06, TRUE);
					
					//2秒待つ

					break;


				}
				else if (CheckHitKey(KEY_INPUT_2) == 1) {

					j = 2;
					DrawGraph(860, 700, Handle06, TRUE);
					
					//2秒待つ

					break;


				}
				else  if (CheckHitKey(KEY_INPUT_3) == 1) {

					j = 3;
					DrawGraph(860, 830, Handle06, TRUE);
					
					//2秒待つ

					break;

				}
				else if (CheckHitKey(KEY_INPUT_4) == 1) {

					j = 4;
					DrawGraph(860, 960, Handle06, TRUE);
					
					//2秒待つ

					break;


				}
			}
			
		


		// 正解か不正解か判定

		if (j == data2[i].ans) {

			ClearDrawScreen();

			DrawGraph(0, 0, Handle02, TRUE);
			SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255);		//ブレンドモードをα(128/255)に設定
			DrawGraph(430, 30, Handle03, TRUE);

			SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

			DrawGraph(430, 30, Handle04, TRUE);
			DrawGraph(550, 520, Handle05, TRUE);

			DrawFormatString(780, 615, blk, data2[i].sen1);
			DrawFormatString(780, 745, blk, data2[i].sen2);
			DrawFormatString(780, 877, blk, data2[i].sen3);
			DrawFormatString(780, 999, blk, data2[i].sen4);
			DrawFormatString(665, 120, w, data2[i].janru);

			DrawFormatString(1180, 120,w, "第 %d 問", i + 1);

			a = a + 100;
			DrawFormatStringToHandle(1500, 120, w, FontHandle, "%d点", a);
			MoviePlayer();

		}
		else {

			Movieplayer02();

		}


		i++;

	} while (i < 3);

	DxLib_End();

}


Re: 文字が重なって表示される

#6

by Dixq (管理人) » 8年前

DXライブラリの使い方はこちらに書いておりますので参考にしてください
http://dixq.net/g/

まずは書いてはいけない処理をのぞいて作ったコードを提示してもらえますか?
そこから徐々に悪い所を取り除いていきましょう。

Re: 文字が重なって表示される

#5

by royal » 8年前

みけCAT さんが書きました:
royal さんが書きました:それで、何か問題はありましたか?
特に問題はなく動作しました
みけCAT さんが書きました: 解決してほしければ、そのコードを提示してください。
詳しく言ってませんでしたが次の問題に移行するときに画面が真っ黒になったということです、
変更した部分はその3秒経ってから次の問題に移行の部分のみです、countはすでに定義してあります。

コード:

		//3秒経ってから次の問題に移行
		while (!ScreenFlip() && !ClearDrawScreen() && !ProcessMessage()) {
			Count++;

			if (Count == 180) {
				i++;
			}

		}

Re: 文字が重なって表示される

#4

by みけCAT » 8年前

royal さんが書きました:試してみましたが文字は重ならずに文字が描画されました
それで、何か問題はありましたか?
royal さんが書きました:フレームごとの処理は書いてみたものの画面が真っ暗になってしまいました
解決してほしければ、そのコードを提示してください。

Re: 文字が重なって表示される

#3

by royal » 8年前

みけCAT さんが書きました:その方法は試してみましたか?
試してみましたが文字は重ならずに文字が描画されました

フレームごとの処理は書いてみたものの画面が真っ暗になってしまいました

Re: 文字が重なって表示される

#2

by みけCAT » 8年前

(FPS制御以外での)Waitは書いてはいけない処理とされています。
できれば1フレームごとに全て描き直す方式への移行を試みることをおすすめします。
royal さんが書きました:問題文や選択肢は繰り返すときに全ての画像を上から被せて重ならないようにしているのですが得点も同様に同じ方法でやればいいのでしょうか?
その方法は試してみましたか?

文字が重なって表示される

#1

by royal » 8年前

初投稿です、よろしくお願いします
現在クイズゲームを作っているのですが正解したとき10点を加算したいですがどうも0という文字が消えなく0の上に10が描画され重なって表示されてしまいます
問題文や選択肢は繰り返すときに全ての画像を上から被せて重ならないようにしているのですが得点も同様に同じ方法でやればいいのでしょうか? 

コード:

#include "DxLib.h"
#include "Game.h"
#include "MoviePlayer.h"

//クイズの問題数 
int mon = 1;

//構造体

struct mondai_data {

	char mon[80];

};
typedef mondai_data data1;


struct sentaku_data {

	char sen1[20];
	char sen2[20];
	char sen3[20];
	char sen4[20];
	char janru[20];
	int ans;
};
typedef sentaku_data data2;



void Game() {




	//構造体で問題と選択肢の設定

	mondai_data data1[] = {
		
		"47都道府県のうち最も北にあるのは?",

	};

	sentaku_data data2[] = {

		

		//雑学
		{ "東京都","秋田県","北海道","大阪府","雑学",3 },
		
	};

	SetFontSize(38);
	ChangeFont("ニタラゴルイカ教漢-07");
	int a = 0, b = 0, i, j = 0, r = 0;
	int s = GetNowCount();
	int White = GetColor(255, 255, 255);
	int toku[9];



	//画像読み込み
	int Handle02 = LoadGraph("Debug/images/背景2.png");
	int Handle03 = LoadGraph("Debug/images/出題用2.png");
	int Handle04 = LoadGraph("Debug/images/出題額縁.png");
	int Handle05 = LoadGraph("Debug/images/選択肢.png");
	int Handle06 = LoadGraph("Debug/images/選択表示.png");
	

	//動画読み込み
	int MovieHandle00 = LoadGraph("Debug/images/正解アニメ.mp4");
	PlayMovieToGraph(MovieHandle00);	

	ChangeFontType(DX_FONTTYPE_ANTIALIASING);

	

	i = 0;
	do {


		DrawGraph(0, 0, Handle02, TRUE);
		SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);		//ブレンドモードをα(128/255)に設定
		DrawGraph(443, 30, Handle03, TRUE);

		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

		r = GetRand(1);

		DrawGraph(443, 30, Handle04, TRUE);
		DrawGraph(550, 520, Handle05, TRUE);

		DrawFormatString(1500, 120, GetColor(255, 255, 255), "%d点", a);
		DrawFormatString(620, 120, GetColor(255, 255, 255), data1[i].mon);
		DrawFormatString(780, 615, GetColor(38, 38, 38), data2[i].sen1);
		DrawFormatString(780, 745, GetColor(38, 38, 38), data2[i].sen2);
		DrawFormatString(780, 877, GetColor(38, 38, 38), data2[i].sen3);
		DrawFormatString(780, 999, GetColor(38, 38, 38), data2[i].sen4);
		DrawFormatString(150, 120, GetColor(38, 38, 38), data2[i].janru);


		while (1) {
			//キー入力判定
			if (CheckHitKey(KEY_INPUT_1) == 1) {

				j = 1;
				DrawGraph(860, 570, Handle06, TRUE);
				WaitTimer(2000);
				break;

			}
			else if (CheckHitKey(KEY_INPUT_2) == 1) {

				j = 2;
				DrawGraph(860, 700, Handle06, TRUE);
				WaitTimer(2000);
				break;


			}
			else  if (CheckHitKey(KEY_INPUT_3) == 1) {

				j = 3;
				DrawGraph(860, 830, Handle06, TRUE);
				WaitTimer(2000);
				break;

			}
			else if (CheckHitKey(KEY_INPUT_4) == 1) {

				j = 4;
				DrawGraph(860, 960, Handle06, TRUE);
				WaitTimer(2000);
				break;


			}
		}



		// 正解か不正解か判定

		if (j == data2[i].ans) {
			
			
			
			a = a + 10;
			DrawFormatString(1500, 120, GetColor(255, 255, 255), "%d点", a);
			MoviePlayer();

		}
		else {

			DrawString(620, 400, "不正解", GetColor(255, 255, 255));

		}



		//3秒経ってから次の問題に移行
		WaitTimer(3000);
	
		i++;
	} while (i < 1);
	
}


ページトップ