0

我正在实现一个装饰器模式,用于将选定/未选定的事件添加到CCMenuItem继承者:

  public class MenuItemDecorator : CCMenuItem
  {
    public event EventHandler OnSelected;
    public event EventHandler OnUnselected;
    private readonly CCMenuItem _menuItem;

    public MenuItemDecorator(CCMenuItem menuItem) //set a decorated item
    {
      menuItem.ThrowIfNull("menuItem");

      _menuItem = menuItem;
      AddChild(_menuItem);
    }

    public override void Selected()
    {
      base.Selected();
      _menuItem.Selected();

      if(OnSelected != null)
        OnSelected(this, null);
    }

    public override void Unselected()
    {
      base.Unselected();
      _menuItem.Unselected();

      if(OnUnselected != null)
        OnUnselected(this, null);
    }
  }

然后我“装饰”我的物品:

...
var soundToggle = MenuItemToggleBuilder.New(soundOffBtn, soundOnBtn)
                                       .SetPosition(positionX, positionY)
                                       .SetTarget(ToggleSelector)
                                       .Build();

var decorToggle = new MenuItemDecorator(soundToggle);
decorToggle.SetTarget(Selector); // for debugging
decorToggle.OnSelected += (s, e) => toggleWafer.Scale = 0.95f;
decorToggle.OnUnselected += (s, e) => toggleWafer.Scale = 1f;

LayerMenu.AddChild(soundToggle, int.MaxValue); //LayerMenu is CCMenu
...

private void Selector(object o)
{//breakpoint is here
}
...

但是当我启动应用程序并单击我的decorToggle时,它没有响应。此外,它不会进入我的Selector方法(我设置断点的地方)。

那么我做错了什么?可以变得更容易吗?提前致谢


谢谢你,@LearnCocos2D。但是为什么调试器不会在Selector方法的断点处停止呢?

还有问题的第二部分呢?我可以在没有从具体继承者继承的情况下向继承者上的Selected/Unselected事件添加自定义行为(对不起双关语)并覆盖方法吗?CCMenuItemCCMenuItemSelected/Unselected

ie CCMenuItemImageWithExtendedSelect,等CCMenuItemLabelWithExtendedSelectCCMenuItemToggleWithExtendedSelect并且这些类中的每一个都只是覆盖Selected/Unselected方法(如在 my 中MenuItemDecorator

4

1 回答 1

0

如果 CCMenu 具有与 cocos2d-iphone 中相同的行为,这是可以安全假设的,那么 CCMenuItem 是不可堆叠的。您不能将 CCMenuItem 作为另一个菜单项的子项,并且两者都对触摸做出正确反应。

于 2013-09-21T19:26:44.953 回答