WPFでタイムライン画面作成に挑戦

こんにちは。プログラマの境田です。

ゲームプログラマは開発を円滑にする目的で、独自のツールを作成することがあります。
私自身ツール製作の経験があまりないので、今回はツール製作の勉強目的も兼ねて、WPFを用いたタイムライン画面の作成に挑戦してみようと思います。

完全なタイムラインではなく、ここから拡張出来たら良いなという程度ですが、参考になれば幸いです。

画面イメージ

こちらが今回作成したタイムラインの画面イメージです。

機能として、

・トラックの追加、削除

・クリップの追加、削除

・画面スクロール

を、実装しています。

クリップの移動、フレームサイズの変更などは、ドラッグ操作で変える良い方法が見つからず、プロパティ画面を別途作成し、数値を入力する方法しか思いつかないため、今回はオミットしました。

画面分割・スクロール

タイムライン画面はGridを用いて4分割し、各Grid内にCanvasを指定しています。

説明の都合ですが、以下画面右上のGrid内を「目盛画面」、画面左下のGrid内を「トラック画面」、画面右下のGrid内を「クリップ画面」と呼ばせていただきます。

分割した理由は画面スクロール時に、「縦スクロール時はトラック画面とクリップが面のみスクロールする」「横スクロール時は目盛画面とクリップ画面のみスクロールする」ようにしたかったためです。

スクロールの連動は、まず目盛画面とトラック画面に非表示状態のScrollViewを用意します。次にクリップ画面のScrollViewにScrollChangedイベントを仕込み、スクロール値が変わるごとに目盛画面とトラック画面のスクロール値を同じ値にすることでスクロールを連動させるようにさせています。

この場合、ホイール操作でトラック画面をスクロールさせることができるため、トラック画面にもScrollChangedイベントを仕込み、クリップ画面を連動させる必要があります。

また、クリップ画面を一番下までスクロールさせますと、スクロールバー分のスクロール値のズレが発生するようで、うまく連動しなくなるので、スクロールバー分の移動値を考慮する必要がありそうです。

目盛の作成

目盛はLineを用いて1つ1つ作成し、数字はLabelを用いてこちらも1つ1つ作成しています。

大量のLine、Labelを使用しますが、画像に比べてフレーム数の変更などに柔軟に対応できると思い、動的に作成しています。

クリップ画面にある白い補助線もLineで作成し、クリップ画面のMouseDownイベントからクリック位置を割り出し、補助線を移動させています。

トラックの追加・削除

今回トラックの追加は「トラック画面を右クリック」、トラックの削除は「削除したいトラックを選択して右クリック」することで行うようにしました。

追加はトラック画面のContextMenuに項目を追加しました。

トラックはButtonで作成しました。また、クリップ画面にクリップが配置できる場所を視覚化するため、Rectangleでクリップ配置用のレールを作成しました。
削除はトラックのButtonのContextMenuに項目を追加して行うようにしました。

削除後に残ったトラックの位置を更新する処理を挟むことで、歯抜けしないようにしています。

クリップの追加・削除

クリップの追加は「配置したい場所を右クリック」、削除は「削除したいクリップを選択して右クリック」することで行えるようにしました。

先ほど作成しましたクリップ配置用のレールのContextMenuを追加しました。

クリップの初期位置はクリックした位置を保存しておき、その位置にクリップを生成するようにしています。

削除はトラック同様クリップにContextMenuを追加し行っています。

おわりに

今回勉強不足な部分もあり、各種編集機能やアニメーションなど、肝心な部分を作成することができませんでした。

ですが、あまりツール製作経験がない状態でもここまで作れたことにWPFの機能の良さを感じました。

ツール製作は作るだけでも大変なうえ、作った後も使用者の要望にこたえ続ける必要があり、製作後も大変ですが、そのツールによってゲーム製作が円滑になれば、プロジェクトとしても良いことですし、何より自分が作ったツールを誰かが使ってくれるのは、やっぱり嬉しいです。

本記事を読んでいただき、ありがとうございます。