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文件在分配纹理时崩溃Xcode 10
Sprite Kit 场景编辑器 GameScene.sks 场景宽度和高度