0

その位置に固執しているように見える「メニュー」を実装する方法は? ここで立ち往生とsceneは、動いているか、まだその位置にとどまっていることを意味します。その場にいるような感覚を与えてくれます。スクロールシーンで動かして実装していますが、動作はするのですが「たまに」おかしな挙動をします。

これが私がどのように作成するかのコードですmenu:

resetPosition =[CCMenuItemImage itemFromNormalImage:@"position.png"
                                      selectedImage:@"position_over.png" 
                                      disabledImage:@"disabled.png"
                                             target:self
                                           selector:@selector(reset)]; 
resetPosition.position =ccp(400, 300);
myresetMenu = [CCMenu menuWithItems:resetPosition, nil];
myresetMenu.position = ccp(0,0);
[[self parent] addChild:myresetMenu z:10];  
[resetPosition setIsEnabled:NO];

そして、シーンを移動するためのコード(ユーザーがシーンをスクロールしようとしたとき)。また、メニューをsceneで移動したので、メニューがまだ であるという効果が得られますscene

if([touchArray count]==1)//scroll
        {

            UITouch *myTouch = [touches anyObject];
            CGPoint location = [myTouch locationInView:[myTouch view]];
            moveLocation1 = [[CCDirector sharedDirector] convertToGL:location];
            float diffX = beginLocation1.x - moveLocation1.x;
            float diffY = beginLocation1.y - moveLocation1.y;   

            //NAVIGATION TOWARDS X AND Y WhenEver and how ever you want         
            if (abs(diffX) > abs(diffY))
            {
                CCLOG(@"yScrlFlag=%d",yScrlFlag);
                if(diffX > 0)
                {
                    xScrlFlag=1;
                    [self.parent runAction:[CCMoveTo actionWithDuration:round(-(-3112-self.parent.position.x)/650)
                                                               position:ccp((-3112-self.position.x),self.parent.position.y)]];
                    [resetPosition setIsEnabled:YES];
                    [resetPosition runAction:[CCMoveTo actionWithDuration:round(-(-3112-self.parent.position.x)/650) 
                                                                 position:ccp((3112+self.position.x+400),resetPosition.position.y)]];
                }
                else
                {
                    xScrlFlag=0;                        
                    [self.parent runAction:[CCMoveTo actionWithDuration:(-self.parent.position.x/650) 
                                                               position:ccp(0,self.parent.position.y)]];
                    //[resetPosition setIsEnabled:YES];
                    [resetPosition runAction:[CCMoveTo actionWithDuration:(-self.parent.position.x/650) 
                                                                 position:ccp(400,resetPosition.position.y)]];
                }
            }
            else
            {                       
                if(diffY < 0)
                {
                    yScrlFlag=1;
                    CCLOG(@"\n nodePosition.x=%f \n nodePosition.y=%f",nodePosition.x,nodePosition.y);
                    [self.parent runAction:[CCMoveTo actionWithDuration:(-(-300-self.parent.position.y)/650) 
                                                               position:ccp(self.parent.position.x,(-self.position.y))]];
                    //[self.parent runAction:[CCMoveBy actionWithDuration:(-(-300-self.parent.position.y)/650)
                    //                                         position:ccp(self.parent.position.x, -diffY)]];
                    [resetPosition setIsEnabled:YES];
                    //[resetPosition runAction:[CCMoveBy actionWithDuration:round(-(-300-self.parent.position.x)/650) 
                    //                                           position:ccp(resetPosition.position.x, (self.parent.position.y))]];
                }
                else
                {   
                    yScrlFlag=0;
                    [self.parent runAction:[CCMoveTo actionWithDuration:(-(-300-self.parent.position.y)/650) 
                                                               position:ccp(self.parent.position.x,0)]];
                    //[resetPosition runAction:[CCMoveTo actionWithDuration:round(-(-300-self.parent.position.x)/650) 
                    //                                           position:ccp(resetPosition.position.x,300)]];
                }   
            }
        }
4

3 に答える 3

2

メニューの作成方法とメニューで何をしているのかを指定しないので、私の答えはかなり一般的です...

これに対する正しいアプローチは、すべての UI 要素 (メニュー、ボタンなど) を配置する UI レイヤーを用意し、他のゲーム レイヤーとは異なる方法で処理することです。つまり、UI レイヤーに固定位置を指定し、それにアクションやその他の種類の変換を適用しないということです。このようにかなり静的なままにする必要があります。

CCMenuCocos2d は、 、CCMenuItem、およびを管理する独自のクラスを提供し、CCLabelUI を簡単に構築できるようにします。ただし、必要に応じて、オブジェクトを統合することもできUIKitます。CCUIViewWrapper本当に必要な場合は、 をご覧ください。

編集:

UI レイヤーを持つことについての考え方は、次のように詳細に説明されています。

  1. すべてのレイヤーのコンテナとして機能するルートレイヤーがあります。

  2. それらのレイヤーの 1 つは「ゲーム レイヤー」です。

  3. もう1つは「UIレイヤー」です。

  4. タッチおよびあらゆる種類の変換は、「ゲーム レイヤー」にのみ適用され、「UI レイヤー」に影響を与えずにルート レイヤー内で移動します。

これについては、 Steffen Itterheimによる「 Learn Game Development with Cocos2D 」に素晴らしいチュートリアルがあります。この本は、cocos2d ゲームへのいくつかの気の利いたアプローチを学びたい場合に最適です。私が話しているチュートリアルは、Steffen のサイトでコード形式で入手できます。このページからダウンロードして、「MultiLayerScene.h/m」クラスがある ScenesAndLayers04 から始めて、第 5 章「シーンとレイヤー」の例を調べることができます。

于 2011-06-14T07:51:32.437 に答える
1

しばらく前にこれに少し問題がありました。カメラが動いても失われない UI 要素を持たせようとしていました。私がやったのは、CCParallaxNode を子として追加し、視差比を ccp(0.0, 0.0) に設定することでした。そうすれば、シーンは動き回ることができますが、UI レイヤーはそのまま残ります。それが最善の方法かどうかはわかりませんが、私は汚いハックのようなプログラマーです :)

于 2011-06-16T08:53:47.113 に答える
0

@sergioは正しい考えを持っています。

あなたのコードで。それをレイヤーにすべて入れてから、タッチアクションで、すでにあるように移動し、アクションを実行してメニューを再び表示するときにその位置をリセットします。

于 2011-06-14T09:04:54.710 に答える