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

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

ただいまの
回答率

90.52%

  • COCOS2D-X

    198questions

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

cocos2dx(v3.14.1)で、親nodeに複数の子Spriteを持った状態で、親nodeをドラッグ&ドロップで移動しても、getBoundBoxの座標だけ更新されない。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,172

chibikurosan

score 43

環境
cocos2d-x version3.14.1 (3.8でも試しました
xcode8.2
iphone7

 事象

親Node
∟ 子Sprite1
∟ 子Sprite2
∟ 子Sprite3

こんな感じの親子関係で、子Spriteにlistnerでタッチイベントをもたせ、TouchBegan,TouchMoved,TouchEndedでドラッグ&ドロップできるようにしており、
ドラッグ中に親Node->setPosition(touch->getLocation)で移動しています。

ですが、setPosition()で移動しても、Spriteの描画はちゃんと移動するのですが、
getBoundingBox()の座標が移動しません。
こちらsetPositionで移動する際に子SpriteのgetBoundingBoxの座標も変更されるようにしたいです。
また、BoundingBoxを変更するために、getBoundingBox().setRect(x,y,w,h)を指定しても、
変更されませんでした。

 解決したい点としては、

子SpriteのgetBoundingBoxの座標を親NodeのsetPositionで一緒に移動できるように
もしくは、getBoundingBox().setRect()でちゃんと判定領域の指定が反映されるように
できればと思っております。

  • ちなみに、普通に親子関係をつくらずSprite単体だと、setPositionでいどうすると、getBoundingBox()の座標も移動されました。
  • また、移動後にlistnerでイベント登録をし直しましたが解決しませんでした。
  • cocos2dxのversion3.8 version3.14.1で試しました。
  • 親Sprite子Spriteでも試しました。
  • 絶対や相対座標でも何度か試行錯誤したが変わりませんでした。
// タッチ開始
bool GamePlayFits::onTouchBegan2(cocos2d::Touch *touch, cocos2d::Event *event) {



    auto target = (Sprite*)event->getCurrentTarget();   //target : ターゲットのスプライト
    Rect targetBox = target->getBoundingBox();          //targetBox : タッチされたスプライトの領域

    Point touchPoint = touch->getLocation();


    // そもそもBoundingBoxを使わず座標計算で当たり判定した方がいい?
    if (isDrag == false && targetBox.containsPoint(touchPoint))    //touchPointがtargetBoxの中に含まれているか判定
    {
        isDrag = true;

        log("hogeタップ!!  %s : %s(%d)  -------> %s", "ActorSprite", "onTouchBegan", __LINE__,target->getName().c_str());

        ValueVector nameParse = this->split(target->getName(), "_");
        log("nameParse: %s",nameParse.at(2).asString().c_str());

        string nodeNamePrefix = "Node_Block_"; // block
        nodeNamePrefix += std::to_string(nameParse.at(2).asInt()); 

        selectSpriteName = nodeNamePrefix;
        selectNodeAccess = (Sprite*)target->getParent();
        selectSpriteAccess = target;
//        selectSpriteBoundingBox = target->getBoundingBox();

        hitFlg = true;


    }

    return true; //falseだと、onTouchBeganでイベントが終了してonTouchEndedが呼ばれない
}



// ドラッグ中
void SceneGamePlayFits::onTouchMoved2(cocos2d::Touch *touch, cocos2d::Event *event) {


    if(hitFlg == true && isDrag == true){



        // タップしたスプライトと親nodeの座標を計算し、ドラッグ位置にスプライトがくるように
        Point touchPoint = Vec2(
                                touch->getLocation().x - selectSpriteAccess->getPositionX(),
                                touch->getLocation().y - selectSpriteAccess->getPositionY()
                                );

        selectNodeAccess->setPosition(touchPoint);




            // 親Nodeに紐づくSpriteの座標確認debug
            for(auto spriteBlock:selectNodeAccess->getChildren()){

                // なぜかBoundingBoxの座標だけ、setPositionで移動しても変更されない
                spriteBlock->getBoundingBox().setRect(
                  spriteBlock->getPositionX(),
                  spriteBlock->getPositionY(),
                  spriteBlock->getBoundingBox().getMaxX() - spriteBlock->getBoundingBox().getMinX(),
                  spriteBlock->getBoundingBox().getMaxY() - spriteBlock->getBoundingBox().getMinY()
                  );


            }

    }

    return;
}

 参考情報:

おそらく同じ事象、、cocos2dxの不具合なんでしょうか。。
http://www.cocoachina.com/bbs/read.php?tid-176727.html

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • COCOS2D-X

    198questions

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

  • トップ
  • COCOS2D-Xに関する質問
  • cocos2dx(v3.14.1)で、親nodeに複数の子Spriteを持った状態で、親nodeをドラッグ&ドロップで移動しても、getBoundBoxの座標だけ更新されない。