アマゾンバナーリンク

C#でDXライブラリを使ってみよう!

2020年1月27日

今までコンソールやWindowsアプリケーションを使っていましたが、今回からDXライブラリを使います。 DXライブラリを使えば、Windowsアプリケーションのみでは到底できないような、高度なグラフィックス描画や強力な3Dの機能を使うことができます。

まずはプロジェクト作成

  1. 新しいプロジェクトの作成
  2. windowsアプリケーション(.NET Framework)
  3. プロジェクト名をDxLibGameとつけて作成

ここまでは今まで通りです。

DXライブラリをダウンロードする

  1. DebugモードとReleseモード両方1回ずつ「デバッグなしで実行」する。(DebugフォルダとReleseフォルダを作るため)
  2. C#用のDXライブラリをダウンロードします

もし上の画面のように表示されてない部分があったら、表示→ソリューションエクスプローラー、ツールボックス、プロパティウィンドウをすべて表示させてください。

DXライブラリの設定

  1. ダウンロードしたDxLibDotNetを解凍する
  2. UnicodeVerフォルダの中にあるDxLib.dllWとDxLib_x64W.dllの2つファイルをsource/repos/DxLibGame/bin/Debugとsource/repos/DxLibGame/bin/Releseのそれぞれにコピーする。
  3. source/repos/DxLibGameにDxDllW.csをコピーする。
  4. ソリューションエクスプローラーのDxLibGameを右クリックし、追加→既存の項目で先ほどコピーしたDxDllW.csを追加します

上までできたら、Program.csを以下のように書き換えます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DxLibDLL;

namespace DxLibGame
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // ウインドウモードで起動
            DX.ChangeWindowMode(DX.TRUE);

            // DXライブラリの初期化
            if (DX.DxLib_Init() < 0)
            {
                return;
            }

            // 描画先を裏画面に変更
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);

            // 画像を左右に動かす処理のための変数を初期化
            int x = 0, xadd = 8;

            // メインループ
            while (DX.ProcessMessage() != -1)
            {
                // 画面をクリア
                DX.ClearDrawScreen();

                // 画像を描画する座標を更新
                x += xadd;
                if (x < 0 || x > 640-32)
                {
                    xadd = -xadd;
                }

                // 四角を描画
                DX.DrawBox(x, 32*5,  x+32, 32*6,DX.GetColor(255,255,255), 1);
                // 裏画面の内容を表画面に反映する
                DX.ScreenFlip();
            }

            // DXライブラリの後始末
            DX.DxLib_End();
        }
    }
}

実行結果

https://gyazo.com/edc77d4ccf62c80ee221e446fb2dfbdd

白い四角が左右に動いていればOKです。

.NetFrameworkとDXライブラリを組み合わせて使う方法

本来はここまでで十分なんですが、DXライブラリで描画しつつも、NetFrameworkの手軽に使えるボタンやテキストボックスなどのツールボックスを、同時に使えるようにする方法も説明します。
やり方は簡単でForm1.csとProgram.csを書き直すだけです。

  1. Form1.cs[デザイン]を開きwindowsフォームをクリック
  2. Load関数とFormClosed関数をダブルクリックして、 Form1.csにForm1_LoadとForm1_FormClosedを追加する。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DxLibDLL;

namespace DxLibGame
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // ウィンドウが生成された時に1度だけ呼ばれる
        private void Form1_Load(object sender, EventArgs e)
        {
            this.ClientSize = new Size(640, 480);
            DX.SetUserWindow(this.Handle); //DxLibの親ウインドウをこのフォームウインドウにセット
            DX.DxLib_Init();
            // 描画先を裏画面に変更
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);
        }

        // 画像を左右に動かす処理のための変数を初期化
        int X = 0, XAdd = 8;
        //ループする関数
        public void MainLoop()
        {
            // 画面をクリア
            DX.ClearDrawScreen();
            // 画像を描画する座標を更新
            X += XAdd;
            if (X < 0 || X > 640 - 32)
            {
                XAdd = -XAdd;
            }

            // 四角を描画
            DX.DrawBox(X, 32 * 5, X + 32, 32 * 6, DX.GetColor(255, 255, 255), 1);
            // 裏画面の内容を表画面に反映する
            DX.ScreenFlip();
        }
     // ウィンドウが閉じた時に1度だけ呼ばれる
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();
        }
    }
}

次にprogram.csを以下の様に変更

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DxLibDLL;

namespace DxLibGame
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            form.Show();
            while (DX.ProcessMessage() != -1 && form.Created) //Application.Runしないで自分でループを作る
            {
                form.MainLoop();
                Application.DoEvents();
            }
        }
    }
}

実行結果は前のコードと変わりませんが、こちらのコードだとツールボックスのボタンやラベルなどの部品が使えるようになってます。
Form1_Loadに最初に一度だけする処理
Form1_FormClosedにウィンドウが閉じられた時最後に一度だけする処理
MainLoopに毎ループ行う処理を記述すればよいので構造もわかりやすいです。

次回以降はこのプログラムを元に色々なゲームを制作していくので楽しみにしてください。