2009-03-12 4 views
11

Я разрабатываю 2d игру для iPhone, используя cocos2d.Как я могу обнаружить касание в cocos2d?

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

Как определить контакт в конкретном спрайте (изображении)?

ответ

16

В вашем слое, который содержит ваш спрайт, вы должны сказать:

self.isTouchEnabled = YES; 

, то вы можете использовать одни и те же события, которые вы могли бы использовать в UIView, но они называются несколько иначе:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    //in your touchesEnded event, you would want to see if you touched 
    //down and then up inside the same place, and do your logic there. 
} 
+0

это не мой ответ. Я хочу обнаружить особый прикосновение. – Nasir

+5

Я не уверен, что вы имеете в виду ... какой особый штрих? – Jonas

23

Следуя инструкциям Джонаса, и добавив на него немного больше ...

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint location = [[[Director sharedDirector] convertCoordinate: touch.location]; 
    CGRect particularSpriteRect = CGMakeRect(particularSprite.position.x, particularSprite.position.y, particularSprite.contentSize.width, particularSprite.contentSize.height); 
    if(CGRectContainsPoint(particularSpriteRect, location)) { 
    // particularSprite touched 
    return kEventHandled; 
    } 
} 

Вы ма у нужно настроить х/я немного, чтобы учесть «центрированное позиционирование» в Кокосовых

+2

+1 для обучения мне, что CGRectContainsPoint работает в CocosLand. – Genericrich

+0

Cocos2D, так как 0.7.1 (или 0.7.2?) Теперь использует CCP (CGPoint) вместо CPV (Vector Chipmunk) для своих координат. Они взаимозаменяемы, однако - афайк, они всегда были с тех пор, как они определены одинаково. Большинство методов CG * должны работать. –

+0

Кажется, что это не справится с спрайтами, которые были масштабированы, поскольку Sprite.contentSize - это все содержимое без масштабирования ... Хотя я еще не пробовал. – Dad

0

@Genericrich: CGRectContainsPoint работает в CocosLand из-за вызов 2 строки выше:

[[Director sharedDirector] convertCoordinate:] 

Объекты Cocos2D будет используя систему координат OpenGL, где 0,0 - нижний левый, а координаты UIKit (например, когда произошло касание) имеют 0,0 верхний левый. convertCoordinate: делает флип из UIKit в OpenGL для вас.

+1

- это неточное утверждение - оно не конвертируется из OpenGL в UIKit ... но скорее из OpenGL View Space в Screen Space, так как неконвертированные координаты имеют довольно смешные значения. Кроме того, объекты CocosNode по умолчанию привязаны по центру (0,0 == центр объекта). Возвращаемое значение - это просто точка на экране относительно Cocos2D Space. convertCoordinate записывается как: int newY = openGLView_.frame.size.height - p.y; int newX = openGLView_.frame.size.width - p.x; CGPoint ret; switch (deviceOrientation_) {// различные случаи для обмена по причинам ориентации} return ret; –

7

@ david, ваш код имеет некоторые опечатки для кокосов 0.7.3 и 2.2.1, в частности CGRectMake вместо CGMakeRect и [touch location] теперь [touch locationInView: touch.view].

вот что я сделал:

- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]]; 
    CGRect myRect = CGRectMake(sprite.position.x, sprite.position.y, sprite.contentSize.width, sprite.contentSize.height); 


    if(CGRectContainsPoint(myRect, location)) { 
     // particularSprite touched 
     return kEventHandled; 
    } 
} 
+0

Режиссер не существует. Должен быть CCDirector, но этот код не работает. Слишком старый? (с использованием cocos2d 2.x) – Jonny

+0

Да, это сработало в 2009 году, но я думаю, что многое изменилось. Вещь, которая вам нужна в строке местоположения, заключается в том, чтобы преобразовать координату в CGPoint, но не уверен, что это сейчас. Это похоже на современную ссылку: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Coordinate_System – John

0

Вот как это работает для меня ... Где spriteSize, очевидно, размер спрайта ...: P

- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]]; 
    CGRect myRect = CGRectMake(sprite.position.x-spriteSize/2, sprite.position.y-spriteSize/2, spriteSize, spriteSize); 


    if(CGRectContainsPoint(myRect, location)) { 
     // particularSprite touched 
     return kEventHandled; 
    } 
} 
+0

почему ур отредактировал через 1 год – Srinivas

0

Я пытался выяснить, как достать штрихи данного спрайта и найти эту тему.

Это правильный способ определить, какой спрайт был затронут? Это кажется довольно странным способом сделать это по сравнению с обычным способом подкласса в obj-c?

Так что все коды обнаружения касания находятся в классе слоев?

Спасибо за указатели

27

лучший способ сделать это на самом деле использовать рамку на самой спрайта (который является CGRect). В этом примере кода я помещаю все спрайты в NSMutableArray, и я просто проверяю, находится ли спринт в ограничивающей рамке. Убедитесь, что вы включили обнаружение касания в init.Если вы заметили, я также принять/отклонить штрихи на слое путем возврата YES (если я использую контакт) или NO (если у меня нет)

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 

    for (CCSprite *station in _objectList) 
    { 
    if (CGRectContainsPoint(station.boundingBox, location)) 
    { 
     DLog(@"Found sprite"); 
     return YES; 
    } 
    } 

    return NO; 
} 
+0

Упоминайте, почему это «лучший способ» «? – kizzx2

+2

Я согласен, что это лучше, потому что это очень чисто. –

+0

Это единственная на этой странице, которая кажется uptodate с недавним cocos2d. (2.х) – Jonny

0

это хороший учебник объясняет основную систему сенсорного http://ganbarugames.com/2010/12/detecting-touch-events-in-cocos2d-iphone/

первый, написать

self.isTouchEnabled = YES; 

то, что вам нужно реализовать функции ccTouchesEnded, ccTouchesBegan и т.д.

от ш Я понял, вы хотите, чтобы «совместить» два спрайта, которые могут быть на разных координатах на экране.

способа сделать это ..: (я уверен, Theres многих других методов)

рассматривать с 2 глобальных переменными.

поэтому каждый раз прикосновение касается спрайта, вы используете функцию CGRectContainsPoint, которая упоминается несколько раз, чтобы найти, какой спрайт был затронут. то вы можете сохранить «тег» этого спрайта в одной из глобальных переменных.

Вы делаете то же самое для второго касания, а затем сравниваете 2 глобальных переменных.

Вы должны уметь находить остальное, но комментировать, если у вас есть проблемы.

Смежные вопросы