C# カーブエディタ作成 ~線の表示

初めに

ゲームエンジンを使用しないc++で開発しているとゲームエンジンのこの機能が使えればなーということがよくあります。

しかしゲーム開発支援ツールをC#で作ってるという話を聞くのですが、エディタ拡張とかの解説記事はあっても、0から実際にゲーム開発支援ツールを作ってみた等の記事を全く見かけませんし、自分の会社では開発支援ツールは制作はしておらず、どこから手をつけたらいいか全く情報がありません。

そこでUnityのAnimationCurveに近いものをc++でも使用できるツールをこれから制作し、その過程を上げていこうと思います。 それにより、ゲーム開発者が開発支援ツールを制作する際のなにかの助けなれればと思います。

あとは単純に自分のc++での開発業務でもカーブエディタが欲しいっす。

環境

Microsoft Visual Studio 2015

Windowフォームアプリケーションでプロジェクトを作成しています。

線の描画

カーブエディタを作るにはまず曲線を表示できなければ話になりません。

・Graphics Class

docs.microsoft.com

線や形状の描画、テキストのレンダリング、イメージの表示と操作を行うことできるクラスこれを使用して線を描画する。

・Graphics Class取得 Graphics Classは生成出来ないので、どこからか取得する必要があります。

Paintメソッドの引数から取得 例1

//フォームクラスの描画処理をオーバーライドするやり方
  public partial class Form1 : Form
    {
      protected override void OnPaint(PaintEventArgs e)
       {
          Graphics g = e.Graphics;
       }
    }

Paintメソッドの引数から取得 例2

//PictureBox等のペイントイベントで使うメソッドを用意
  private void TestPaint(PaintEventArgs e)
   {
      Graphics g = e.Graphics;
   }

例2の補足 ペイントイベントとは下記の赤枠で囲ってあるPint内で自分の作成したメソッドを使うことができる

f:id:Brave345:20191205142600p:plain

・直線の描画

//フォームクラスの描画処理をオーバーライドするやり方
  public partial class Form1 : Form
    {
  Point[] Points;
      Point point1 = new Point(50, 300);
        Point point2 = new Point(150, 150);
        Point point3 = new Point(300, 400);
      Pen pen = new Pen(Color.Black, 1);//線の色
//初期化
   public Form1()
        {
            InitializeComponent();
            Text = "DrawBezier";
            Points = new Point[] { point1, point2 , point3};

            InitPointLocationLabel();
//ちらつきをおさえる
            SetStyle(
    ControlStyles.DoubleBuffer |
    ControlStyles.UserPaint |
    ControlStyles.AllPaintingInWmPaint, true);

        }
 //描画
      protected override void OnPaint(PaintEventArgs e)
       {
             Graphics g = e.Graphics;
            //点の描画
            for (int i = 0; i < Points.Length; i++)
            {
                e.Graphics.FillRectangle(brush, Points[i].X - cpSize / 2, Points[i].Y - cpSize / 2, cpSize, cpSize);
            }
            //線の描画
            g.DrawLines(pen, Points);
       }
    

実行結果

f:id:Brave345:20191205142743p:plain

・曲線の描画

 //描画
      protected override void OnPaint(PaintEventArgs e)
       {
             Graphics g = e.Graphics;
            //点の描画
            for (int i = 0; i < Points.Length; i++)
            {
                e.Graphics.FillRectangle(brush, Points[i].X - cpSize / 2, Points[i].Y - cpSize / 2, cpSize, cpSize);
            }
            //曲線の描画
              g.DrawCurve(pen, Points);
       }
    }

実行結果

f:id:Brave345:20191205142932p:plain

AnimationCurveで使われてそうな線の表示ができました。

終わりに

取り敢えずカーブエディタを作る上で必ず必要な線の描画は標準の機能でできることがかわりました。これでなんとか制作は進められそう。 次はカーブエディタの仕様を固めていきたいと思います。

次の記事

bravememo.hatenablog.com