在运动场景上实现静态对象

问题描述

| 如何实现看起来像固定在其位置上的“菜单”?在这里,我的意思是说ѭ0正在移动或仍保持在它的位置。这给人的感觉就像是在它的位置上。我正在通过滚动场景来实现它,它可以工作,但有时会表现得很荒谬。 这是我如何创建
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)]];
                }   
            }
        }
    

解决方法

        不久前,我对此有些麻烦。我一直试图让UI元素在相机移动时不会丢失。我最终要做的是添加一个CCParallaxNode作为子级,并在我放置的所有内容上将视差比设置为ccp(0.0,0.0)。这样,场景可以四处移动,但我的UI层保持原位。我不确定这是否是最好的方法,但是我是一种肮脏的hack程序员:)     ,        您没有指定如何创建菜单以及如何使用它们,所以我的回答很笼统... 对我而言,正确的方法是拥有一个UI层,在其中放置所有UI内容(菜单,按钮等),并与其他游戏层区别对待。换句话说,您给UI层一个固定的位置,然后不对其执行任何操作或任何其他类型的转换。这样,它应该保持静态。 Cocos2d提供了自己的类来管理
CCMenu
CCMenuItem
CCLabel
,使您可以轻松构建UI。但是,如果您愿意,也可以尝试集成“ 9”个对象。如果确实需要,请看看
CCUIViewWrapper
。 编辑: 关于UI层的想法如下: 您有一个根层充当所有层的容器; 其中的一层是“游戏层”,几乎就是您现在拥有的; 另一个是“ ui层”; 触摸和任何类型的转换仅应用于“游戏层”,该游戏层在根层中移动而不会影响“ ui层”。 Steffen Itterheim的“使用Cocos2D学习游戏开发”中有一个很好的教程。如果您想学习几种cocos2d游戏的精妙方法,这本书将是很棒的。我正在谈论的教程可以在Steffen网站上以代码形式获得。您可以从此页面下载它,并查看第5章“场景和图层”示例,特别是从ScenesAndLayers04开始,您将在其中找到\'MultiLayerScene.h / m`类。     ,        @sergio有正确的主意。 虽然你的代码。将其置于一个完整的层中,然后在触摸操作上将其移动,就像您已经在移动它一样,并在执行该操作以再次将菜单重新备份时重新设置其位置。