0

すぐに 2 回バグって申し訳ありませんが、人々は有益な回答でとても親切だったので、別の質問をしても害はないと思いました.

同じプログラムをかなりしゃれたものにして、限られたオプション画面につながるボタンをクリックできるメイン画面を持たせようとしました。これにより、音楽のオンとオフを切り替えることができます。または、少なくともそうすべきです。

音楽を実行するコードは、メイン ファイル (game.m) の次の場所にあります。

//Music
[Settings setMusicEnabled:YES];
music = [SPSound soundWithContentsOfFile:@"music.caf"];
channel = [[music createChannel] retain];
channel.loop = YES;
channel.volume = 0.25;
if([Settings musicEnabled]){
    [channel play];
}

おかしなフォーマットで申し訳ありませんが、Sparrow フレームワークです。基本的に、設定ファイルには、使用しようとしているクラス メソッドが含まれています。メソッドが YES の場合、音楽はオンになっています。いいえの場合、音楽はオフになっています。

settings.m

static BOOL isMusicEnabled;
@implementation Settings
+ (BOOL)musicEnabled
{
    return isMusicEnabled;
}
+ (void)setMusicEnabled:(BOOL)value
{
    isMusicEnabled = value;
    NSLog(@"SME? %i", isMusicEnabled);
}
@end

現在、オプション ファイルは機能しており、そのセクションをテストしました。プログラムは isMusicEnabled が新しい値を取得していることを読み取っているため、musicEnabled も変更されているため、変更が必要であり、音楽をオフにする必要があります。

しかし、何も起こりません。デバッガーを使用しようとしましたが、あまり得意ではなく、与えられた情報の多くを理解していません。問題が設定ファイルからメイン/ゲームファイルにメッセージを送信していることを理解しています.

これをどのように解決できるかについて私を啓発できる人の助けに感謝します。

4

1 に答える 1

0

私はSparrowFrameworkに精通していませんが、とにかく推測させてください。

[channel play];channelが再生を停止するように求められるまで、バックグラウンドで音楽の再生を開始します。

isMusicEnabledを変更しても、現在再生中の音楽を停止するコードはトリガーされません。[設定]で値を変更するときは、チャネルに停止するように通知する必要があります(おそらく、にアクセスしてchannelを呼び出すことによって) [channel stop]

別の問題があります-isMusicEnabledはメモリ内の単なる変数であり、プログラムは再起動の間にその状態を記憶しません。そして、設定は通常記憶されることになっています。

要約すると、2つの問題があります。最初に再起動の間に設定を保持することと、次に設定の変更について通知することです。設定を覚えておくために、NSUserDefaultsクラスを調べることをお勧めします。プレイを停止するように通知するchannelには、スキルに応じていくつかのオプションがあります。最も簡単なのは、内からチャネル変数にアクセスして、setMusicEnabledを呼び出すことstopです。別のオプションは通知を使用することですが、より複雑な初心者プログラマーの場合(興味がある場合はNSNotificationCenterを探してください)。

于 2010-09-23T18:27:03.860 に答える