iPhoneФорумПрограммирование

Неправильная обработка нажатия на спрайт

#0
18:12, 2 мая 2012

Всем привет.

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

        itemMenu = [CCSprite spriteWithFile:@"itemMenu.png"];  //  ПАНЕЛЬ
        itemMenu.position = ccp(240,470);
               [self addChild:itemMenu];
       
        pStand=[CCSprite spriteWithFile:@"pStand.png"];  //Данный спрайт должен быть прикреплен к спрайту панели, поэтому выставляю панель как родителя, чтобы при перемещении панели он ездил за ней
        pStand.tag=1;
       pStand.position=ccp(103,105);
              [itemMenu addChild:pStand ]; //!!

        -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{  
   
              UITouch *touch=[touches anyObject];
              CGPoint location=[touch locationInView:[touch view]];
              location = [[CCDirector sharedDirector] convertToGL:location];
                   if (CGRectContainsPoint([[self getChildByTag:1]boundingBox] , location)) {   // Нажатие на панель
                     ...
                     тут происходит опускание панели
                     .   . .
                          }

             if (CGRectContainsPoint([[itemMenu getChildByTag:1]boundingBox],  location)){  //Нажатие на тот другой спрайт который обрабатывается не правильно
                NSLog(@"pStand");
           }
}

Проблема в том, что когда я жму на кнопку и у меня выезжает панель, при нажатии на спрайт ничего не происходит, НО , если пожать мышкой в области координат (103,105) то происходит вывод сообщения через NSLog.
Как сделать правильно, чтобы при нажатии на СПРАЙТ выводилось сообщение, а не при нажатии в пустую область? Насколько я понимаю я что-то не так сделал с привязкой объекта... До этого программировал на ActionScript и решил сделать по аналогии...


Заранее спасибо.

#1
22:38, 2 мая 2012

Привет, в первой проверке нажатия ты используешь [self getChildByTag:1]boundingBox], и во второй проверке (где как я понял ты хочешь получить границы спрайта), ты тоже используешь [self getChildByTag:1]boundingBox]? Наверное это не очень правильно, т.к. у тебя под тэгом 1, получается, хранится два разных объекта?

Попробуй для начала сделать отдельные ссылки и хранить их как свойства (данные-члены) объекта сцены, т.е. сделать отдельные свойства, в которых у тебя будет храниться сама панель и разные спрайты в таком виде:

@property(..) ... *panel;
@property(..) ... *sprite1;
@property(..) ... *sprite2;
@property(..) ... *sprite3;

А потом уже проверяй "попадания". Конечно этот метод не оптимальный и не лучший в мире, но ясности внесет больше, чем с тэгами, если я правильно понял твою проблему :)

#2
1:30, 3 мая 2012

Нет, я во второй проверке проверяю [temPanel getChildByTag:1], так же присваивая pStand в качестве ребенка к itemPanel  - [itemPanel addChild:pStand].
dig, а не могли бы вы по подробнее рассказать или дать ссылку на информацию по
"@property(..) ... *panel;
@property(..) ... *sprite1;
@property(..) ... *sprite2;
@property(..) ... *sprite3;"
А то Obj-C и Cocos2d только начал изучать.

#3
3:03, 3 мая 2012

funnel
Вообще в кокосе немного неправильно сделана функция boundingBox, насколько я помню.
У меня она выводила boundingBox по отношению к РОДИТЕЛЮ (parent), а не ЭКРАНУ(root parent)!

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

#4
12:53, 3 мая 2012

CasDev , про TouchableSprite ничего так и не смог найти. Проблему решил по другому, просто родителем делал не спрайт,а self  и каждый кадр через функцию сделал привязку к панели.
И не могли бы вы все такие представить ваше чрезмерно усложненное решение ? Просто интересно посмотреть.

Спасибо за ответы

#5
13:07, 3 мая 2012

А.. не разглядел, тогда должно быть правильно. Наверное действительно как CasDev написал надо проверить, какие значения возвращаются из boundingBox и соответствуют ли они реальности.

Я писал про свойства - подробнее здесь http://cocoacast.com/?q=node/103

iPhoneФорумПрограммирование

Тема в архиве.