Подтвердить что ты не робот

Как я могу обнаружить прикосновение в cocos2d?

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

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

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

4b9b3361

Ответ 1

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

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.
}

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

[[Director sharedDirector] convertCoordinate:]

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

Ответ 6

Вот как это сработало для меня... Где 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;
    }
}

Ответ 7

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

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

Итак, все коды обнаружения касаний находятся в классе слоев?

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

Ответ 8

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

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

self.isTouchEnabled = YES;

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

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

метод для этого..: (im sure theres много других методов)

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

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

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

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