Как я могу обнаружить касание в cocos2d? - PullRequest
11 голосов
/ 12 марта 2009

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

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

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

Ответы [ 7 ]

27 голосов
/ 16 февраля 2011

Лучший способ сделать это - использовать ограничивающий прямоугольник на самом спрайте (который является 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;
}
23 голосов
/ 15 апреля 2009

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

- (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;
   }
}

Возможно, вам придется немного отрегулировать x / y, чтобы учесть «центрированное позиционирование» в Cocos

16 голосов
/ 12 марта 2009

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

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.
}
7 голосов
/ 02 июля 2009

@ david, в вашем коде есть некоторые опечатки для cocos 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 голосов
/ 06 октября 2012

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

сначала напиши

self.isTouchEnabled = YES;

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

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

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

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

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

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

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

0 голосов
/ 21 августа 2009

Вот как это работает для меня ... Где 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 голосов
/ 18 мая 2009

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

[[Director sharedDirector] convertCoordinate:]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...