Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

[[Director sharedDirector] convertCoordinate:]

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

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

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

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

self.isTouchEnabled = YES;

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top