2

に3つのレイヤーがありますCCScene。とMainLayerを含みます。これは今のように見えます:GameLayerHUDLayer

[ z-Order        ] | [ Layer ]
==============================
  3 ( Top Most )   | HUDLayer
  2 ( Middle )     | GameLayer
  1 ( Bottom )     | MainLayer 

そのレイヤーでタッチされたオブジェクトを返すのメソッドを呼び出すタッチリスナー(、、、および)を追加ccTouchBeganccTouchMovedましccTouchEndedた。MainLayerGameLayergetTouchedObject( CCPoint p_Loc )

これで、内の特定のオブジェクトに正常に「タッチ」できるようになりましたMainLayer。さて、私がやりたいのは、触れたオブジェクトをドラッグして、に入れることHUDLayerです。1つのレイヤーだけで作業していたときは、さまざまなオブジェクトを問題なくドラッグアンドドロップできましたが、を実装する必要が生じたCCLayerため、メインレイヤーを3つの異なるレイヤーに分割しました。

回答はcocos2d-xである必要はありません。私はObj-Cを少し理解しており、Obj-CをC ++に変換できるので、cocos2dの回答を歓迎します。前もって感謝します。

4

2 に答える 2

4

それを行う最も簡単な方法は、おそらく次のとおりです。

  1. CCLayerと呼ばれる一番上に新しいものを追加しHoverLayerます。これはモジュール性のためです。
  2. スプライトがいずれかのレイヤーに触れたらすぐに、そのレイヤーからスプライトを削除HoverLayerし、同じ位置の子として追加します。ユーザーは変更されたものを「見る」ことはありません。
  3. タッチアップ時に、スプライトをドラッグした後、スプライトが内にあるHUDLayerかどうかを検出します。
  4. からスプライトを削除HoverLayerし、適切なレイヤーに追加します。

ノート:

  • HUDLayerの代わりに使用できますHoverLayerが、クラスが乱雑になります。
  • もちろん、GameLayerドラッグ中にタッチしたスプライトを保持するとHUDLayer、ある時点でスプライトが背後に配置されるため、スプライトを最上層に移動する必要があります。
  • 与えられたソリューションを実装するためのコードは簡単です。本当に特別なことは何もありません。
于 2012-09-10T06:39:42.540 に答える
3

ここで実装を提供します:

CCSprite* tmpSprite = getTouchedObject();
tmpSprite->retain();
tmpSprite->removeFromParentAndCleanup(false);
//do something here to get a pointer to you HUDLayer
//for example myHud = GameLayer->getChildByTag(HUD_TAG);
myHud->addChild(tmpSprite);
tmpSprite->release();
于 2012-09-10T06:57:39.993 に答える