DXライブラリのSetGraphMode()の挙動?について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
HSL
記事: 5
登録日時: 13年前

DXライブラリのSetGraphMode()の挙動?について

#1

投稿記事 by HSL » 13年前

はじめまして。
現在私はDXライブラリを用いたゲームプログラミングの基礎を勉強しております。
今回、15パズルを作成している途中で不明な点が出てきたので質問させていただきます。

コード:

#include "DxLib.h"

const int gCol = 4;
const int gNum = gCol*gCol - 1;
const int gImageSize = 720;
const int SPACE = 10000;
const int gPieceSize = gImageSize/gCol;

int gameBoard[gCol*gCol];
bool gCleared = false;

int gImage[gCol*gCol];

void shuffle(){
	int rand = 0;
	int rand2 = 0;
	int tmp = 0;
	for(int i = 0; i < (GetRand(1000)+100)*2; ++i){
		rand = GetRand(gNum-1);
		tmp = gameBoard[rand];
		rand2 = GetRand(gNum-1);
		while(rand == rand2){
			rand2 = GetRand(gNum-1);
		}
		gameBoard[rand] = gameBoard[rand2];
		gameBoard[rand2] = tmp;
	}
}

int calculate(){
	int count = 0;
	for(int i = 0; i < gNum; ++i){
		for(int j = i; j < gNum; ++j){
			if(gameBoard[i] > gameBoard[j]){
				count++;
			}
		}
	}
	return count;
}
void initGame(){
	for(int i = 0; i < gNum; ++i){
		gameBoard[i] = i + 1;
	}
	shuffle();
	while(calculate() % 2 != 0){
		shuffle();
	}
	gameBoard[gNum] = SPACE;
	LoadDivGraph("img/image.jpg", gCol*gCol, gCol, gCol, gPieceSize, gPieceSize, gImage);
}

void drawGame(){
	int x = 0;
	int y = 0;
	int fontSize = 20;
	int Cr = GetColor(255, 0, 0);
	SetFontSize(fontSize);
	for(int i = 0; i < gCol; ++i){
		x = 0;
		for(int j = 0; j < gCol; ++j){
			if(gameBoard[i*gCol + j] != SPACE){
				DrawGraph(x, y, gImage[gameBoard[i*gCol + j] - 1], TRUE);
				DrawFormatString(x + gPieceSize/2 - fontSize/2, y + gPieceSize/2 - fontSize/2, Cr, "%d", gameBoard[i*gCol + j] );
			}
			x += gPieceSize;
		}
		y += gPieceSize;
	}
}

void updateGame(){
	int input = 100;
	int x, y;
	if((GetMouseInput() && MOUSE_INPUT_LEFT) != 0){
		GetMousePoint(&x, &y);
		int xPos = x/gPieceSize;
		int yPos = y/gPieceSize;
		if(xPos <= gCol && yPos <= gCol){
			input = gameBoard[yPos*gCol + xPos];
		}
	}
	int posInput = 1000;
	for(int i = 0; i <= gNum; ++i){
		if(gameBoard[i] == input){
			posInput = i;
			break;
		}
	}
	if(posInput == 1000){
		return;
	}
	int posSpace = 0;
	for(int i = 0; i <= gNum; ++i){
		if(gameBoard[i] == SPACE){
			posSpace = i;
			break;
		}
	}
	if(posInput - gCol == posSpace || posInput + gCol == posSpace){
		gameBoard[posInput] = SPACE;
		gameBoard[posSpace] = input;
		return;
	}
	if(posInput % gCol == gCol-1){
		if(posInput - 1 == posSpace){
			gameBoard[posInput] = SPACE;
			gameBoard[posSpace] = input;
			return;
		}
		return;
	}else if(posInput % gCol == 0){
		if(posInput + 1 == posSpace){
			gameBoard[posInput] = SPACE;
			gameBoard[posSpace] = input;
			return;
		}
		return;
	}else{
		if((posInput + 1 == posSpace) || (posInput - 1 == posSpace)){
			gameBoard[posInput] = SPACE;
			gameBoard[posSpace] = input;
			return;
		}
		return;
	}
}

void isCleared(){
	for(int i = 0; i < gNum; ++i){
		if(gameBoard[i] != i + 1){
			return;
		}
	}
	gCleared = true;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	SetMainWindowText("15パズル");
	SetOutApplicationLogValidFlag(FALSE);
	SetGraphMode(1024, 768, 32);    //こちらでは"Congratulations!"が表示されない
	DxLib_Init();
	//SetGraphMode(1024, 768, 32);  //こちらだと起動時は640×480になってしまう
	SetDrawScreen(DX_SCREEN_BACK);
	int Cr2 = GetColor(255, 255, 255);
	initGame();
	while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		if(!gCleared){
			drawGame();
			updateGame();
			isCleared();
			gCleared = true;    //クリアが面倒なのでとりあえず
		}else{
			drawGame();
			int Cr = GetColor(0, 255, 255);
			SetFontSize(64);
			const char* msg = "Congratulations!";
			DrawFormatString(gImageSize/2 - GetDrawStringWidth(msg, strlen(msg))/2, gImageSize/2 - 32, Cr, msg);
			WaitTimer(2000);
			DxLib_End();
		}
	}
	return 0;
}
SetGraphMode()をDxLib_Init()の前に記述した場合に終了直前の"Congratulations!"が表示されないのです。
後に記述した場合では起動時のウィンドウサイズが640×480となってしまい、あまり望ましくありません。
起動時のウィンドウサイズを変更でき、終了直前の"Congratulations!"の表示も行える方法がありましたらご教授お願いします。

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

Re: DXライブラリのSetGraphMode()の挙動?について

#2

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

この終わり方はよく有りません。

コード:

            WaitTimer(2000);
            DxLib_End();
と言うか終了してもいません。
ちゃんと制御するなら、DxLib_End();をwhileの外に出だしてWaitTimer(2000);も不要です。
自動的に終わりたいなら終わるまでのフレーム数をカウントしてwhileからbreak;で抜けて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

HSL
記事: 5
登録日時: 13年前

Re: DXライブラリのSetGraphMode()の挙動?について

#3

投稿記事 by HSL » 13年前

softya(ソフト屋)様
ご教授通りに変更してみたところ上手く動作いたしました。
ありがとうございました。
これからも勉強を続けていきたいと思います。
最後に編集したユーザー HSL on 2011年11月20日(日) 10:59 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリのSetGraphMode()の挙動?について

#4

投稿記事 by みけCAT » 13年前

解決したのでしたら解決チェックをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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