我正在使用Swift在SpriteKit中制作游戏。
在Objective-C中,我可以使用以下方法:
(void)enumerateChildNodesWithName:(NSString *)name usingBlock:(void (^)(SKNode *node, BOOL *stop))block
对此执行操作*node
,但是我无法在Swift中使用此功能。基本上,我不知道如何在Swift中引用该节点。
这是我正在使用的代码,但是“ usingBlock:”部分遇到了麻烦。我已经尝试了很多小时,但没有成功。请帮助!
func spawnEnemy() -> () {
let enemy = SKSpriteNode(imageNamed: "enemy")
enemy.name = "enemy"
enemy.position = CGPointMake(100, 100)
self.addChild(enemy)
}
func checkCollisions() -> () {
self.enumerateChildNodesWithName("enemy", usingBlock: ((SKNode!, CMutablePointer<ObjCBool>) -> Void)?)
}
目前,不要相信自动完成功能会插入所需的代码-它会从“标头”中删除签名,但是块签名与为块参数插入自己的闭包时所需的声明不同。
编写闭包的正式方法是在括号内复制签名,添加局部参数名称,并使用in
关键字标记闭包主体的开始:
self.enumerateChildNodesWithName("enemy", usingBlock: {
(node: SKNode!, stop: UnsafeMutablePointer <ObjCBool>) -> Void in
// do something with node or stop
})
但是Swift的类型推断意味着您不必写太多。相反,您只能命名参数,因为它们的类型(以及闭包的返回类型)是已知的:
self.enumerateChildNodesWithName("enemy", usingBlock: {
node, stop in
// do something with node or stop
})
您还可以使用结尾闭包语法:
self.enumerateChildNodesWithName("enemy") {
node, stop in
// do something with node or stop
}
(您甚至可以删除本地参数名称,并按位置引用参数,例如-for
$0
,node
但这不是一个好地方,因为它会使您的代码可读性差很多。最好$0
在盲目的地方保留并与之交朋友参数是显而易见的,例如与map
和一起使用的闭包sort
。)
有关更多说明,请参见 Swift编程语言 中 的
闭包
。
__
另外,因为stop
是an UnsafeMutablePointer
,所以使用它的语法与ObjC中的语法有些不同:设置stop.memory = true
为脱离枚举。
问题内容: 我需要帮助在游戏场景中呈现警报视图。我目前正在努力做到这一点,例如GameScene.Swift不是标准的ViewController。如果有帮助,我需要这样做,因为我需要用户输入一个值,该值用作游戏中球Sprite Kit节点的坐标。输入只是一个标准整数,因此这不是问题。也欢迎通过警报视图实现此操作的其他任何想法。 那是在GameViewController文件中 谢谢 问题答案:
问题内容: 据我所知,物理物体的默认设置是当它们相互碰撞时会相互反弹,直到将其rashingBitMask设置为相等的数值为止。 但是,由于我相信的碰撞位掩码,完成一个看起来应该非常简单的工作时遇到了很大的问题。 所以在这里,我有2个球和边框。我可以得到想要的碰撞检测,但是当我添加边框的类别位掩码时,它允许球既通过屏幕又通过屏幕,这是我所不希望的。 我也希望球彼此弹起,但是只有当我注释掉球的cat
据我所知,物理体的默认方法是在相互撞击时相互反弹,直到您将它们的碰撞BitMask设置为相等的数量。 然而,我有一个巨大的问题,完成看起来应该很简单的事情,因为我相信冲突位掩码。 这里我有两个球和边界体。我可以得到我想要的碰撞检测,但当我添加边界体的类别位掩码时,它允许球穿过和离开屏幕,这是我不想要的。 我也希望球相互反弹,但只有当我注释掉球的一个类别BitMask时,它们才会反弹。否则,它们会相
问题内容: 我看到在XCode 6中有一个内置的关卡编辑器。我找不到很多有关如何使用它或如何工作的文档,但是我能够弄清楚如何使用它制作SKSpriteNodes,然后使用childNodeWithName()将它们链接到.swift文件。当您创建一个新的SpriteKit项目时,它以GameScene.swift和GameScene.sks开始。我可以使用它们直观地创建一个关卡,然后可以在Game
问题内容: 我想在我的Swift应用程序中绘制折线。 SWIFT代码 错误: 我找不到解决方案。 问题答案: 首先 ,必须创建一个。 自iOS 7起已弃用,尽管您仍可以在Objective-C中使用它,但在Swift中不支持它。 其次 ,您必须在委托方法中创建并返回一个(不要将其传递给)。 在方法中,传递对象(而不是or )。 以解释传递给哪个对象与返回的对象之间的区别。) 因此,在该方法中,删除
问题内容: 有没有人设法使此功能在Swift中工作? 苹果文档:https : //developer.apple.com/library/prerelease/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventTapCreate 以下是CGEventTapC