JUCEプログラミング、Parent and child components、親と子のコンポーネント3

引き続き子コンポーネントのチュートリアルです。

子コンポーネント使いこなすと設計がレベルアップしそうだね

JUCEプログラミング、「Parent and child components」の「Adding a sun」の項目から進めていきいます。

公式チュートリアルページはこちらのページです。

JUCE
tutorial_component_parents_children - JUCE Tutorial: Parent and child components This tutorial introduces the hierarchical nature of the Component class whereby one component can contain one or more nest...

前回までの記事はこちらです。

親と子のコンポーネント1

親と子のコンポーネント2

こんな人の役に立つかも

・JUCEプログラミングを勉強している人

・JUCEプログラミングのチュートリアルを進めている人

・Parent and child componentsチュートリアルを進めている人

目次

Adding a sun

太陽となる円の描画を行うクラスを追加して、SceneComponentにSunComponentを子コンポーネントとして追加します。今までの復習のような内容となっています。

前回のプログラムに次のように追加しました。

SceneComponent.h

//[1]追加したSunComponentクラスです。
class SunComponent : public juce::Component
{
public:
    SunComponent();

    void paint(juce::Graphics& g) override;

    void resized() override;

private:

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SunComponent)
};

//...略...
class SceneComponent : public juce::Component
{
//...略...
    FloorComponent floor;
    HouseComponent house;
    SunComponent sun;
//[2]追加します。

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SceneComponent)
};

[1]のように、SunComponentクラスを追加しました。また、[2]のように、SceneComponentの子コンポーネントとして追加するので、privateなメンバ変数としてsunを追加しました。

SceneComponent.cpp

SceneComponentクラスの関数では、コンストラクタとresized関数にsunに関する項目を追加しました。

//SceneCompnentクラス関連の関数です。
SceneComponent::SceneComponent()
{

    addAndMakeVisible(floor);
    addAndMakeVisible(house);
    addAndMakeVisible(sun);
//追加します。
}

//...略...
void SceneComponent::resized()
{
    floor.setBounds(10, 297, 580, 5);
    house.setBounds(300, 70, 200, 220);
    sun.setBounds(530, 10, 60, 60);
//追加します。
}

cppの一番最後に、次のように、SunComponentクラスの関数群を追加しました。

//...略...

//SunComponent
クラス関連の以下の関数を追加しました。
SunComponent::SunComponent() {}

void SunComponent::paint(juce::Graphics& g)
{
    g.setColour(juce::Colours::yellow);

    auto lineThickness = 3.0f;
    g.drawEllipse(lineThickness * 0.5f,
        lineThickness * 0.5f,
        (float)getWidth() - lineThickness * 2,
        (float)getHeight() - lineThickness * 2,
        lineThickness);
}

void SunComponent::resized() {}

今回は、paint関数のみの実装となっています。graphicsクラスの「drawEllipse」関数で円を描画しています。

ここまででこのような絵になりました。

Reusing components

子コンポーネントはクラスとして定義しましたので、使いまわすことができます。smallHouseというHouseComponentのもう一つのコンポーネントを定義して作成してみます。

SceneComponent.h

SceneComponentクラスにhouseComponentクラスの「smallHouse」をprivateなメンバとして加えます。

class SceneComponent : public juce::Component
{
//...略...

private:
    FloorComponent floor;
    HouseComponent house;
    SunComponent sun;

    HouseComponent smallHouse;//
追加しました。

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SceneComponent)
};

SceneComponent.cpp

SceneComponentクラスのコンストラクタと、resized関数にsmallHouseを設定する作業を行いました。

SceneComponent::SceneComponent()
{
//...略...

    addAndMakeVisible(smallHouse);
//[1]smallHouseを可視化します。
}

//...略...
void SceneComponent::resized()
{
//...略...
    smallHouse.setBounds(50, 50, 50, 50);
//[2]smallHouseを配置します。
}

次のように小さな家が画面に描画されました。

子コンポーネントとして機能を分割するといろいろと便利そうです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次