转载:http://blog.csdn.net/qq_17749439/article/details/37925051
简单的滚动数字表盘
首先在头文件中:
- #include <iostream>
- #include "cocos2d.h"
- USING_NS_CC;
- class NumberScroll:public CCNode
- {
- // 可见的节点数字
- CCNode *visibleNode;
- public:
- // 函数初始化
- virtual bool init();
- // 重载CCNode函数实现opengl遮罩
- virtual void visit();
- CREATE_FUNC(NumberScroll);
- // 设置滚动到哪个数字
- void setNumber(int var);
- };
- #include "Number.h"
- bool NumberScroll::init()
- {
- if ( !CCNode::init() )
- {
- return false;
- }
- visibleNode=CCNode::create();
- // 创建0-9的数字
- for(int i=0;i<10;i++){
- char str[2];
- str[0] = '0' + i;
- str[1] = '\0';
- CCLabelTTF* single = CCLabelTTF::create(str, "", 27);
- single->setTag(i);
- single->setAnchorPoint(ccp(0, 0));
- single->setPosition(ccp(0, 27 * i));
- // 将数字加入visibleNode节点中
- visibleNode->addChild(single);
- }
- this->addChild(visibleNode);
- return true;
- }
- void NumberScroll::visit() {
- // 启动遮罩效果
- glEnable(GL_SCISSOR_TEST);
- CCPoint pos = CCPointZero;
- // 获取visibleNode节点屏幕绝对位置
- pos = visibleNode->getParent()->convertToWorldSpace(pos);
- CCRect rect = CCRectMake(pos.x, pos.y, 27, 27);
- // 设置遮罩效果
- glScissor(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
- CCNode::visit();
- // 关闭遮罩效果
- glDisable(GL_SCISSOR_TEST);
- }
- void NumberScroll::setNumber(int var)
- {
- // 停止本节点的所有动作
- this->stopAllActions();
- // 移动到到节点坐标
- CCPoint moveToPosition = ccp(visibleNode->getPosition().x,-var*27);
- // 创建动作移动到该节点
- CCMoveTo* moveAction = CCMoveTo::create(var *1.0, moveToPosition);
- // 运行该动作
- visibleNode->runAction(moveAction);
- }
- //获取可视区域大小
- CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
- //获取可视区域左下角坐标
- CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
- // 创建滚动数字表盘节点
- NumberScroll *scroll=NumberScroll::create();
- // 设置坐标
- scroll->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y+200));
- // 添加节点到场景中
- this->addChild(scroll);
- // 设置滚动到数字2
- scroll->setNumber(2);