我一直在创建我自己非常简单的基于Breakout的测试游戏,同时学习SpriteKit(使用Ray Wenderlich等教授的iOS游戏)来看看我是否可以应用我学到的概念.我决定通过使用.sks文件来创建精灵节点并用物理主体替换我的手动边界检查和碰撞来简化我的代码.
然而,只要它以陡峭的角度与它们碰撞,我的球就会保持平行于墙壁/其他矩形(例如,只是向上和向下滑动).这是相关的代码 - 我已将物理主体属性移动到代码中以使它们更加可见:
import SpriteKit
struct PhysicsCategory {
static let None: UInt32 = 0 // 0
static let Edge: UInt32 = 0b1 // 1
static let Paddle: UInt32 = 0b10 // 2
static let Ball: UInt32 = 0b100 // 4
}
var paddle: SKSpriteNode!
var ball: SKSpriteNode!
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
physicsWorld.gravity = CGVector.zeroVector
let edge = SKNode()
edge.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame)
edge.physicsBody!.usesPreciseCollisionDetection = true
edge.physicsBody!.categoryBitMask = PhysicsCategory.Edge
edge.physicsBody!.friction = 0
edge.physicsBody!.restitution …Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用Audio Units的应用程序,虽然Objective-C中有很多代码示例(包括Apple自己的aurioTouch等),但我试图在Swift中编写整个代码.
我已经能够设置我的AUGraph并通过它运行一些音频,但我似乎无法弄清楚渲染回调的语法.我尝试了几种方法:
方法1:直接创建AURenderCallback
let render : AURenderCallback = { (
inRefCon: UnsafeMutablePointer<Void>,
ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus in
return noErr
}
Run Code Online (Sandbox Code Playgroud)
因为我只是想让它工作,所以除了在此时返回noErr之外我在这个回调中什么都不做.但是,编译器返回以下错误:
(UnsafeMutablePointer,UnsafeMutablePointer,UnsafePointer,UInt32,UInt32,UnsafeMutablePointer) - > OSStatus'无法转换为'AURenderCallback
文档中AURenderCallback的定义如下:
typealias AURenderCallback = (UnsafeMutablePointer<Void>,UnsafeMutablePointer<AudioUnitRenderActionFlags>,UnsafePointer<AudioTimeStamp>, UInt32, UInt32,UnsafeMutablePointer<AudioBufferList>) -> OSStatus
Run Code Online (Sandbox Code Playgroud)
它似乎与我输入的相同,尽管可能是我不明白文档要求的内容.
方法2:创建表示AURenderCallback的函数
func render(
inRefCon: UnsafeMutablePointer<Void>,
ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus {
return noErr
}
Run Code Online (Sandbox Code Playgroud)
这不会将任何错误作为函数提供,但是当我将它放入inputProc参数中的AURenderCallbackStruct时,我收到一个错误:
找不到类型'AURenderCallbackStruct'的初始值设定项,它接受类型'的参数列表'(inputProc:(UnsafeMutablePointer,UnsafeMutablePointer,UnsafePointer,UInt32,UInt32,UnsafeMutablePointer) - > OSStatus,inputProcRefCon:nil)
我没有找到很多在Swift中创建AURenderCallbacks的例子,与Objective-C相比,语法似乎有很大差异.任何帮助,将不胜感激.