ホーム
チュートリアル
第一回
第二回
第三回
第四回
第五回
第六回
      
チュートリアル番外編
第一回
第二回
第三回
第四回
拡張ソース
TrueType表示クラス
(チュートリアル第六回参照)
掲示板
メール
(-nospamを外してください)

チュートリアル

第一回 とりあえずウィンドウを出す

開発環境の設定

これからIrrlichtを使ってプログラムを作っていくわけですが、まずは開発環境の設定から行いましょう。
今回はVisual C++ 6.0を使用した場合の環境設定について説明します。
機会を見てLinuxの場合についても紹介したいと考えていますが、今現在手元に手頃なVGAの入ったLinuxマシンがないので、いつになるのかは不明ですorz

まずはダウンロードから

とりあえずIrrlichtがないことには何も始まりませんから、ダウンロードをしましょう。
こちらからダウンロードしてきてください。
ダウンロードした後、書庫を任意のディレクトリに解凍します。今回はC:\Irrlicht-0.6に解凍したものとして話を続けます。
Windows環境で、下位環境にDirectXを使う場合、DirectX SDKも必要になりますので、必要ならば合わせてこちらからダウンロードをしておきましょう。DirectX SDKはC:\DXSDK下にインストールしたものとします

ディレクトリの設定

解凍が終わったら、解凍したディレクトリをVisual C++のディレクトリパスに設定する必要があります。
Visual C++を立ち上げ、メニューから「ツール」→「オプション」を選んで「ディレクトリ」タブを選び、Irrlichtと、必要ならDirectX SDKのディレクトリを以下のような形で追加してください。

プロジェクトを作る

環境の設定が終わったら、プロジェクトを作って、いよいよプログラミング開始です。
「ファイル」→「新規作成」を選び、Win32アプリケーションプロジェクトを作成してください

続いては、「空のプロジェクト」を選択してください

プロジェクトが出来上がったら、「プロジェクト」→「プロジェクトへ追加」→「新規作成」を選び、main.cppを作りましょう

いよいよコーディング

いよいよプログラム記述の準備が整いました。いよいよコーディングです
main.cppに以下のコードを記述しましょう

最初のお約束

まず最初に、各種宣言を記述します

/*
 * 初めてのIrrlichtプログラム
 */

#ifdef WIN32
#include <windows.h>
#endif
#include <irrlicht.h>
using namespace irr;

using namespace core;
using namespace video;

#pragma comment(lib, "Irrlicht.lib")

Irrlichtを使う場合、この部分はお約束と思ってほぼ差し支えないです。
Windowsの場合だけはwindows.hをインクルードします
次の#include文でIrrlichtのヘッダを呼び出し、以下の行でIrrlichtが使用しているnamespaceを宣言します。
Irrlichtのサービスを呼び出すごとに、irr::core::????といった形で宣言してもかまいませんが、この方が楽ですよね?
まずはIrrlichtの基本ネームスペースであるirrを宣言します。
その後、今回のプログラムで使用するサブモジュール(videoとcoreを今回使用します)を宣言します。
最後の#pragma文についてですが、Irrlichtは実行時にIrrlicht.dllというdllを使用するため、そのための宣言だと思ってもらって差し支えないです。

二通りのメイン関数

お約束の宣言部が終わったところで、メイン関数を記述しましょう
ここでもWindows特有の記述が入ってきます

#ifdef WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
{	return 0;
}

Windowsの場合に限り、プログラムはWinMain関数から始まります。Linux等の場合はコンソールアプリケーションと同じくmain関数から始まります。
実は、プロジェクトを「Win32コンソールアプリケーション」として作成した場合は、main()から開始することが可能です。
(その場合、先頭部分でのwindows.hのインクルードも不要になります)
ただし、この場合少し見苦しいことになるので、私はこの書き方を推奨します。
どのように見苦しいのかは、一度やってみるといいでしょう。

二つの基本クラス

メイン関数の外枠が出来上がったので、関数内部に肉付けを行います。
メイン関数内に以下の記述を追加しましょう。(追加する部分は強調で記述しています)

#ifdef WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
{
    IrrlichtDevice *Device = createDevice(EDT_OPENGL, dimension2d<s32>(512, 384), 16, false, false, 0);
    IVideoDriver *Driver = Device->getVideoDriver();

    return 0;
}

Irrlichtの基本となる二つのクラスを生成します。
まずはIrrlichtDeviceクラスを生成します。
IrrlichtDeviceは、Irrlichtの全てのクラスの核となり、Irrlichtが内包する各種クラスにアクセスする際のコアとなります。Irrlichtを使用したプログラムの初期処理は、まずはirr::createDevice関数でIrrlichtDeviceオブジェクトを確保することから始まります。
当面は、「IrrlichtDevice = ウィンドウ」と理解して差し支えないでしょう。

