我习惯于创造这样的声音:
NSString *explosionsoundpath = [[NSBundle mainBundle] pathForResource:@"explosion" ofType:@"caf"];
CFURLRef explosionurl = (CFURLRef ) [NSURL fileURLWithPath:explosionsoundpath];
AudioServicesCreateSystemSoundID (explosionurl, &explosion1a);
AudioServicesCreateSystemSoundID (explosionurl, &explosion1b);
其中explosion1a和explosion1b是.h文件中声明的实例变量:
SystemSoundID explosion1a;
每当我尝试在像这样的数组中进行此过程时
NSString *plasmasoundpath = [[NSBundle mainBundle] pathForResource:@"plasmasound" ofType:@"caf"];
CFURLRef plasmaurl = (CFURLRef ) [NSURL fileURLWithPath:plasmasoundpath];
SystemSoundID plasmalaunch1;
AudioServicesCreateSystemSoundID (plasmaurl, &plasmalaunch1);
[self.plasmasounds addObject:plasmalaunch1];
我收到警告:
"Passing argument 1 of addObject makes pointer from integer without a cast.
如果我把&在addObject参数中,plasmalaunch1之前的符号我得到了一个
incompatible pointer type warning.
我正在尝试创建一个声音效果数组,我稍后可以通过调用它来播放:
SystemSoundID sound = [self.plasmasounds objectAtIndex:i];
AudioServicesPlaySystemSound(sound);
关于如何使这项工作(或更好的方法来解决这个问题)的建议表示赞赏!
答案 0 :(得分:2)
SystemSoundID是一个整数值,而不是一个对象;并且指向数字的指针不是指向对象的指针。
您可以先将数值封装在对象中,然后再将其存储在NSArray中,然后再从对象中删除ID号以播放声音。或者您可以将整数值存储在C数组中而不是NSArray中。
答案 1 :(得分:1)
这是旧的,但仍然相关。最好的解决方案是使用带有SystemSoundID参数的构造函数创建一个类。这允许最大的灵活性。现在您有一个可以轻松添加到NSArray或任何其他集合类的对象。
#import <Foundation/Foundation.h>
@import AudioToolbox;
@interface SATSound : NSObject
@property (nonatomic)SystemSoundID id;
- (id)initWithSoundID:(SystemSoundID)id;
@end
/////
#import "SATSound.h"
@implementation SATSound
- (id)initWithSoundID:(SystemSoundID)id
{
if (self = [super init]) {
_id = id;
}
return self;
}
只需实例化此类,将其传递给SystemSoundID,将对象/实例添加到数组中,然后您可以轻松地提取值,而不必担心类型转换。您还可以添加可能派上用场的任何其他属性,例如声音文件的名称。