0

最近、プロジェクトに CCLayerPanZoom cocos2d 拡張機能を追加し、ゲーム シーンのズームとスクロールを思い通りにできるようにしました。プレイヤーが特定のアクションを実行するときに、アクションを実行している間、パン/ズームを一時的に無効にできるようにしたいのですが、その方法がわかりません。フォーラムで次のコードを見つけましたが、機能しないか、使用方法がわかりません。

別のコードまたは以下のコードを使用してこれを適切に行う方法を知っている人はいますか?

-(void)enableTouches:(BOOL)enable {

    if(enable) {
        [[CCTouchDispatcher sharedDispatcher] addStandardDelegate:self priority:0];
        _panZoomLayer.isTouchEnabled = YES;
        CCLOG(@"LayerPanZoom enabled.");
    } else {
        [[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
        _panZoomLayer.isTouchEnabled = NO;
        CCLOG(@"LayerPanZoom disabled.");
    }
}
4

1 に答える 1

3

私はついにそれを理解し、共有するためにここに回答を投稿することにしました。_panZoomLayer の代わりに自分自身を送り返していたため、投稿したコードは機能しませんでした。したがって、これを自分で機能させるための手順は次のとおりです。

  1. ドキュメントの説明に従って、CCLayerPanZoom をプロジェクトに実装します。
  2. 新しい CCLayerPanZoom クラスで呼び出すメソッドとして次のコードを追加します。

    -(void)enableTouches:(BOOL)enable {
       if(enable) {
          [[CCTouchDispatcher sharedDispatcher] addStandardDelegate:_panZoomLayer priority:0];
          CCLOG(@"LayerPanZoom enabled.");
       } else {
          [[CCTouchDispatcher sharedDispatcher] removeDelegate:_panZoomLayer];
          CCLOG(@"LayerPanZoom disabled.");
       }}
    

注: 削除するデリゲートとして親クラスのインスタンスを必ず配置してください。

  1. 再度有効にして適切に機能させるには、呼び出してデリゲートを再登録する前に、CCLayerPanZoom クラスの配列からすべてのエントリを削除する必要があります。次のように CCLayerPanZoom クラスに新しいメソッドを作成し、上記の addStandardDelegate メソッドの直前に呼び出します。

    -(void)removeTouchesFromArray { [self.touches removeAllObjects]; }

その後、それはすべてうまくいきます!この拡張機能の使い方を学ぶのに少し時間がかかりましたが、一度理解すれば完璧に機能します。1 本指のパン、2 本指のズーム/パン、シーン全体の中心位置の設定、エッジを超えるパンの制限、最小/最大スケールの設定ができます。人々がこれに多くの問題を抱えていることは知っていますが、これは素晴らしい拡張機能であり、理解するには少しいじるだけです。ご不明な点がございましたら、お知らせください。これが他の誰かに役立つことを願っています。

于 2012-08-09T20:45:05.077 に答える