GUIフォームのリセットについて
chin  2017/01/19(Thu) 07:22
GUIを表示するのみのシーンを作成する際、
シーンクラスを用いようと考えております。

class Scene1 : public MyApp::Scene
{
public:

  void init() override
{

}

void update() override
{
// 更新処理
}

void draw() const override
{
// 描画処理
}
};

init()でGUIを生成すると、シーンの遷移後、再度GUIを生成してしまうので、
GUIが二倍に増えてしまいます。
また、シーンの遷移でGUI内のコントロールを動的に変更したいと考えております。
このような際、init()でGUIのコントロールを一回全消去したいのですが、
リファレンスを見るからに、Relese()ぐらいしかめぼしいものが見つかりませんでした。
このような際、シーンのGUIをどのように扱ったらよいのでしょうか。
お手数おかけしますが、ご回答のほどよろしくお願いいたします。
記事編集
Reputeless  2017/01/19(Thu) 20:22
GUIが二倍に増えてしまうという状況がつかめないので、
アドバイスのために簡単な再現コードを示していただけますか。
編集
chin  2017/01/19(Thu) 22:20
情報不足で大変申し訳ありません。

オプションのシーンクラスは下記のとおりです。

class SceneOption : public MyApp::Scene {
private:
const String BASE_WIDTH_CONTROL = L"BaseWidth";
const String BASE_HEIGHT_CONTROL = L"BaseHeight";
const String BUTTON_OK = L"ButtonOK";
const String BUTTON_CANCEL = L"Cancel";
const String COLOR_PALLET = L"ColorPallet";
GUI gui;

void SetColorPallet(String ctrName, bool isSelect, String name, int r, int g, int b, bool isln) {
unsigned int isCheck = 0u;
if (!isSelect) {
isCheck = 1u;
}
if (isln == true) {
gui.addln(ctrName, GUICheckBox::Create({ name + L"(" + ToString(r) + L"," + ToString(g) + L"," + ToString(b) + L")" }, { isCheck }, true));
}
else {
gui.add(ctrName, GUICheckBox::Create({ name + L"(" + ToString(r) + L"," + ToString(g) + L"," + ToString(b) + L")" }, { isCheck }, true));
}
}

void CheckData() {
// カラーパレットのチェックボックスを押した時の動作
auto item = optionData.GetColorItem();
for (int i = 0; i < (int)item.size(); ++i) {
if (gui.checkBox(ToString(i)).hasChanged) {
optionData.GetColorItem()[i].isSelect = !item[i].isSelect;
}
}

// OKボタンを押したときの動作
if (gui.button(BUTTON_OK).pushed) {
optionData.WriteForCsv(COLOR_TABLE_FILENAME);
}
if (gui.button(BUTTON_OK).pushed || gui.button(BUTTON_CANCEL).pushed) {
changeScene(SceneName::TITLE);
}
}
public:
~SceneOption() {
Cursor::SetStyle(CursorStyle::Default);
}
void init() override {
// オプションデータの読み込み
optionData.ReadFromCsv(COLOR_TABLE_FILENAME);
gui = GUI(GUIStyle::Default);
gui.setTitle(L"オプション");
// ベースのサイズ
gui.add(GUIText::Create(L"ベース幅"));
gui.add(BASE_WIDTH_CONTROL, GUITextField::Create(none));
gui.textField(BASE_WIDTH_CONTROL).setText(ToString(optionData.GetBaseWidth()));
gui.add(GUIText::Create(L"ベース高さ"));
gui.addln(BASE_HEIGHT_CONTROL, GUITextField::Create(none));
gui.textField(BASE_HEIGHT_CONTROL).setText(ToString(optionData.GetBaseHeight()));
// カラーパレットの登録
auto data = optionData.GetColorItem();
for (int i = 0; i < (int)data.size(); ++i) {
SetColorPallet(ToString(i), data[i].isSelect, data[i].name, data[i].r, data[i].g, data[i].b, (i % 2 == 0 ? false : true));
}
// ボタンの登録
gui.add(BUTTON_OK, GUIButton::Create(L"OK"));
gui.add(BUTTON_CANCEL, GUIButton::Create(L"キャンセル"));
gui.setCenter(Window::Center());

// ベースの取得
std::vector<String> colorName;
for (int i = 0; i < (int)optionData.GetColorItem().size(); ++i) {
colorName.push_back(optionData.GetColorItem()[i].name);
}

}

void update() override {
CheckData();
}

void draw() const override {
}
};
TitleからこのオプションシーンへchangeScene()
から遷移してきます。
シーンの遷移した時の動作を画像で添付いたします。

お手数をおかけしますが、ご教授の程、よろしくお願い致します。



編集
Reputeless  2017/01/20(Fri) 17:10
ビルドエラーになり検証できません。
他人の環境でも再現できる最小限のコードをご提供ください。
編集
chin  2017/01/22(Sun) 16:48
大変失礼いたしました。
無事解決いたしました。
GUIの問題ではなく、私側の問題でした。
大変失礼いたしました。
編集
Reputeless  2017/01/22(Sun) 20:05
ご報告ありがとうございます。
承知いたしました。
編集
件名
Re: GUIフォームのリセットについて
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -