Всем привет.
Есть спрайт - панель(которая находится за экраном, но при нажатии на определенную кнопку выезжает вниз на экран)
Далее добавляю другой спрайт, который является так сказать частью панели. Добавляя его на сцену в родители ставлю спрайт панели
Пишу с использованием 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 и решил сделать по аналогии...
Заранее спасибо.
Привет, в первой проверке нажатия ты используешь [self getChildByTag:1]boundingBox], и во второй проверке (где как я понял ты хочешь получить границы спрайта), ты тоже используешь [self getChildByTag:1]boundingBox]? Наверное это не очень правильно, т.к. у тебя под тэгом 1, получается, хранится два разных объекта?
Попробуй для начала сделать отдельные ссылки и хранить их как свойства (данные-члены) объекта сцены, т.е. сделать отдельные свойства, в которых у тебя будет храниться сама панель и разные спрайты в таком виде:
@property(..) ... *panel;
@property(..) ... *sprite1;
@property(..) ... *sprite2;
@property(..) ... *sprite3;
А потом уже проверяй "попадания". Конечно этот метод не оптимальный и не лучший в мире, но ясности внесет больше, чем с тэгами, если я правильно понял твою проблему :)
Нет, я во второй проверке проверяю [temPanel getChildByTag:1], так же присваивая pStand в качестве ребенка к itemPanel - [itemPanel addChild:pStand].
dig, а не могли бы вы по подробнее рассказать или дать ссылку на информацию по
"@property(..) ... *panel;
@property(..) ... *sprite1;
@property(..) ... *sprite2;
@property(..) ... *sprite3;"
А то Obj-C и Cocos2d только начал изучать.
funnel
Вообще в кокосе немного неправильно сделана функция boundingBox, насколько я помню.
У меня она выводила boundingBox по отношению к РОДИТЕЛЮ (parent), а не ЭКРАНУ(root parent)!
Намного проще использовать класс обертку типа TouchableSprite (погугли, я не помню, но там буквально поллиста - я у себя использую чрезмерно усложненный вариант, поэтому код не выложу).
CasDev , про TouchableSprite ничего так и не смог найти. Проблему решил по другому, просто родителем делал не спрайт,а self и каждый кадр через функцию сделал привязку к панели.
И не могли бы вы все такие представить ваше чрезмерно усложненное решение ? Просто интересно посмотреть.
Спасибо за ответы
А.. не разглядел, тогда должно быть правильно. Наверное действительно как CasDev написал надо проверить, какие значения возвращаются из boundingBox и соответствуют ли они реальности.
Я писал про свойства - подробнее здесь http://cocoacast.com/?q=node/103
Тема в архиве.