objective c - SKSpriteNode - 当触摸在精灵之外结束时

时间:2014-06-15 01:35:39

标签: ios objective-c cocoa-touch

我按照这个关于马里奥式游戏的精彩指南: http://www.raywenderlich.com/62053/sprite-kit-tutorial-make-platform-game-like-super-mario-brothers-part-2

但是,我想将移动控件转换为箭头键,由SKSpriteNodes实现,其名称由以下位置检测:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  UITouch* touch = [touches anyObject];
  CGPoint location = [touch locationInNode:self];
  SKNode* node = [self nodeAtPoint:location];

  // other left, up, down arrows with same code here
  if ([node.name isEqualToString:@"rightArrow"]) {
    self.player.moveRight = YES;
    self.rightOriginalTouchLocation = location;

   ...
  }
}

self.player.moveRight是一个布尔值(非常类似于指南中的moveForward),它告诉更新时的角色移动。

终止于:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  UITouch* touch = [touches anyObject];
  CGPoint location = [touch locationInNode:self];
  SKNode* node = [self nodeAtPoint:location];

  // other left, up, down arrows with same code here
 if ([node.name isEqualToString:@"rightArrow"]) {
    self.player.moveRight = NO;

  }
  ...
}

但是,我遇到以下问题 - 当我开始触摸箭头,将其拖到箭头外,然后释放水龙头时,它不会被识别为箭头节点的“触摸结束”(并且它没有'因为那个停止移动)。 我试图以多种方式解决它(甚至计算从原始位置的触摸移动距离,看它是否太远,然后取消移动),但我总是设法重现恒定运动问题。

问题在于我可以同时点击两个箭头,因此仅记住最后一个节点被点击是不够的。

由于我想同时允许不同方向的移动,因此如果一个按钮被解除,我就无法停止所有移动。我需要具体知道哪个按钮被释放,所以我只能停止那个方向的运动。

你对我有什么想法吗?我应该以另一种方式实现它,考虑到我想要箭头键,还是有一种方法来检测哪个节点被释放,即使它不在其原始位置(点击)?

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果有人对这个问题感兴趣 - 我有一个问题,即触摸和从SKSpriteNode移动没有为该SKSpriteNode调用touchesEnded(因为触摸的'发布'不在节点中)。 / p>

我通过将触摸的CGPoint保持在touchesBegan来解决它,并且当调用touchesEnded时,我使用简单的距离函数计算到最近的键的距离:

-(int)calculateDistanceWithPoints:(CGPoint)point1 andPoint:(CGPoint)point2 {
  float d = sqrtf(pow((point1.x - point2.x), 2) + pow((point1.y - point2.y), 2));
  return (int)d;
}

然后,在touchesEnded中,我检查了距离最小的密钥(我有3个密钥,因此哪个密钥最有可能是发布的密钥') - 并执行了操作该密钥发布所需。