#iphone #cocos2d-iphone
#iPhone #cocos2d-iphone
Вопрос:
Кому-нибудь удалось заставить распознавание жестов работать в cocos-2d?
Я прочитал здесь сообщение, в котором утверждалось, что я достиг этого, здесь: http://www.cocos2d-iphone.org/forum/topic/8929
Я исправил из git hub здесь: https://github.com/xemus/cocos2d-GestureRecognizers/blob/master/README
Я создал подкласс CCSprite
(который является подклассом CCNode
):
-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect {
if( (self=[super initWithTexture:texture rect:rect]) )
{
CCGestureRecognizer* recognizer;
recognizer = [CCGestureRecognizer
CCRecognizerWithRecognizerTargetAction:[[[UITapGestureRecognizer alloc]init] autorelease]
target:self
action:@selector(tap:node:)];
[self addGestureRecognizer:recognizer];
}
return self;
}
Метод делегирования:
- (void) swipe:(UIGestureRecognizer*)recognizer node:(CCNode*)node
{
NSLog(@" I never get called :( ");
}
Мое событие tap никогда не вызывается.
У кого-нибудь это работает? Насколько сложно выполнить распознавание жестов вручную для определения свайпа?
Ответ №1:
Вам нужно подключить распознаватель жестов к чему-то «по цепочке». Не привязывайте их к отдельным узлам; прикрепите их к UIView (т. Е. [[CCDirector sharedDirector] OpenGLView]).
Вот что я сделал:
- (UIPanGestureRecognizer *)watchForPan:(SEL)selector number:(int)tapsRequired {
UIPanGestureRecognizer *recognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:selector] autorelease];
recognizer.minimumNumberOfTouches = tapsRequired;
[[[CCDirector sharedDirector] openGLView] addGestureRecognizer:recognizer];
return recognizer;
}
- (void)unwatch:(UIGestureRecognizer *)gr {
[[[CCDirector sharedDirector] openGLView] removeGestureRecognizer:gr];
}
Этот конкретный код используется в суперклассе для контроллеров сцены, поэтому целевой объект для селектора жестко запрограммирован на «self», но вы могли бы легко абстрагировать его от переданного объекта. Кроме того, вы могли бы экстраполировать вышесказанное, чтобы легко создавать распознаватели жестов для нажатий, защемлений и т.д.
Тогда в подклассе для контроллера я просто делаю это:
- (MyController *)init {
if ((self = [super init])) {
[self watchForPan:@selector(panning:) number:1];
}
return self;
}
- (void)panning:(UIPanGestureRecognizer *)recognizer {
CGPoint p;
CGPoint v;
switch( recognizer.state ) {
case UIGestureRecognizerStatePossible:
case UIGestureRecognizerStateBegan:
p = [recognizer locationInView:[CCDirector sharedDirector].openGLView];
(do something when the pan begins)
break;
case UIGestureRecognizerStateChanged:
p = [recognizer locationInView:[CCDirector sharedDirector].openGLView];
(do something while the pan is in progress)
break;
case UIGestureRecognizerStateFailed:
break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
(do something when the pan ends)
(the below gets the velocity; good for letting player "fling" things)
v = [recognizer velocityInView:[CCDirector sharedDirector].openGLView];
break;
}
}
Комментарии:
1. 1 для ответа cc выше, это правильный метод. Таким образом можно использовать все подклассы UIGestureRecognizer для обнаружения жестов панорамирования, ущипывания и касания. Вы также можете использовать UILongPressGestureRecognizer с идентификатором регистра состояния UIGestureRecognizerStateChanged для обнаружения перетаскивания.
2. Красиво и чисто, прелестно. Две небольшие проблемы: 1. locationInView возвращает координаты в системе координат UIKit, их следует преобразовать в координаты GL перед использованием, например:
p = [[CCDirector sharedDirector] convertToGL: [recognizer locationInView:[CCDirector sharedDirector].view]];
2. OpenGLView устарел начиная с Cocos2D 2.0, он был заменен на[CCDirector sharedDirector].view
.3. Большое спасибо за публикацию этого 🙂
Ответ №2:
Если вы не хотите обрабатывать все вручную, я создал простую категорию, которая добавит распознаватели жестов в любую версию cocos2d подробнее на:
http://www.merowing.info/2012/03/using-gesturerecognizers-in-cocos2d/
или возьмите его с github
https://github.com/krzysztofzablocki/CCNode-SFGestureRecognizers
Комментарии:
1. Это потрясающе! Просто убедитесь, что узлы с распознавателями жестов расположены над узлами, используя методы ccTouches.
2. в Cocos2d 3.0 нет видимого интерфейса для [YourCCSprite addGestureRecognizer: YourGestureRecognizer]; Так что есть решение для этого?
3. Да, будут ли какие-либо обновления класса GestureRecognizer для Cocos2d 3.0??? Это действительно важная и недостающая часть.