Добрый вечер, я начну этот вопрос по освященной веками традиции, сказав, что у меня был старый добрый поиск по 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? Метод проб и ошибок пока бесполезен. Такое ощущение, что я бьюсь головой о кирпичную стену. При необходимости я с радостью выложу полные файлы классов. Имеет ли это смысл?