DXライブラリ講習

PC講習その1
DXライブラリ
画面に図形を表示したり、マウスの座標を調べたりできるよ
DXライブラリがあるか確認
 DXライブラリがあるか確認しよう
1. エクスプローラーを開く
2. ローカルディスク(C:)を開く
3. 「DxLib_VC」があればOK
 DXライブラリがない人は手を挙げてね
DXライブラリ
2
プロジェクトの準備をし
よう
詳しくは別のスライドで
DXライブラリ
3
何もしないプログラム
 とりあえず下のプログラムを入れてみよう
 わけのわからんものがいろいろあるが、気にしない
 そして実行(Ctrl+F5)
 このプログラムは何もしませんが、これが基本になります
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR pCmdLine, int showCmd)
{
return 0;
}
DXライブラリ
4
DXライブラリの初期化と終了
 DXライブラリにはいろいろな関数がある
 int DxLib_Init( void ) ;
 ライブラリの初期化
 戻り値:
成功したら0、失敗したら-1
 int DxLib_End( void ) ;
 ライブラリ使用の終了関数
 戻り値:
成功したら0、失敗したら-1
 戻り値が、成功=0,失敗=-1となる関数が多い
DXライブラリ
5
DXライブラリの初期化と終了
 下のプログラムを実行しよう
 フルスクリーンで起動してすぐ終了します
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR pCmdLine, int showCmd)
{
if (DxLib_Init() != 0)
return -1;
DxLib_End();
return 0;
}
DXライブラリ
6
ウィンドウモードにする
 ゲーム作ってる時にフルスクリーンは邪魔なので、ウィンドウモー
ドにしよう
 int ChangeWindowMode( int Flag ) ;
 ウインドウモード・フルスクリーンモードの変更を行う
 引数
 FlagにTRUEを入れるとウィンドウモード
 FlagにFALSEを入れるとフルスクリーンモード
 DXライブラリの初期化の前にこれを使うと、ウィンドウモードで起
動する
DXライブラリ
7
ウィンドウモードにする
 下のプログラムを実行しよう
 ウィンドウモードで起動してすぐ終了します
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR pCmdLine, int showCmd)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() != 0)
return -1;
DxLib_End();
return 0;
}
DXライブラリ
8
ウィンドウを開いたままにする
 ウィンドウを開いたままにするにはどうしたらよいか
 繰り返しを使ってプログラムを実行し続ければよい
while (true)
{
}
 ところがプログラムは定期的にWindowsに応答しなければならない
 int ProcessMessage( void ) ;
 ウィンドウのメッセージを処理する
 戻り値: 成功なら0、ウィンドウが閉じられていたら-1
DXライブラリ
9
ウィンドウを開いたままにする
 下のプログラムを実行しよう
 ウィンドウが開いたままになる
 右上の×ボタンをクリックして閉じる
:
:
if (DxLib_Init() != 0)
return -1;
while (ProcessMessage() == 0)
{
}
DxLib_End();
return 0;
DXライブラリ
}
10
図形を描く
 int DrawCircle( int x , int y , int r , int Color, int FillFlag ) ;
 円の描画
 引数
 x,yは中心座標、rは半径
 Colorは色コード
 FillFlagは、TRUEにすると中身も塗りつぶし、FALSEにすると輪郭のみ
 int GetColor( int Red , int Green , int Blue ) ;
 色コードを取得する
 引数: Red,Green,Blue、それぞれ0~255
 戻り値:
DXライブラリ
カラーコード
11
図形を描く
 while文の前に追加して実行しよう
:
:
if (DxLib_Init() != 0)
return -1;
int color = GetColor(0, 255, 0);
DrawCircle(100, 100, 100, color, TRUE);
while (ProcessMessage() == 0)
:
:
DXライブラリ
12
図形を描く
 円が表示される
DXライブラリ
13
図形を描く
 int DrawBox( int x1 , int y1 , int x2 , int y2 , int Color , int
FillFlag ) ;
 四角形を描画
 引数
 x1,y1は左上、x2,y2は右下の座標
 Colorは色コード
 FillFlagは、TRUEにすると中身も塗りつぶし、FALSEにすると輪郭のみ
DXライブラリ
14
図形を描く
 さらに追加して実行しよう
:
:
if (DxLib_Init() != 0)
return -1;
int color = GetColor(0, 255, 0);
int colorBox = GetColor(0, 0, 255);
DrawCircle(100, 100, 100, color, TRUE);
DrawBox(0, 0, 400, 100, colorBox, TRUE);
while (ProcessMessage() == 0)
:
:
DXライブラリ
15
図形を描く
 プログラムは
上から下へと
実行される
 円を描いた後
に四角が描か
れる
 すると円が隠
れる
 順番には気を
付けよう
DXライブラリ
16
マウスの位置を調べる
 int GetMousePoint( int *XBuf, int *YBuf );
 マウスカーソルの位置を取得する
 引数: XBuf,YBufはX座標とY座標を保存するint型変数のポインタ
DXライブラリ
17
マウスの位置を調べる
 マウスの位置を調べて、その位置に円を描くプログラム
 マウスカーソルの位置を画面の真ん中ぐらいにしてから、プログラ
