11

我正在使用 cocos2d 为 iPhone 开发 2d 游戏。

我在游戏中使用了许多小精灵(图像)。我想触摸两种相似类型的 sprite(image),然后两个 sprite(image) 都将被隐藏。

如何检测特定精灵(图像)中的触摸?

4

7 回答 7

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;
}
于 2011-02-16T13:27:28.350 回答
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;
   }
}

您可能需要稍微调整 x/ya 以考虑 Cocos 中的“居中定位”

于 2009-04-15T00:55:00.223 回答
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.
}
于 2009-03-12T20:18:19.903 回答
7

@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;
    }
}
于 2009-07-02T18:41:43.430 回答
0

@Genericrich:CGRectContainsPoint 在 CocosLand 中工作,因为上面调用了 2 行:

[[Director sharedDirector] convertCoordinate:]

Cocos2D 对象将使用 OpenGL 坐标系,其中 0,0 是左下角,而 UIKit 坐标(如触摸发生的位置)的 0,0 是左上角。convertCoordinate:正在为您从 UIKit 转换为 OpenGL。

于 2009-05-18T15:55:29.803 回答
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;
    }
}
于 2009-08-21T11:02:15.837 回答
0

这是一个很好的教程,解释了基本的触摸系统 http://ganbarugames.com/2010/12/detecting-touch-events-in-cocos2d-iphone/

首先,写

self.isTouchEnabled = YES;

然后,您需要实现函数 ccTouchesEnded、ccTouchesBegan 等

据我了解,您希望能够“匹配”两个可以在屏幕上不同坐标上的精灵。

这样做的方法.. :(我确定还有很多其他方法)

考虑有 2 个全局变量。

所以每次触摸一个精灵时,你都会使用多次提到的 CGRectContainsPoint 函数来查找哪个精灵被触摸了。然后,您可以将该精灵的“标签”保存在其中一个全局变量中。

您对第二次触摸执行相同操作,然后比较 2 个全局变量。

您应该能够弄清楚其余部分,但如果您有问题,请发表评论。

于 2012-10-06T00:11:50.650 回答