检测等距纹理上的单击/触摸

Hey*_*ara 7 isometric sprite-kit

我正在努力在简单的等距Sprite Kit游戏中实现点击处理.

我有一个游戏场景(SKScene)和一个包含多个Tile对象(SKSpriteNode)的Map(SKNode).

以下是地图的屏幕截图:

在此输入图像描述

我希望能够检测到用户点击的磁贴,所以我在Tile对象上实现了mouseDown.这是我在Tile.m中的mouseDown:

-(void)mouseDown:(NSEvent *)theEvent
{
    [self setColorBlendFactor:0.5];
}
Run Code Online (Sandbox Code Playgroud)

代码似乎工作正常,但有一个小问题:节点重叠,并在节点的透明部分检测到click事件.示例(已添加rects以仅说明问题.它们未在逻辑中使用):

在此输入图像描述

如您所见,如果我点击图块7的左上角,则图块8变为透明.

在此输入图像描述

我尝试了在点击位置获取所有节点并检查点击是否在CGPath内部而没有成功(我认为坐标有问题).

所以我的问题是如何检测纹理上的点击而不是透明部分?或者我的方法可能是错的?

任何意见,将不胜感激.

编辑:对于我最终使用的解决方案感兴趣的人,请在此处查看我的答案

小智 2

我“现在”对此类问题的解决方案是:

  • 在您的场景中获取位于您单击的位置的所有节点,即

    [myScene nodesAtPoint:[theEvent lactionInNode:myScene]]
    
    Run Code Online (Sandbox Code Playgroud)
  • 不要忘记检查您是否没有单击场景的根目录,如下所示:

    if (![[myScene nodeAtPoint:[theEvent locationInNode:myScene]].name isEqual: @"MyScene"])
    
    Run Code Online (Sandbox Code Playgroud)

    然后遍历可能的节点数组并检查该节点的 alphaTexture (NOT myNode.alpha)

  • 如果 alpha 为 0.0f 则转到数组的下一个节点
  • 选择第一个 alpha 不为 0.0f 的节点并返回节点名称
  • 这样你就可以找到你的节点(首先)并将其保存为你需要的节点,然后杀死你不再需要的数组
  • 而不是用你的节点做你想做的事
  • 顺便说一句,在搜索名称后检查您要使用的新节点是否为零。如果这是真的,只需突破 moveDown 方法

要获得阿尔法,请尝试操作。

我的看起来像这样:

-(void)mouseDown:(NSEvent *)theEvent {
     /* Called when a mouse click occurs */
    if (![[self nodeAtPoint:[theEvent locationInNode:self]].name isEqual: self.name]]) {

        /* find the node you clicked */
        NSArray *clickedNodes = [self nodesAtPoint:[theEvent locationInNode:self]];

        SKNode *clickedNode = [self childNodeWithName:[clickedNodes getClickedCellNode]];

        clickedNodes = nil;

        /* call the mouseDown method of your Node you clicked to to node specific actions */
        if(clickedNode) {
           [clickedNode mouseDown:theEvent];
        }
        /* kill the pointer to your clicked node */
        clickedNode = nil;
    }
}
Run Code Online (Sandbox Code Playgroud)