TNP資料室 @ ウィキ

画像をメモリに読み込む

最終更新:

kokeiro

- view
だれでも歓迎! 編集

画像をメモリに読み込む

 さて、いよいよ目に見える部分を作成していくことが出来ます。
 まずはタイトル画面に画像を表示してみようと思います。画像を画面に表示するためには
  1. 画像をメモリに読み込む
  2. 読み込んだ画像を表示するよう命令する
という2つのプロセスが必要です。今回は前者の画像をメモリに読み込む処理を説明します。ただ読み込ませるだけならあまり説明は必要ないのですが、実用的な使い方をするためにはちょっと頭を使う必要があります。

 DXライブラリの画像を読み込む関数を使用します。読み込んだ画像はint型の整数値で管理します。画像を表示したい場合、この整数値の画像を描画しなさいと命令します。この整数値のことをグラフィックハンドルといいます。よってこのグラフィックハンドルはプログラムが終了するまで記憶しておく必要があります。そこでグラフィックハンドルを格納する変数をグローバル変数にします。普通に関数内で宣言された変数は、その関数が終わるときに値が破棄されてしまいます。その点グローバル変数はプログラムを開始した時点で本体が作られ、らプログラムが終了まで値が破棄されることがありません。

 さて、グラフィックハンドルを格納するグローバル変数を追加しましょう。タイトルのグラフィックハンドルを格納するので、変数名をTitleGraphicとします。慣れてきたら変数名を短くしてもいいですが、慣れていないうちはしっかりと意味の分かる変数名にしましょう。
 さまざまなソースファイルからこのグローバル変数にアクセスするためには例の外部変数宣言が必要になります。外部変数宣言はあくまでも別のソースファイルに変数の本体があるということを示すものです。変数の本体(extern)がついていない変数を書き忘れることのないようにしましょう。
 グローバル変数の本体はtitle.cppに書くとします。

main.h

extern int GameState;					// ゲームの状態を格納する変数
extern int Key[256];					// キーの押下時間を格納する配列
extern int white;					// 白のカラーコードを格納する

extern int TitleGraphic;				// タイトルのグラフィックハンドル
...

title.cpp

#include"DxLib.h"
#include"main.h"

int TitleGraphic;					// タイトルのグラフィックハンドル

// タイトルの関数
...



 なお、この関数でメモリに読み込んだ画像データは特別な処理をしない限りプログラムが終了するまでずっと記憶されます。つまり、何回も同じ画像を読み込む必要はないのです。そこで、メインループが始まる前に1回だけ読み込ませましょう。main関数に画像をロードするよう記述します。そのまえに、プロジェクトのフォルダにpictureフォルダを作成し、そこにこの画像を入れてください。
title_back.bmp
 では書き足します。

main.cpp

...
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
...
	white = GetColor(255,255,255);
	GameState = 0;							// 最初はTitle関数を呼び出す
	TitleGraphic = LoadGraph("picture/title_back.bmp");	// タイトルの画像を読み込む
	printfDx("%d",TitleGraphic);						// ハンドルが得られたか確認する

	while( ProcessMessage()==0 && GetKeyInput(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && ClearDrawScreen() == 0){
...
}
...

 ここでちょっとしたデバッグネタが書かれています。printfDx関数ですね。この関数はコンソールのprintf関数のように書式付の文字を描画することが出来ます。¥nによる改行もできます。LoadGraphはグラフィックの読み込みに失敗したら-1を返します。もしこのプログラムを起動したときに-1と表示されるようであればうまくロードされていません。名前の指定が間違っている、画像を入れるフォルダを間違えているなどの理由が考えられます。-1以外が表示されたら成功です。
 内部処理が複雑で重く、普通のゲームの文字列描画には使うべきではありません。普通はこのようにデバッグのためのメッセージを表示するときに使用します。また、この関数で描画された文字はclsDxという関数を呼び出さないと消すことが出来ません。このメッセージを消せるようにするため、下のように書き足しましょう。


main.cpp

...
// キーの押下時間を調べる関数
// 戻り値 常に0  引数 キーの押下時間を格納する配列の先頭ポインタ
int GetKeyInput(int Key[] ){
	char damy[256];
	GetHitKeyStateAll(damy);
	for(int i=0 ; i<256 ; i++){
		if( damy[i] == 1 )
			Key[i]++;
		else
			Key[i]=0;
	}
	if( Key[KEY_INPUT_F] == 1 )	// Fが押されたらクリア
		clsDx();
	return 0;
}

 これでFキーを押せば消すことが出来るようになりました。別にFじゃなくてもかまいません。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

添付ファイル
目安箱バナー