ページ 11

DXライブラリの画像のロード

Posted: 2015年1月02日(金) 14:43
by 酒豪
はじめまして プログラミング入門2ヶ月目の初心者です
言語はC++を使っています
DXライブラリにおけるゲームメインループ内での画像のロード方法について教えてほしいのです

ループの中で二度、画像を読み込むのを防ぐために、画像を読み込んだのかどうかをフラグ変数にして保持したいのですが
フラグ変数に初期値であるゼロを代入することができません
コンストラクタを使えば代入できるでしょうが、これを使う手以外はないのでしょうか

よろしければご回答お願いいたします

Re: DXライブラリの画像のロード

Posted: 2015年1月02日(金) 14:46
by プラム
ループ内で画像を読み込む必要はないと思います。
whileを実行する前に画像をロードしてしまえばいいのでは?

Re: DXライブラリの画像のロード

Posted: 2015年1月02日(金) 14:50
by プラム
もしどうしてもループ内で画像を読み込まなければいけない状況になった場合は(ふつうならないと思うが)

コード:

if(count==0){
      LoadGraph("テスト.png");
      count=1;
}
というコードを書けば(たとえば)いいと思います。

Re: DXライブラリの画像のロード

Posted: 2015年1月02日(金) 14:55
by Tatu
DXライブラリ置き場のリファレンスページより
http://homepage2.nifty.com/natupaji/DxL ... .html#R3N2

読み込みに成功した場合はグラフィックハンドルが、
失敗した場合は-1が
グラフィックハンドルを扱う変数に代入されます。

そのため、読み込んだかどうかはグラフィックハンドルを扱う変数が-1かどうかを調べればよいと思います。

Re: DXライブラリの画像のロード

Posted: 2015年1月02日(金) 16:03
by Dixq (管理人)
こういうのはどうですか?
Initialize()関数内の「//画像のロード」部分でロードすればOKです。

コード:

#include "DxLib.h"

enum Status {
	eStatus_Initialize,
	eStatus_Game,
};

Status status;

void Initilize(){
	//画像のロード
	status = eStatus_Game;
}

void Game(){
	//ゲーム処理
}

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

	status = eStatus_Initialize;

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

		switch(status){
		case eStatus_Initialize:
			Initialize();
			break;
		case eStatus_Game:
			Game();
			break;
		}

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
} 
また,変数は0初期化しておけば0以外が入っていればロードしたことがわかります。
終了処理をしたときに0を代入しておけばそれで識別できるでしょう。

Re: DXライブラリの画像のロード

Posted: 2015年1月04日(日) 14:19
by 酒豪
説明不足の点がありました 申し訳ありません
私は以前、C言語でゲーム制作をしたことがありますので、今回はC++のクラスを用いて制作したいです

以前、Dixq様のC++版龍神録のソースコードをダウンロードさせてもらったのですが、そのコードではメインループに入る前に
すべてのグラフィックをコンストラクタでロードしていたと思います

また、ハルルン様が提示していただいたやり方で挑もうと思ってもコンストラクタを使わなければ
フラグ変数に初期値のゼロが代入できません

コンストラクタを避けてはC++のプログラミングは成立しないんでしょうか?

Re: DXライブラリの画像のロード

Posted: 2015年1月04日(日) 17:48
by hide
コンストラクタを使わなくても初期化用のメソッドを書いて必ず呼ぶようにすればほぼ同じです。

逆に言うとコンストラクタは初期化用のメソッドの呼び忘れを防止してくれる、
その程度のものという認識でも十分ですよ。

人の手による”やりわすれ”で起こるバグは非常に多いので、
ちゃんと活用すればスムーズな開発につながるはずです。


コンストラクタを避けたいその真意はなんなのでしょうか?

Re: DXライブラリの画像のロード

Posted: 2015年1月06日(火) 19:16
by 酒豪
>>hide様
私がC++初心者だからなのかもしれませんが、コンストラクタは自分の好きな名前がつけられないので
コンストラクタ内でどのような仕事をしているか分かりづらいと思っていました
C言語から勉強し始めた自分からしてみれば戻り値が無いという特徴が馴染みのないものだったので
なんとなく取っ掛かり難かったのかもしれません
しかし、ただフィールドに初期値を代入するだけのものがコンストラクタなのだと取り決めをしておけば
どんな仕事も何も関係ないですね

C言語のときのようにinitializeメソッドを設置しようかと思いましたが普通にコンストラクタにします
ありがとうございました