sprite-kit - 检测等距纹理上的点击/触摸

标签 sprite-kit isometric

我很难在一个简单的等距 Sprite Kit 游戏中实现点击处理。

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

这是 map 的屏幕截图:

enter image description here

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

-(void)mouseDown:(NSEvent *)theEvent
{
    [self setColorBlendFactor:0.5];
}

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

enter image description here

如您所见,如果我单击图块 7 的左上角,图块 8 将变为透明。

enter image description here

我尝试了一些方法,比如在点击位置获取所有节点并检查点击是否在 CGPath 内但没有成功(我认为坐标有问题)。

所以我的问题是如何只检测纹理而不是透明部分的点击?或者我对问题的处理方法是错误的?

任何意见,将不胜感激。

编辑:对于对我最终使用的解决方案感兴趣的任何人,请参阅 my answer here

最佳答案

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

  • 在您的场景中获取位于您点击位置的所有节点,即
    [myScene nodesAtPoint:[theEvent lactionInNode:myScene]]
    
  • 不要忘记检查您是否没有单击场景的根
    类似的东西:
    if (![[myScene nodeAtPoint:[theEvent locationInNode:myScene]].name isEqual: @"MyScene"])
    

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

  • 要获得 alpha 尝试 this .

    我的看起来像这样:
    -(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;
        }
    }
    

    关于sprite-kit - 检测等距纹理上的点击/触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22578564/

    相关文章:

    swift - 如何在 View 中获取子 Sprite 位置

    ios - 连续移动对象 - iOS - SpriteKit

    c++ - 如何用等距透视渲染?

    math - 如何计算等距矩形/正方形的高度和宽度

    ios - 计算等距网格上矩形内包含的单元格

    python-3.x - Pygame 错误地渲染等距图像

    ios - Swift Spritekit 滚动背景

    ios - 如何将 UIview 添加到 SpriteKit 项目?

    swift - 如何将用户的分数传输到 Swift 和 SpriteKit 中的另一个场景?

    graphics - 穿过等距图 block