Cocos2d - разрешить использование прикосновений нескольким классам (подлый джойстик)

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

События касания уже отсортированы в классах sneakyjoystick (доступно на github https://github.com/0xPr0xy/sneaky-joystick-cocos2d). На данный момент, если я создаю джойстик во время метода инициализации в классе с именем controlsLayer, тогда все работает нормально; Появляется джойстик, и он позволяет мне перемещаться по спрайту

-(id) init
{

if( (self=[super init]) ) {

    myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
    myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
    myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
    myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
    myJoystickBase.position = ccp(64, 64);
    myJoystickBase.backgroundSprite.opacity = 100;
    myJoystickBase.thumbSprite.opacity = 100;
    [self addChild:myJoystickBase];
    myJoystick = [myJoystickBase.joystick retain];


    [self scheduleUpdate];


    }
return self;
}

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

if( (self=[super init]) ) {

    self.isTouchEnabled = YES;
    [self scheduleUpdate];

}
return self;
}

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    location = [self convertToNodeSpace:location];
    myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
    myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
    myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
    myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
    myJoystickBase.position = location;
    myJoystickBase.backgroundSprite.opacity = 100;
    myJoystickBase.thumbSprite.opacity = 100;
    [self addChild:myJoystickBase];
    myJoystick = [myJoystickBase.joystick retain];
}

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [self removeChild:myJoystickBase cleanup:YES];
}

Так что моему непосвященному мозгу это говорит о том, что когда я касаюсь класса controlsLayer, он с радостью делает то, о чем я его просил, но не передает это прикосновение другим классам.

Вкратце, можно ли передать событие касания нескольким классам одновременно? Класс хитрого джойстика использует CCTargetedTouchDelegate, который отлично работал, когда единственное, что требовало прикосновения. Однако теперь, когда я добавил - (void) ccTouchesBegan: в другом классе это не понравилось.

Может ли кто-нибудь сказать мне, связана ли проблема с тем, как я обрабатываю касания, или, возможно, это проблема с тем, как я выделяю джойстик в методе касания? Должен ли я выделять джойстик в методе init и делать что-то еще в методе touchesBegan? Метод проб и ошибок пока бесполезен. Такое ощущение, что я бьюсь головой о кирпичную стену. При необходимости я с радостью выложу полные файлы классов. Имеет ли это смысл?


person Whackdackery    schedule 18.03.2013    source источник


Ответы (1)


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

У вас также протекает джойстик из-за ненужной фиксации (используйте ARC, пожалуйста!).

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

Кроме того, если у вас включено несколько касаний, имейте в виду, что вы можете получать до 5 событий начала касания (5 пальцев), не прекращая никаких касаний между ними. Это создаст 5 джойстиков, но уберет только один! Каждый раз!

person LearnCocos2D    schedule 19.03.2013
comment
Как же неловко. В течение 10 минут после возвращения домой с работы все работает так, как мне нужно. Теперь джойстик инициализирован в методе инициализации, и ему присвоена непрозрачность 0. ontouchbegan CCfadesto непрозрачность 100 в месте касания. По окончании касания он исчезает до непрозрачности 0. Затем в классе скрытых джойстиков я говорю ему не глотать прикосновения и снимаю флажок, чтобы увидеть, касаетесь ли вы положения джойстика. Таким образом, он реагирует, куда бы вы ни прикасались. Спасибо большое, сэр. На данный момент я сохраняю элемент мультитач, так как он мне понадобится позже в какой-то момент. Еще раз спасибо Стеффан - person Whackdackery; 19.03.2013