1

次のように、2つのCCMenuItemImageオブジェクトをCCMenuItemToggleに追加しています。

CCMenuItemImage *soundEnabled = [CCMenuItemImage itemWithNormalImage:@"button_sound_enabled.png"
                                                       selectedImage:@"button_sound_enabled.png"];
soundEnabled.tag = kSoundEnabled;

CCMenuItemImage *soundDisabled = [CCMenuItemImage itemWithNormalImage:@"button_sound_disabled.png"
                                                        selectedImage:@"button_sound_disabled.png"];
soundDisabled .tag = kSoundDisabled;

CCMenuItemToggle *sound = [CCMenuItemToggle itemWithItems:[NSArray arrayWithObjects:soundEnabled,soundDisabled,nil] block:^(id sender) {
  CCMenuItem *item= ((CCMenuItemToggle*).sender).selectedItem;
  CCLog(@"item tag: %d",item.tag);
}];

kSoundEnabledkSoundDisabledは値2と3の列挙アイテムです。作成後に各CCMenuItemImageのタグをログに記録すると、すべて問題ありません。しかし、それらをブロック内に記録すると、タグは-1061138431として表示されます。

また、ブロックの外でそれらをログに記録しようとすると、レイヤーのinitコードのさらに下で、それらが間違って表示され始めます。

誰かがここで問題が何であるか知っていますか?これはKobold2dARC対応プロジェクトですが、ここでARCが問題になる可能性がありますか?これはNSIntegerのような単純なデータ型を考慮しないと思いましたか?

確認するだけでいいのですが、ここで何が問題なのsender.selectedIndex = 0sender.selectedIndex = 1を理解したいと思います。

4

1 に答える 1

3

この問題は、ARC構成などに起因するものではありません。Cocos2D 2.0でテストしましたが、同じ問題が発生します。ソースを確認しましたが、問題はCCMenuItemToggleにあります。これは、現在の表示項目を追跡するために子のタグを変更します。

次のように、変数の参照をブロックに使用する必要があります。

CCMenuItemToggle *sound = [CCMenuItemToggle itemWithItems:[NSArray arrayWithObjects:soundEnabled,soundDisabled,nil] block:^(id sender)
{
  CCMenuItem *item= ((CCMenuItemToggle*).sender).selectedItem;
  if (item == soundEnabled)
  {
     //...
  } else
  {
     //...
  }
}];
于 2012-07-26T09:04:13.123 に答える