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 层一个固定的位置,然后不要对其应用任何动作或任何其他类型的转换。它应该以这种方式保持静止。

Cocos2d 提供了自己的类来管理CCMenu, CCMenuItem, 并且CCLabel允许您轻松地构建您的 UI。但是,如果您愿意,您也可以尝试集成UIKit对象。看看CCUIViewWrapper,如果你真的需要它。

编辑:

关于拥有 UI 层的想法更详细如下:

  1. 你有一个根层作为所有层的容器;

  2. 其中一个层是“游戏层”,这几乎就是您现在所拥有的;

  3. 另一个是“ui层”;

  4. 触摸和任何类型的变换只应用于“游戏层”,它们在根层内移动,而不影响“ui层”。

在Steffen Itterheim的“ Learn Game Development with Cocos2D ”中有一个很好的教程。如果您想学习一些漂亮的 cocos2d 游戏方法,这本书非常棒。我正在谈论的教程在 Steffen 的网站上以代码形式提供。您可以从此页面下载并查看第 5 章“场景和图层”示例,特别是从 ScenesAndLayers04 开始,您将在其中找到“MultiLayerScene.h/m”类。

于 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 回答