ムを実行しよう
if (DxLib_Init() != 0)
return -1;
int color = GetColor(0, 255, 0);
int x, y;
GetMousePoint(&x, &y);
DrawCircle(x, y, 10, color, FALSE);
while (ProcessMessage() == 0)
DXライブラリ
18
マウスの位置を調べる
 マウスカーソル
があった位置に
円が描かれる
 ただし、マウス
座標の取得と円
の描画は一回だ
けなので、マウ
スを動かしても
円は動かない
DXライブラリ
19
図形を動かす
 「マウスの位置を調べる→その位置に円を描く」という処理をした
 これを繰り返し行えば円が動く
 while文に入れてみよう
 そして実行して、マウスを動かしてみよう
if (DxLib_Init() != 0)
return -1;
int color = GetColor(0, 255, 0);
int x, y;
DXライブラリ
while (ProcessMessage() == 0)
{
GetMousePoint(&x, &y);
DrawCircle(x, y, 10, color, FALSE);
}
DxLib_End();
20
図形を動かす
 わーい
DXライブラリ
21
図形を動かす
 「マウスの位置を調べる→その位置に円を描く」という処理を繰り
返した結果、円だらけになった
 そこで、画面を消して(真っ黒にして)から円を描くことにする
 つまり、「画面を消去→マウスの位置を調べる→その位置に円を描
く」という処理を繰り返す
DXライブラリ
22
図形を動かす
 int ClearDrawScreen( void ) ;
 画面に描かれたものを消去する
 画面を消去する文を追加して実行しよう
while (ProcessMessage() == 0)
{
ClearDrawScreen();
GetMousePoint(&x, &y);
DrawCircle(x, y, 10, color, FALSE);
}
DXライブラリ
23
図形を動かす
 円が一個だけ
になった
 マウスを動か
すと円も動く
DXライブラリ
24
ダブルバッファリング
 ゲームはこのように「画面を消去→画面に描く」を繰り返している
 しかし、描くものが多くなると「消去→描く→描く→描く→描く」
という処理で、描いている途中の画面が見えてしまい、画面がちら
ついて見える
 そこで、「ダブルバッファリング」という方式を使う
 ダブルバッファリングは以下の処理を繰り返す
DXライブラリ
1.
裏画面を消去
2.
裏画面にいろいろ描く
3.
表画面に裏画面をコピー
25
ダブルバッファリング
裏
表
裏から表へコピー
 裏は表示さ
れない
 実際に表示
されるのは
表だけ
 表はちらつ
いていない
裏を消す
裏に描く
裏から表へコピー
DXライブラリ
26
ダブルバッファリング
 int SetDrawScreen( int DrawScreen ) ;
 描画先グラフィック領域の指定
 引数DrawScreen
 DX_SCREEN_FRONT : 表の画面(表示されている画面)
 DX_SCREEN_BACK : 裏の画面(表示されていない画面)
 int ScreenFlip( void ) ;
 フリップ関数、画面の裏ページを表ページに反映する
 ちなみにこの関数が実行されると、まずプログラムは一時停止し、ディスプ
レイが更新されるタイミングに合わせて表に反映し、プログラムを再開する
 ちなみにディスプレイは1秒間に60回更新している
 while文にこの関数を入れるだけで、while文は安定して1秒間に60回繰り返す
DXライブラリ
27
ダブルバッファリング
 下のプログラムを実行しよう
if (DxLib_Init() != 0)
return -1;
SetDrawScreen(DX_SCREEN_BACK);
int color = GetColor(0, 255, 0);
int x, y;
while (ProcessMessage() == 0)
{
ClearDrawScreen();
GetMousePoint(&x, &y);
DrawCircle(x, y, 10, color, FALSE);
DXライブラリ
ScreenFlip();
}
28
まとめ
つまり、ゲームを作るときは次のプログラムを使えばOK
DXライブラリ
29
まとめ
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR pCmdLine, int showCmd)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() != 0)
return -1;
SetDrawScreen(DX_SCREEN_BACK);
//
↓
//
↑
一回だけ
while (ProcessMessage() == 0)
{
ClearDrawScreen();
//
↓
//
↑
何回も繰り返す
ScreenFlip();
}
DxLib_End();
DXライブラリ
return 0;
}
30
関数リファレンス
 DXライブラリには、ほかにもいろいろな関数がある
 DXライブラリの公式サイト
 http://homepage2.nifty.com/natupaji/DxLib/
 DXライブラリの「関数リファレンス」はDXライブラリの辞書
 これを見ながらゲームを作ろう
DXライブラリ
31
DXライブラリで分からないこと
があれば
 プロジェクトの準備
 「プロジェクトの準備」のスライドを見る
 プロジェクトの準備の後からダブルバッファリングまで
 このスライドを見る
 そこまでできたら
 DXライブラリの「関数リファレンス」で関数を調べる
 それでも分からないことがあったら
 ネットで検索
 DXライブラリに詳しそうな人に聞く
 PC長に聞く
DXライブラリ
32
終わり
お疲れ様でした。次はC言語の復習をします
DXライブラリ
33