1.3 画像の先読み

1.3
画像の先読み
今のままでは速さが足りないッ!
従来の画像表示処理
LoadGraphScreen()
読み込み
(すごく遅い)
表示
HDD
モニタ
これを毎フレーム
そりゃ遅いわな
1.3 画像の先読み
2
どうやって改善するか
HDDへのアクセスが遅くなる原因
►ならHDDにアクセスしなければ良いのでは?
完全にアクセスしないのは無理
►タイミングによってはアクセスが許される
►最初に一度アクセスするだけなら遅くならない
1.3 画像の先読み
3
速い画像表示処理
LoadGraph()
読み込み
(すごく遅い)
保存
メモリ
HDD
これは最初だけ
遅くならない
1.3 画像の先読み
4
速い画像表示処理
DrawGraph()
読み込み
(すごく速い)
表示
メモリ
モニタ
これを毎フレーム
遅くならない
1.3 画像の先読み
5
LoadGraph関数
画像をメモリに読み込んで、その場所を返す
►「メモリの中の何番地に保存しましたよ」ってこと
►この「場所」のことを「ハンドル」と呼ぶ
これはフレームの外で1回呼べば良い
►ゲーム終了までメモリの中に画像が存在する
►ずっと同じハンドルが使えるってこと
// ↓これはループ外かmain外
int playerGraphicHandle;
// ↓これはループ外
playerGraphicHandle = LoadGraph("player.bmp");
1.3 画像の先読み
6
DrawGraph関数
座標とハンドルを指定して画像を描画する
►LoadGraph で取得したハンドルを使う
►座標はお好きにどうぞ
これを LoadGraphScreen と同じように使う
►ファイル名を渡すかハンドルを渡すかの違い
DrawGraph(100, 200, playerGraphicHandle, TRUE);
最後の TRUE は透明化フラグ
►透明化については次のページで説明する
1.3 画像の先読み
7
透明化とは
透明化なし
透明化あり
►背景が隠れてしまう
►ダサい
1.3 画像の先読み
►背景が隠れない
►むしろこれが当然
8
透明化の方法(画像の準備)
1. 透過したい部分を他とカブらない色で塗る
►大抵は極端な色にしておけば問題ない
(例えば右の例は 0xFF00FF のマゼンタ)
※上のような色の表現については補足事項で
2. 24ビット ビットマップとして保存
►PNGだと上手く透過されないことがある
1.3 画像の先読み
9
透明化の方法(コードの対応)
1. SetTransColor 関数を使おう
►透過色扱いにする色を設定する関数
(さっき塗りつぶした色ね)
►DxLib_Init 関数より後で呼ぶ必要がある
// 例えばこれは赤を透過色に設定
SetTransColor(255, 0, 0);
2. DrawGraph の最後の引数を TRUE にしよう
►FALSE にした場合は透過されない
1.3 画像の先読み
10
例えばさっきの傘の画像なら
...
if (DxLib_Init()) return -1;
SetTransColor(255, 0, 255);
handle = LoadGraph("player.bmp");
while (1) {
if (ClearDrawScreen()) break;
ここで一度だけ呼ぶ
→ 重くならない
それぞれの
呼び出し位置に注意
// ... 省略 ...
DrawGraph(x, y, handle, TRUE);
if (ProcessMessage()) break;
}
...
1.3 画像の先読み
11
やってみて欲しいこと
0.4で作ったゲーム?に背景を付けてみよう!
►もちろんキャラクターの背景は透過するよね?
►困ったらどんどん相談しよう!
1.3 画像の先読み
12
補足事項
色の表現方法
►Wikiを見てね
http://nanzanmmc.net/pc/lecture/game/add
1.3 画像の先読み
13