如何给精灵精确的触摸位置?

时间:2020-04-14 14:00:23

标签: ios swift sprite-kit textures skspritenode

我的问题是

当我触摸黑色箭头区域时,我仍会触摸整个图片,但是当我仅触摸红色区域时,我只希望触摸并有操作。 我试图给spriteNode plane = childNode(withName: "play")取一个名字,但是它不仅可以捕捉/触摸所有图像帧,而且还可以捕捉所有图像帧。

red and black areas

我在Google上进行了一些搜索,但没有得到肯定的结果。

非常感谢。

2 个答案:

答案 0 :(得分:2)

一个非常简单的解决方案可能是将命中的测试区域放置在您的平面对象上(在示例中,我将它们保留为红色,但是您可以使它们透明)。我在编辑器中创建了飞机类,并将其作为参考拖动到场景中,但是您也可以轻松地从头开始对命中区域进行编程。

enter image description here

然后在飞机类中将它们添加到飞机并检测飞机类本身内的触摸。这不是精确的,但相差不远,那么您的Alpha跟踪就在您的图片中了。

此方法的一个好处是,您可以将这种接触隔离到飞机的各个区域。某些用途可能是...

  • 触摸左/右翼以改变方向
  • 触摸身体加油
  • 触摸机翼以更换枪支

这是我在Plane类中使用的代码

<?php
$dir = __DIR__ . DIRECTORY_SEPARATOR . "gallery" . DIRECTORY_SEPARATOR;
$tdir = __DIR__ . DIRECTORY_SEPARATOR . "thumb" . DIRECTORY_SEPARATOR;
$maxLong = 200; 
$quality = 40;
$images = [];


$files = glob($dir . "*.{jpg,jpeg,gif,png}", GLOB_BRACE);


foreach ($files as $f) {
  $img = basename($f);
  $images[] = $img;
  if (!file_exists($tdir . $img)) {
    list ($width, $height) = getimagesize($dir . $img);
    $ratio = $width > $height ? $maxLong / $width : $maxLong / $height ;
    $newWidth = ceil($width * $ratio);
    $newHeight = ceil($height * $ratio);
    $source = imagecreatefromjpeg($dir . $img);
    $destination = imagecreatetruecolor($newWidth, $newHeight);
    imagecopyresampled($destination, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    imagejpeg($destination, $tdir . $img, $quality);
  }
}

?>
<!DOCTYPE html>
<html>
  <head>
    <title>Stack gallery</title>
    <link href="css.css" rel="stylesheet">
    <script src="script.js"></script>
  </head>
  <body>
    <!-- [LIGHTBOX] -->
    <div id="lfront"></div>
    <div id="lback"></div>

    <!-- [THE GALLERY] -->
    <div id="gallery"><?php
    foreach ($images as $i) {
      printf("<img src='thumb/%s' onclick='gallery.show(this)' />" ,$i, basename($i));
    }
    ?></div>
  </body>
</html>

答案 1 :(得分:1)

It seems like所需的行为未包含在SpriteKit中,因此您必须自己实现。

从上面的链接引用:

您将不得不找出locationInNode(spriteNode)对象对象的UITouch,以获取子画面内的坐标,然后从子画面中读取alpha值(不平凡)或预先计算位掩码(一个和零),然后读取精灵的位掩码中相应点的值

因此,您需要将图像加载为UIImage或CGImage并检查发生触摸的像素处的颜色是否透明。您可以在以下问题中找到有关如何执行此操作的更多信息:How to get pixel color from SKSpriteNode or from SKTexture?