IrrlichtDevice* irr::createDevice (
    video::EDriverType                  deviceType = video::EDT_SOFTWARE,
    const core::dimension2d< s32 > &    windowSize = core::dimension2d< s32 >(640, 480),
    u32                                 bits = 16,
    bool                                fullscreen = false,
    bool                                stencilbuffer = false,
    IEventReceiver *                    receiver = 0,
)
レンダリング環境、画面サイズ等を指定してIrrlichtDeviceオブジェクトを作成します。
成功すると、生成したIrrlichtオブジェクトのポインタを、失敗するとNULLを戻します。
video::EDriverType deviceType 下位となるレンダリング環境を指定します。
EDT_OPENGL:OpenGLを使用します
EDT_DIRECTX8:DirectX 8を使用します
EDT_DIRECTX9:DirectX 9を使用します
const core::dimension2d< s32 > & windowSize 作成するウィンドウサイズを設定します
デフォルトは640,480です
bool fullscreen 画面をフルスクリーン化するかどうか設定します
trueの場合フルスクリーンになります
bool stencilbuffer ステンシルバッファを使用するかどうか設定します
ステンシルシャドウを使用する場合だけtrueに設定しますが、当面はfalseにしておいてください
IEventReceiver * receiver イベント処理をするIEventReceiverを設定します
当座は0を設定しておきます

続いて、IVideoDriverオブジェクトを取得します。
IVideoDriverクラスは低レベル描画管理を行うクラスで、作成したIrrlichtDeviceへの描画全般を管理します。
このクラスは、線を引く、面を描く等の低レベルのサービスを提供しますが、詳しくは次回以降で説明します。

irr::video::IVideoDriver* irr::IrrlichtDevice::getVideoDriver ()
IrrlichtDeviceが内包するIVideoDriverオブジェクトへのポインタを返します

描画ループ

基本クラスを宣言したら、描画ループを記述します
以下のコードを強調部分を追加してください

#ifdef WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main()
#endif
{
    IrrlichtDevice *Device = createDevice(EDT_OPENGL, dimension2d<s32>(512, 384), 16, false, false, 0);
    IVideoDriver *Driver = Device->getVideoDriver();

    while(Device->run())
    {
        Driver->beginScene(true, true, SColor(0,100,100,160));

        Driver->endScene();
    }
    Device->drop();

    return 0;
}

IrrlichtDevice::run()関数は、該当Deviceのウィンドウが閉じられるまでtrueを返します。
したがって、while(Device->run())でウィンドウが閉じられるまでループします。
IVideoDriver::beginScene()関数は指定された色で画面をクリアし、以後各種描画命令を実行可能な状態にします。
IVideoDriver::endScene()関数は、beginScene後に行われた各種描画命令を締め切り、画面に描画します。
基本的に、メインとなるループは

1.beginSceneで描画開始
2.何らかの描画命令
3.endSceneで描画終了
4.以上をIrrlichtDeviceが有効な間実行

となります

bool irr::video::IVideoDriver::beginScene (
    bool                                backbuffer,
    bool                                zbuffer,
    SColor                              color,
)
描画バッファ、Zバッファをクリアして、描画処理を開始します。
成功するとtrue、失敗するとfalseを戻します。
bool backbuffer 描画バッファをクリアするかどうかを決定します。
この値がtrueの場合、colorで指定された色で描画領域をクリアします。
普通はtrueで良いでしょう。
bool zbuffer Zバッファをクリアするかどうかを決定します。
SColor color backbufferがtrueであった場合に、塗りつぶす色を設定します
irr::video::IVideoDriver* irr::IrrlichtDevice::getVideoDriver ()
IrrlichtDeviceが内包するIVideoDriverオブジェクトへのポインタを返します

さて実行・・・あれ?

DLLを忘れずに

これで今回のコーディングは終わりました。F7でビルドを行えば、設定が間違っていなければ正常にexeファイルが作られると思います。
そこでF5を押して実行してみましょう?動きましたか?

もしかするとこんなダイアログが出てきたかもしれません。
Irrlichtを使用したプログラムでは、Irrlicht.dllというdllが実行パスに必要であるため、このDLLが見つからないとこういうエラーになります。Irrlicht.dllはC:\Irrlicht-0.6\bin\VisualStudioの下にあるはずですので、実行ディレクトリにコピーしておくか、実行ディレクトリをC:\Irrlicht-0.6\bin\VisualStudioにするかしておきましょう

めでたしめでたし

気を取り直してdllを用意して実行してみましょう。

薄青で塗りつぶされたタイトルなしのウィンドウが表示されれば成功です。
ここで作ったmain.cppは第二回以降でもプログラムの土台として使うことになると思いますので、取っておくといいと思います。

トップへ 第二回へ