打算把自己碰到的各种坑纪录下来。一则以便将来忆苦思甜(哈哈),二则也希望能帮助到那些同样在坑里摸爬滚打的朋友们。
auto home=Label::createWithTTF("home","fonts/arial.ttf",40); home->setPosition(origin.x+visibleSize.width*0.11,origin.y+bgheight*0.03); auto homeItem=MenuItemLabel::create(home,[=](Ref*pSender){log("response");}); auto menu = Menu::create(homeItem,NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu);
看起来是不是无懈可击呀。确实,编译和运行都没有问题。只是按下home菜单项毫无反应。为了挖出这个坑,着实花了不少功夫,刚开始还怀疑是自己的引擎版本有问题。后来经过和示例代码的反复对照,终于发现问题出在第一个setPosition上。一旦对Label直接调用setPosition,这个Label就死了(为什么会死呢?尚未搞明白,还望各位网友赐教)。所以解决方法就是改成对MenuItemLabel调用setPosition。同样的,对精灵菜单项MenuItemSprite这个问题也存在。
这里还要顺便提一下菜单的坐标系统。它有点变态,跟其他节点的坐标系统不太一样。对于一般的节点,子节点的默认锚点是中心,默认坐标(即原点)在父节点的左下角。但是,菜单项MenuItem的默认锚点是中心,默认坐标在父节点(即菜单Menu)的左下角。而菜单Menu的默认锚点是左下角,默认坐标在父节点的中心。正好反过来。(其实还可以这样认为:菜单项MenuItem的默认锚点是中心,默认坐标在菜单Menu的中心,而菜单Menu的锚点是中心,默认坐标是父节点的中心。)之所以如此设置,大概是为了在默认情况下,菜单项可以显示在屏幕的中心吧。否则就要跑到屏幕外面去了。