C++にもだいぶ慣れてきました。ソースコードを機能毎に分けられるようにしてみました。
地味に後から効いてくるやつ
JUCEプログラム、前回から、親コンポーネントと子コンポーネントに分けて階層構造にすることで、GUIを部分毎に実装できたり、コンポーネントとして分離されるので、ユーザーへのレスポンスもよくなる、というようなことを勉強しました。一方で、クラスを全部一つのファイルに書き連ねる、というような部分がとても気持ち悪かったので、前回のシンプルな「MainComponent」クラスと「SceneComponent」クラスのプログラムを、それぞれのソースファイルに分離してみようと思いました。
今回の内容は、JUCEチュートリアルといよりも、C++よりな点がありますので、ご了承ください。
こんな人の役に立つかも
・JUCEプログラムをしている人
・JUCEプログラムを機能毎に分けたい人
・JUCEのプログラムを構造化したい人
ソースファイルの構成
今回は、MainComponentの子として、「SceneComponent」クラスしかありませんので、SceneComponentクラスをMainComponentクラスとは分離したプログラムとしてみました。
VisualStudioではこのようなファイルになります。
MainComponentクラスからSceneComponentクラスを使うので、MainComponentクラスのヘッダーファイルにSceneComponentクラス(SceneComponent.h)をincludeすればよいです。
実際にやってみます
Projucer側でファイルを追加
JUCEアプリのポイントとして、Projucerでファイルを追加するという点です。VisualStudio側でファイル追加しても紐づけされませんでした^^;
Projucer側でSourceの項目を右クリック、「Add New CPP & Header File…」を押すと、ファイル保存画面が表示されますので、「SceneComponent」と入力して作成すると、「.h」「.cpp」が一括で作成されてSource一覧に登録されます。
この時点で、Projucerプロジェクトを上書き保存しておきます。
そして、VisualStudioボタンでプロジェクトを開きます。
プログラミング
SceneComponent.h
以前、MainComponent.hに記載していたSceneComonentクラスを以下のようにSceneComponent.hに移します。その時、JuceHeader.hが必要になります。
#pragma once
#include <JuceHeader.h>
class SceneComponent : public juce::Component
{
public:
SceneComponent();
void paint(juce::Graphics& g) override;
void resized() override;
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SceneComponent)
};
SceneComponent.cpp
以前、MainComponent.cppに記載していたSceneComponentクラスのプログラムを以下のようにSceneComponent.cppに移動します。includeとして先ほ作成したヘッダーファイル「SceneComponent.h」を指定します。
#include "SceneComponent.h"
SceneComponent::SceneComponent()
//コンストラクタ
{
}
void SceneComponent::paint(juce::Graphics& g)
{
g.fillAll(juce::Colours::lightblue);
//ライトブルーに塗りつぶしています。
}
void SceneComponent::resized()
{
}
MainComponentクラス
MainComponent.hと、MainComponent.cppは、↑に記載したSceneComponentクラスの記載がなくなったプログラムになります。
唯一の追記として、MainComponet.hには、「SceneComponent.h」をincludeして、SceneComponentクラスが使えるようにしておきます。
#pragma once
#include <JuceHeader.h>
#include "SceneComponent.h"
//←追記しました。
class MainComponent : public juce::AudioAppComponent
まとめ
今回は、シンプルにMainComponetクラスと、SceneComponentクラスという二つのクラスをそれぞれのファイルに分割しましたが、クラス毎でファイルを分割しなければいけないということもなく、実際には機能毎にファイルを分割することで、開発の分担など、いろいろな効果が期待できます。
チュートリアルレベルの小さなプログラムよりは、開発時の少し複雑なプログラムで効果が期待できそうです。