转自:http://www.52php.cn/article/p-kcfuncvt-bcy.html
本篇介绍的是用ClippingNode 做游戏的新手引导,额,或者说是做新手引导的一种可尝试的方式。 ClippingNode的解释,我盗用Jacky的话来说就是: CCClipingNode是一个可裁剪节点,简单理解: (1)首先它是一个节点,继承于CCNode,所以它可以像普通节点一样放入CCLayer,CCScene,CCNode中。 (2)作为节点,它就可以用作容器,承载其他节点和精灵。我把它叫底板。 (3)如果想要对一个节点进行裁剪,那需要给出裁剪的部分,这个裁剪区域,我把它叫模版。 所以CCClipingNode裁剪节点在组成上=底板+模版,而在显示上=底板-模版。不知道这样解释会不会好理解一点。
具体的用法,请看大屏幕:
1、假如游戏的开始,游戏界面就只有一个button,点击它可以显示出“Welcome to star blog!”,代码实现如下:
- SizevisibleSize=Director::getInstance()->getVisibleSize();
- Pointorigin=Director::getInstance()->getVisibleOrigin();
-
- autocloseItem=MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
-
- closeItem->setPosition(Point(160,400));
- closeItem->setTag(99);
- automenu=Menu::create(closeItem,NULL);
- menu->setPosition(Point::ZERO);
- menu->setTag(99);
- this->addChild(menu,2);
-
- voidHelloWorld::menuCloseCallback(Object*pSender)
- {
- auto_lable=LabelTTF::create("Welcometostarblog!","Arial",25);
- _lable->setPosition(Point(160,300));
- this->addChild(_lable,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> }
效果如图所示:
2、然后添加ClippingNode:
autoclip=ClippingNode::create();
- clip->setInverted(true);
- clip->setAlphaThreshold(0.0f);
- this->addChild(clip,10);
- autolayerColor=LayerColor::create(Color4B(0,150));
- clip->addChild(layerColor,1);
-
- autonodef=Node::create();
- autoclose=Sprite::create("CloseSelected.png");
- nodef->addChild(close);
- nodef->setPosition(Point(160,400));
- clip->setStencil(nodef);
clippingNode的用法注释已经写得很清楚啦,我就不再一一解释
。使用clippingNode后,效果如图所示,我特意添加了一个用close图标做的精灵,方便对比。
3、这个时候,场景中的close按钮是高亮的,点击close按钮也是可以响应的,但是假设我界面上有许多按钮,它们也都是可以响应,如果我只想让玩家点击close按钮,其他按钮不能用,那该怎么做?(总有那么些”调皮“的玩家不按常理出牌)。方法很简单,就是添加一个覆盖整个屏幕的空白按钮。
autoblackItem=MenuItem::create();
- blackItem->setPosition(visibleSize.width/2,visibleSize.height/2);
- blackItem->setContentSize(visibleSize);
- autoblackMenu=Menu::create(blackItem,NULL);
- blackMenu->setPosition(Point::ZERO);
- blackMenu->setAnchorPoint(Point::ZERO);
- this->addChild(blackMenu,100);
这样点击按钮就无法响应了,因为在按钮上还覆盖着一个霸道的空白按钮。可是...现在连close 按钮都点击不了。怎么就这么麻烦?还能不能一起快乐的玩耍了?!看来只能出大招了,把触摸监听事件扯出来。我在场景的最上方添加一个layer(注意是最上方,如果是在空白按钮的下面,那么就触摸不到layer了),当玩家手指触摸到屏幕,我通过判断触摸的位置判断是否在close 按钮上,如果是的话,手动的响应close 按钮。
autolisten_layer=Layer::create();
- this->addChild(listen_layer,200);
- autolistener=EventListenerTouchOneByOne::create();
- listener->onTouchBegan=CC_CALLBACK_2(HelloWorld::onTouchBegan,153); background-color:inherit; font-weight:bold">this);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,listen_layer);
- boolHelloWorld::onTouchBegan(Touch*touch,Event*event)
- {
- autopoint=Director::getInstance()->convertToGL(touch->getLocationInView());
- autorect=Rect(160-30,400-30,60,60);
- if(rect.containsPoint(point))
- automenu=(Menu*)this->getChildByTag(99);
- autoitem=(MenuItem*)menu->getChildByTag(99);
- item->activate();
- }
- returntrue;
- }
恩,这样就可以了。
过程写的略显繁琐,大家可以根据自己的需要删减删减. 尊重原创,转载请注明来自star特530:http://blog.csdn.net/start530/article/details/20851263 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|