x简单的滚动数字表盘
首先在头文件中:
#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);