SpriteKit Objective-C:SKSpriteNode 类实例上的 touchesBegan()

Posted

技术标签:

【中文标题】SpriteKit Objective-C:SKSpriteNode 类实例上的 touchesBegan()【英文标题】:SpriteKit Objective-C: A touchesBegan() on an SKSpriteNode class instance 【发布时间】:2015-06-17 20:15:56 【问题描述】:

我有一个名为 TBButton 的类的引用。 TBButton 是 SKSpriteNode 的子类,并且有一个具有多种类型的枚举(一种是“蓝色”)。我将如何创建一个 touchesBegan() 函数,该函数在该 TBButton 类的任何实例被触摸时被调用?我尝试在 TBButton 类本身中使用 NSLog() 实现一个非常简单的 touchesBegan(),但这没有用。我还尝试使用以下代码查找 GameScene.m 中触摸的按钮是否是 TBButton 的实例:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    for (UITouch *touch in touches) 
        CGPoint location = [touch locationInNode:self];
        TBButton *touchedNode = (TBButton *)[self nodeAtPoint:location];

        if (touchedNode && [touchedNode.name isEqualToString:@"button"]) 

            if (touchedNode.type == Blue) 

                // Touched a blue button.
                NSLog(@"Touched a blue button");
                /// Find out how to do this code! It ain't workin!

            

        

    

这是我在我的 GameScene.m 中尝试的代码,但是当我触摸我的一个按钮时,它没有将任何内容记录到控制台。是的,我已经确定 TBButton 实例的名称是 @"button",所以这不是问题。

为了方便我,如果没有必要,请忽略 GameScene.m 中的任何代码。我真正想知道的是我是否可以在我的 TBButton.m 本身内实现一个 touchesBegan() 函数!或者我不能?是否会在 TBButton.h 中放置一个实例方法,将其设置为在 TBButton.m 中的按钮被触摸时执行代码,并在其在 GameScene.m 中的实例工作时调用它?

希望你能理解我的问题!

【问题讨论】:

您是否将userInteractionEnabled 设置为YES?它是“指示节点是否接收触摸事件的布尔值”。 是的,我有。虽然这是默认值,但无论如何。 啊,是的,对于 SKSpriteNode 它是(我刚刚读到你正在使用它)。但是,对于 SKNode,它不是! 【参考方案1】:

我认为您的主要问题是身份识别问题。 SKSpriteNode 是 SKNode 的子类,您有两个简单的选择:

当您创建 TBButton 的实例时,请将 name 属性设置为类似于“TBButton”的内容。然后,您可以在 touchesBegan 方法中检查节点的名称。

if([touchedNode.name isEqualToString:@"TBButton"]) 
    //....

如果您需要的不仅仅是一个简单的字符串,您可以使用 SKNode 的 userData 属性。同样,在创建 TBButton 实例时:

self.userData = [NSMutableDictionary new];
[self.userData setObject:@"GreenButton" forKey:@"ButtonColor"];

签入 touchesBegan 看起来像这样:

if([[touchedNode.userData objectForKey:@"ButtonColor"]isEqualToString:@"GreenButton"]) 
    //...

【讨论】:

我知道你要去哪里,sangony,但这也行不通。没有抛出任何错误或任何错误,但没有任何反应。当在 TBButton.m 中出现 Green 的情况时,我通过设置 NSMutableArray 的对象来实现您的代码。我有几个案例的“枚举”,如果是格林,我将这一行添加到“setObject”。我尝试在 GameScene.m 中使用你的 if 语句。很遗憾,它没有用。【参考方案2】:

哦,我自己想通了,大家!但感谢您的帮助。问题是在我的 TBButton 类中,我忘记将类的 ButtonType 设置为属性。

这是我添加到 TBButton.m 的代码行:

    if (self) 
        self.type = type;
    

所以,我希望这次“对话”不会降低我的等级或其他什么。不过,我仍然感谢您的回答。谢谢!

【讨论】:

以上是关于SpriteKit Objective-C:SKSpriteNode 类实例上的 touchesBegan()的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit代码动态调整sks文件中粒子的颜色

SpriteKit .sks文件在分配纹理时崩溃Xcode 10

Sprite Kit 场景编辑器 GameScene.sks 场景宽度和高度

在spritekit swift问题中更改场景

xCode 8.x 因“GameScene.sks”文件而崩溃

SpriteKit/Objective-C - 节点内的触摸检测