реализация статического объекта на движущейся сцене - PullRequest
0 голосов
/ 14 июня 2011

Как реализовать «меню», которое кажется застрявшим в своем положении? Здесь с застрявшим я хотел сказать, что либо 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 ]

2 голосов
/ 14 июня 2011

Вы не указываете, как вы создаете свои меню и что вы делаете с ними, поэтому мой ответ довольно общий ...

Правильный подход к этому, для меня это наличие слоя пользовательского интерфейса, гдеВы помещаете все свои элементы пользовательского интерфейса (меню, кнопки и т. д.) и относитесь к ним иначе, чем к другим игровым слоям.Другими словами, вы назначаете своему слою пользовательского интерфейса фиксированное положение, а затем не применяете к нему никаких действий или каких-либо других преобразований.Таким образом, он должен оставаться довольно статичным.

Cocos2d предлагает свои собственные классы для управления CCMenu, CCMenuItem и CCLabel, которые позволяют легко создавать пользовательский интерфейс.Но, если вы предпочитаете, вы также можете попробовать и интегрировать UIKit объекты.Посмотрите на CCUIViewWrapper, если вам это действительно нужно.

РЕДАКТИРОВАТЬ:

Идея создания слоя пользовательского интерфейса заключается в следующем более подробно:

  1. у вас есть корневой слой, выступающий в качестве контейнера для всех ваших слоев;

  2. один из этих слоев - "игровой слой", который довольно хорошмногое из того, что у вас есть сейчас;

  3. другой - это "слой пользовательского интерфейса";

  4. касается, и любые виды преобразований применяются только к "игровой слой ", которые перемещаются внутри корневого слоя, не затрагивая" пользовательский слой ".

Об этом есть хорошее руководство в" Обучение разработке игр с Cocos2D "Штеффен Иттерхайм.Эта книга - фантастика, если вы хотите изучить несколько изящных подходов к вашей игре cocos2d.Учебник, о котором я говорю, доступен в виде кода на сайте Штеффена.Вы можете загрузить его с этой страницы и посмотреть в главе 5 пример "Сцена и слои", в частности, начиная с ScenesAndLayers04, где вы найдете классы 'MultiLayerScene.h / m`.

1 голос
/ 16 июня 2011

У меня была небольшая проблема с этим некоторое время назад. Я пытался иметь элементы пользовательского интерфейса, которые не терялись при перемещении камеры. В итоге я добавил CCParallaxNode в детстве и установил соотношение параллакса к ccp (0.0, 0.0) для всего, что я на него надевал. Таким образом, сцена может перемещаться, но мой слой пользовательского интерфейса остается на месте. Я не уверен, что это лучший способ сделать это, но я просто программист:)

0 голосов
/ 14 июня 2011

@ sergio имеет правильную идею.

С вашим кодом, хотя.Поместите его в один слой, а затем на сенсорном действии переместите его, как вы уже сделали, и просто сбросьте его положение, когда вы предпримете действие, чтобы снова открыть меню.

...