質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2621閲覧

C++ cocos2dxのオブジェクト削除について

tsysrtk

総合スコア15

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/06 06:13

編集2017/07/06 06:17

最近プログラムを始めた初心者という前提でお願いいたします。
個人的にcocos2d-xを使ってC++でゲームを作っています。

オブジェクトの削除についてわからないことがあります。

void CharacterEditView::characterStatusInfo(int tag) {
auto winSize = Director::getInstance()->getVisibleSize();
std::string key = StringUtils::format("%d", tag);
std::map<int, std::string> column;
column[0] = "name";
column[1] = "sex";
column[2] = "job";
column[3] = "level";
column[4] = "job_level";
column[5] = "money";
column[6] = "place";
column[7] = "str";
column[8] = "agi";
column[9] = "vit";
column[10] = "int";
column[11] = "dex";
column[12] = "luk";
for (int i = 0; i < 7; i++) {
auto charaInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26);
charaInfo->setPosition(winSize.width / 2 - 280, winSize.height / 2 - 40 - (i * 50));
charaInfo->setColor(Color3B::BLACK);
charaInfo->setTag(PARAM_CHARACTER_EDIT_STATUS_INFO_TAG);
this->addChild(charaInfo);
}
for (int i = 7; i < 13; i++) {
auto statusInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26);
statusInfo->setPosition(winSize.width / 2 - 30, winSize.height / 2 - 40 - ((i - 7) * 50));
statusInfo->setColor(Color3B::BLACK);
statusInfo->setTag(PARAM_CHARACTER_EDIT_STATUS_INFO_TAG);
this->addChild(statusInfo);
}
}

ボタンを押した際に、押されたボタンの情報をこのファンクションが受け取り、
それによってキャラクターの情報を切り替えようとしています。

同じファンクションを使用して表示を切り替えようとしているので、
表示される直前に、

this->removeChildByTag(PARAM_CHARACTER_EDIT_STATUS_INFO_TAG);

をやりたいのですが。
うまくいきません。

そもそも「setTag」は違うオブジェクトに同じタグをいくつもつけれるんでしょうか?

どなたかご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

やりたい事を整理したいのですが、
tagというか任意のキャラクターを識別する情報を受け取ったら、その情報をラベルで表示したいという事ですよね。
しかし、2回目以降の表示では前回のラベルが残っているので、削除してから新しくラベルを配置したいという事ですよね。

もし、自分がやるならこうします。

cpp

1void CharacterEditView::characterStatusInfo(int tag) { 2 auto winSize = Director::getInstance()->getVisibleSize(); 3 std::string key = StringUtils::format("%d", tag); 4 5 const std::string nodeName = "charaInfoNode"; 6 auto node = getChildByName<Node*>(nodeName); 7 // 前回の情報が残っている場合は消す 8 if(node != nullptr) { 9 node->removeFromParent(); 10 } 11 12 std::map<int, std::string> column; 13 column[0] = "name"; 14 column[1] = "sex"; 15 column[2] = "job"; 16 column[3] = "level"; 17 column[4] = "job_level"; 18 column[5] = "money"; 19 column[6] = "place"; 20 column[7] = "str"; 21 column[8] = "agi"; 22 column[9] = "vit"; 23 column[10] = "int"; 24 column[11] = "dex"; 25 column[12] = "luk"; 26 27 // Nodeはデフォルトでは大きさを持たないので、ただの点のようなものと考えて良い 28 // ラベルは直接シーンに貼り付けるのではなく、Nodeに貼り付ける 29 // こうすると、各ラベルがNodeに紐づくので、NodeをremoveFromParent()すれば 30 // 複数のラベルを一括で削除できる 31 node = Node::create(); 32 node->setName(nodeName); 33 node->setPosition(Vec2(0, 0)); 34 35 for (int i = 0; i < 7; i++) { 36 auto charaInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26); 37 charaInfo->setPosition(winSize.width / 2 - 280, winSize.height / 2 - 40 - (i * 50)); 38 charaInfo->setColor(Color3B::BLACK); 39 node->addChild(charaInfo); 40 } 41 for (int i = 7; i < 13; i++) { 42 auto statusInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26); 43 statusInfo->setPosition(winSize.width / 2 - 30, winSize.height / 2 - 40 - ((i - 7) * 50)); 44 statusInfo->setColor(Color3B::BLACK); 45 node->addChild(statusInfo); 46 } 47 48 addChild(node); 49}

投稿2017/07/06 06:35

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsysrtk

2017/07/06 08:22

いつもありがとうございます。 めちゃめちゃ参考になりました。 自分はいちいちタグをつけて消していたので、 一括削除したい場合にとても冗長になってしまっていました。 いつか添削をしてほしいくらいです(笑)
guest

0

自己解決

for (int i = 0; i < 13; i++) {
this->removeChildByTag(i);
}
for (int i = 0; i < 7; i++) {
auto charaInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26);
charaInfo->setPosition(winSize.width / 2 - 280, winSize.height / 2 - 40 - (i * 50));
charaInfo->setColor(Color3B::BLACK);
charaInfo->setTag(i);
this->addChild(charaInfo);
}
for (int i = 7; i < 13; i++) {
auto statusInfo = LabelTTF::create(GameManager::getInstance().characterInfo[key][column[i]], FONT_FILE_BASIC, 26);
statusInfo->setPosition(winSize.width / 2 - 30, winSize.height / 2 - 40 - ((i - 7) * 50));
statusInfo->setColor(Color3B::BLACK);
statusInfo->setTag(i);
this->addChild(statusInfo);
}

これでできました。

投稿2017/07/06 06:33

tsysrtk

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問