1

CCPanZoomControllerを使用して、「マップ」(1 つの画像) をズーム可能およびパン可能にしています。このマップでは、クリックするとスプライトの画像が変更される、クリック可能/タッチ可能なスプライトが必要です。

問題は、ユーザーが画面をピンチ (ズームアウト/ズームイン) すると、スプライトに触れる可能性があることです。これにより、スプライトの画像が変更されます。これは望ましくありません。

これを解決するアイデアはありましたが、Cocos2d を初めて使用するため、実装方法がわかりません。ユーザーが画面/スプライトに触れて、タッチを動かさないことを検出できると考えました (ピンチまたはパンのように) ユーザーが最初に画面に触れたとき (その最初のタッチを座標に変換) と、ユーザーが画面に触れなくなったとき (それを座標に変換) を検出し、両方を比較します。それらが変化しない(またはほとんど変化しない)場合、スプライトの画像を変更しますか?

どうすればこれを行うことができますか?助けてくれる人に感謝します!!

4

2 に答える 2

1

だから私は自分のゲームでCCPanZoomControllerを使っていて、あなたと同様の問題に遭遇しましたが、スプライトに触れたときなど、さまざまな側面で背景を動かしたくありませんでした。背景がズームしているときにスプライトが動かないようにしました。だから私がしたことは、反応したくないレイヤーのタッチを「オフ」にして、他のレイヤーでのアクションが完了したらそれらを再度有効にするメソッドを作成することでした。

各レイヤー内に次のメソッドを作成して、さまざまなタッチイベントから呼び出すタッチを無効または有効にしました。

// Public Method: Allows for disabling touch for this layer and re-enabling it
-(void)enableTouches:(BOOL)enable
{
    // Check if the bool value is to enable or disable touches
    if (enable) {
        // Call for the removal of all touch locations in array in the CCLayerPanZoom instance
        [_panZoomLayer removeTouchesFromArray];

        // Call the touch dispatcher and add the CCLayerPanZoom back as a delegate for touches
        [[CCTouchDispatcher sharedDispatcher] addStandardDelegate:_panZoomLayer priority:0];

        CCLOG(@"PanZoomWrapperLayer:enableTouches - LayerPanZoom touches enabled");

    } else {

        // Call the touch dispatcher to remove the CCLayerPanZoom as a delegate to disable touches
      [[CCTouchDispatcher sharedDispatcher] removeDelegate:_panZoomLayer];

      CCLOG(@"PanZoomWrapperLayer:enableTouches - LayerPanZoom touches disabled");
    }
}
于 2012-08-23T20:02:02.950 に答える
0

この問題の簡単な解決策を見つけました。しかし、それはあなたのニーズに合わないかもしれません!

  1. CCMenu クラスをサブクラス化し、-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event次のようにオーバーライドしました。

    -(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { [_selectedItem unselected]; _selectedItem = なし; }

  2. touchSwallowその新しいメニューのインスタンスのプロパティを に設定しましたNO

于 2013-08-22T13:29:49.213 に答える