在移动的场景上实现静态对象

时间:2011-06-14 07:41:45

标签: iphone cocos2d-iphone box2d box2d-iphone

如何实现一个似乎坚持它的位置的'菜单'?卡住了我的意思是说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)]];
                }   
            }
        }

3 个答案:

答案 0 :(得分:2)

您没有指定如何创建菜单以及您正在使用它们做什么,所以我的回答非常普遍......

对我而言,正确的方法是拥有一个UI层,您可以放置​​所有UI内容(菜单,按钮等),并且与其他游戏层的处理方式不同。换句话说,您将UI图层赋予固定位置,然后不对其应用任何操作或任何其他类型的转换。它应该保持相当静态。

Cocos2d提供了自己的类来管理CCMenuCCMenuItemCCLabel,以便您轻松构建UI。但是,如果您愿意,还可以尝试集成UIKit个对象。如果你确实需要,请查看CCUIViewWrapper

编辑:

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

  1. 您有一个根层充当所有图层的容器;

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

  3. 另一个是“ui层”;

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

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

答案 1 :(得分:1)

这一段时间我有点麻烦。我一直试图让相机移动时没有丢失的UI元素。我最后做的是在孩提时代添加一个CCParallaxNode,并将视差比设置为ccp(0.0,0.0)。这样,场景可以移动,但我的UI层保持不变。我不确定这是否是最好的方法,但我是一个肮脏的黑客程序员:)

答案 2 :(得分:0)

@sergio有正确的想法。

尽管你的代码。将它放在一个层中,然后在触摸动作中移动它就像你已经移动一样,当你采取行动再次重新启动菜单时重置它的位置。