2017-04-13 33 views
0

我正在尝试创建类似于Reactable的应用程序。AudioKit中对象的动态命名(SpriteKit)

用户可以将“模块”(如振荡器或滤波器)从菜单拖入“播放区域”,模块将被激活。

我正在考虑初始化模块,因为它们与“play area”背景对象相交。然而,这需要我自动命名模块,即:

let osci = AKOscillator() 

其中OSCI会自动计数为:

let osci1 = AKOscillator() 
let osci2 = AKOscillator() 
... 

我如何能做到这一点?

感谢

编辑:我试图通过创建

var osciArray = [AKOscillator]() 

,并在我的功能阵列来使用数组来添加一个振荡器,这是我的代码:

let oscis = AKOscillator() 
    osciArray.append(oscis) 
    osciArray[oscCounter].frequency = freqValue 
    osciArray[oscCounter].amplitude = 0.5 
    osciArray[oscCounter].start() 
    selectedNode.userData = ["counter": oscCounter] 
    oscCounter += 1 
    currentOutput = osciArray[oscCounter] 
    AudioKit.output = currentOutput 
    AudioKit.start() 

我的应用程序构建得很好,但是一旦应用程序开始在模拟器上运行,我会收到错误:致命错误:索引超出范围

+0

不为阵列或收集工作吗? – Valdmer

+0

我正在尝试一个基于这个[线程]的数组(http://stackoverflow.com/questions/27716931/create-a-variable-in-swift-with-dynamic-name)。 但是,我遇到麻烦,用数组更改AKOscillator函数的参数,如 'osci.frequency = 440'等 –

+0

什么类型的麻烦?你不介意通过添加一些代码来更新你的问题,你得到的错误,并解释为什么阵列不适合你? – Valdmer

回答

0

我还没有使用AudioKit,但前段时间我读过它,我对它有很大的兴趣。从我从文档中了解的情况来看,它的结构非常类似于SpriteKit:连接在一起的节点。

我想那时库中的大多数类都是从基类派生的,就像SpriteKit中的所有东西派生自SKNode类一样。

由于您通过SpriteKit节点将音频工具包节点与可视化表示链接在一起,为什么不直接从SKSpriteNode继承子类,并使用AudioKit的基类添加可选的audioNode属性?

这样你就可以使用SpriteKit直接与存储的音频节点属性进行交互。

+0

我想了解你的建议,你是否建议我创建一个基于AudioKit节点的SKSpriteNode的子类?即'类SKSpriteNode:AKOscillator {}'或类似的东西?我对于快速编程和新编程一般都很陌生,所以我仍然感到困惑。 如何从原始内置类访问SKSpriteNode属性? –

0

我想你的问题中有很多AudioKit相关的代码,但要回答这个问题,你只需要看看oscCounter。你不显示它的初始值,但我猜测它是零。然后将它加1并尝试访问只有一个元素的osciArray [oscCounter],以便通过osciArray [0]访问它。把柜台移下来,你会过得更好。此外,你的振荡器看起来像局部变量,所以一旦范围丢失,它们就会丢失。它们应该在你的类中声明为实例变量或者这是其中的一部分。