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
© Copyright 2025 ExpyDoc