0

私はこのような音を作ることに慣れています:

NSString *explosionsoundpath = [[NSBundle mainBundle] pathForResource:@"explosion" ofType:@"caf"];
CFURLRef explosionurl = (CFURLRef ) [NSURL fileURLWithPath:explosionsoundpath];
AudioServicesCreateSystemSoundID (explosionurl, &explosion1a);
AudioServicesCreateSystemSoundID (explosionurl, &explosion1b);  

爆発1aと爆発1bは、.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);

これを機能させる方法 (またはこの問題を解決するためのより良い方法) に関するアドバイスをいただければ幸いです。

4

2 に答える 2

2

SystemSoundID はオブジェクトではなく整数値です。数値へのポインターはオブジェクトへのポインターではありません。

数値をオブジェクトにカプセル化してから NSArray に格納し、後でオブジェクトから ID 番号を削除してサウンドを再生することができます。または、整数値を NSArray の代わりに C 配列に格納することもできます。

于 2010-08-29T01:24:05.197 に答える
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 を渡し、オブジェクト/インスタンスを配列に追加するだけで、値を簡単に取り出すことができ、型変換について心配する必要はありません。サウンド ファイルの名前など、便利なその他のプロパティを追加することもできます。

于 2014-11-02T16:01:50.130 に答える