2016年12月
2016年12月10日
※この記事は、Kawaz Advent Calendar 2016の12/7ぶんです。Kawazのサイト内で公開されている記事と同じものです。
担当の日を勘違いして2日遅刻した。
- 前々日:渡坂系統さん「感動したい」
- 翌日:るしゃなさん「同人ゲーム頒布にジュエルケースは色々高いわ、DVDトールケースはでかくて邪魔だわ」
概要
今年に入って、sapporo.cppの企画においてopenFrameworksという、ゲーム向きなマルチプラットフォームフレームワークを使い始めたのですが、そんなこともあって最近は個人的な制作物にも使い始めるようになった。
ということで、openFrameworksを使っての感想とか気づいたことを紹介するとともに、最近作ったもの「スクロールバー」を紹介する。
経緯をもう少し詳しく
昨年のKawaz Advent CalendarにてオセロAIを作ったという話を書いたのだが、こういったものをGUIで動くようにすればもっと目を引くのでは?ということで作ったのであった。
こちらで、作成した「4目並べ」を公開しています(sapporo.cppとしての制作物です)。sapporocpp/4moku: 4目並べ
使ってみての感想
- 基本的には、よくありそうなゲーム向けフレームワークという雰囲気。
- 割と便利だと思ったもの
- 最小限のフォントが組み込まれている。デバッグ表示したいときとかに便利。
- 画面表示に限らず、ファイル読み込みとかスレッドといったものに対しても、プラットフォームに依存せずコードを書くためのラッパーが提供されている。ファイルを開くとかのダイアログも提供されていたのだが、非ASCII文字が正常に扱えない(もしかしたらWindowsの場合のみ?)という問題があって利用を断念した。
- WindowsとAndroidのマルチプラットフォームを対応したかったのですが、そもそもAndroid向けサンプルプログラムのビルドを通すことすらできず断念しました…。なお開発環境としてWindowsのほかUbuntuで試してもだめでした。
- 結局現在は、Windows向けアプリ制作のために使っています。Visual Studioから使うのがすごく楽なので。(公式サイト内に掲載の手順に従えば簡単に動く)
- この手のフレームワークではよくあることではありますが、グローバルな状態管理(例:描画色を指定する関数
ofSetColorはグローバルに機能する)が多い。- 最近罠にはまったのは、
ofSetColorが読み込んだ画像の描画にも適用されるということ(例えば、ofSetColorで赤を指定したら、読み込んだ画像を描画する際に赤みがかかる。元の色で表示したければofSetColor(255)を事前に呼んでおかないとならない)。
- 最近罠にはまったのは、
作ったもの:スクロールバー
openFrameworksにスクロールバーが欲しくなって作った、というもの。
まあWindows APIを呼んで生成してもよかったのだが、他に何かに使えるかもということで自分で作ってみた。作って公開している人が他に見当たらなさそうだったし(いるのかもしれないけど)。
ソースコード/サンプルプログラムはこちら。GitHub - maraigue/ScrollBar4OF
なぜこれを作ったのか
もともとは某音楽ゲームの譜面シミュレータを作りたかったのだが、その過程でスクロールバーがないと操作しにくい、ということで作成することにした。
じゃあ何で某音楽ゲームの譜面シミュレータを作りたかったかというと、「音楽ゲームの難易度表示が妥当か機械学習的に判断したい」という構想があって、それをするためには譜面が入力できないとどうしようもない、という事情があったのである。また、(自分が作ろうとしている件の音楽ゲームについて)そういうツールを作っている人もいなさそうなのでじゃあ作ろうかな、という気持ちもあった。
これはこれで、出来上がったらどこかで記事にします。
実装のポイント
- 座標計算は工夫した。スクロールバーは縦と横の両方を出せるようにしたかったのだが、その両者でなるべくソースコードを共通化したかったのである。そのため、
- 縦横のスクロールバーで共通のコードについては、座標計算に縦横という概念を用いず、「スクロールバーの長さ方向の座標」「スクロールバーの幅方向の座標」というものを導入した。
- 上記の座標と、普通の(画面表示における)縦横の座標を変換するクラスを作り、それをテンプレートの引数に与えることで、縦スクロールバー・横スクロールバーを出せるようにした。
- 境界条件(取りうる値の最大値/最小値を超過しないか、など)は結構気を使った。
- スクロールバー内部の状態管理を行う変数が増えてしまうのは、仕方ないとはいえ面倒だった。例えば「現在ツマミをドラッグしている途中である」とか「マウスをクリックしてから押しっぱなしにしている」とか。
(割と)汎用的に作ったつもりなので、openFrameworksで必要な方はもちろん、他のプラットフォームに対する移植もしやすいほうじゃないか…と思っています。
