Cocos2d-x 水果忍者划痕效果
2014-04-21 11:47
197 查看
网上找的一个关于水果忍者划痕的,效果还算凑合。其原理就是基于OpenGL绘制直线,由于版本过老,此处笔者修改了一些方法,粘贴后可直接使用
适用于Cocos2d-x 2.2.1
.h文件中需要加入的代码:
void draw();
void drawLine();
virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent);
std::list<CCPoint> pointList;
.cpp文件中
void HelloWorld::draw()
{
drawLine();
}
void HelloWorld::drawLine()
{
int tickSubCount = 10;
int pointListKeepCount = 500;
for (int i=0; i<tickSubCount ; i++)
{
if (pointList.size() >0)
{
pointList.pop_front();
}
else
{
break;
}
}
while (pointList.size() > pointListKeepCount)
{
pointList.pop_front();
}
float max_lineWidth = 5;
float min_lineWidth = 1;
int alpha_min = 10;
int alpha_max = 200;
int R = arc4random()%255;
int G = arc4random()%255;
int B = arc4random()%255;
int pointListCount = pointList.size();
std::list <CCPoint>::iterator it =pointList.begin();
float pointIndex = 0;
for(;it!=pointList.end();it++)
{
int distanceToMiddle = fabs(pointIndex-pointListCount/2);
float percent = 1.0-(float)distanceToMiddle/(float)(pointListCount/2.0);
float lintWidth = min_lineWidth + max_lineWidth*percent;
int alpha = alpha_min +alpha_max*percent;
ccc4(R,G,B,alpha );
ccPointSize(lintWidth);
ccDrawPoint( *it );
pointIndex++;
}
}
void HelloWorld::ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)*it;
CCPoint beginPoint = touch->getLocationInView();
beginPoint = CCDirector::sharedDirector()->convertToGL(beginPoint);
pointList.push_back(beginPoint);
}
void HelloWorld::ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)*it;
CCPoint nextPoint = touch->getLocationInView( );
nextPoint = CCDirector::sharedDirector()->convertToGL(nextPoint);
CCPoint preMovePoint = touch->getPreviousLocationInView();
preMovePoint = CCDirector::sharedDirector()->convertToGL(preMovePoint);
float distance = ccpDistance(nextPoint, preMovePoint);
if (distance > 1)
{
int d = (int)distance;
for (int i =0; i < d; i++ )
{
float distanceX = nextPoint.x - preMovePoint.x;
float distanceY = nextPoint.y - preMovePoint.y;
float percent = i / distance;
CCPoint newPoint;
newPoint.x = preMovePoint.x + (distanceX * percent);
newPoint.y = preMovePoint.y + (distanceY * percent);
pointList.push_back(newPoint);
}
}
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent)
{
pointList.clear();
}
适用于Cocos2d-x 2.2.1
.h文件中需要加入的代码:
void draw();
void drawLine();
virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent);
std::list<CCPoint> pointList;
.cpp文件中
void HelloWorld::draw()
{
drawLine();
}
void HelloWorld::drawLine()
{
int tickSubCount = 10;
int pointListKeepCount = 500;
for (int i=0; i<tickSubCount ; i++)
{
if (pointList.size() >0)
{
pointList.pop_front();
}
else
{
break;
}
}
while (pointList.size() > pointListKeepCount)
{
pointList.pop_front();
}
float max_lineWidth = 5;
float min_lineWidth = 1;
int alpha_min = 10;
int alpha_max = 200;
int R = arc4random()%255;
int G = arc4random()%255;
int B = arc4random()%255;
int pointListCount = pointList.size();
std::list <CCPoint>::iterator it =pointList.begin();
float pointIndex = 0;
for(;it!=pointList.end();it++)
{
int distanceToMiddle = fabs(pointIndex-pointListCount/2);
float percent = 1.0-(float)distanceToMiddle/(float)(pointListCount/2.0);
float lintWidth = min_lineWidth + max_lineWidth*percent;
int alpha = alpha_min +alpha_max*percent;
ccc4(R,G,B,alpha );
ccPointSize(lintWidth);
ccDrawPoint( *it );
pointIndex++;
}
}
void HelloWorld::ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)*it;
CCPoint beginPoint = touch->getLocationInView();
beginPoint = CCDirector::sharedDirector()->convertToGL(beginPoint);
pointList.push_back(beginPoint);
}
void HelloWorld::ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)*it;
CCPoint nextPoint = touch->getLocationInView( );
nextPoint = CCDirector::sharedDirector()->convertToGL(nextPoint);
CCPoint preMovePoint = touch->getPreviousLocationInView();
preMovePoint = CCDirector::sharedDirector()->convertToGL(preMovePoint);
float distance = ccpDistance(nextPoint, preMovePoint);
if (distance > 1)
{
int d = (int)distance;
for (int i =0; i < d; i++ )
{
float distanceX = nextPoint.x - preMovePoint.x;
float distanceY = nextPoint.y - preMovePoint.y;
float percent = i / distance;
CCPoint newPoint;
newPoint.x = preMovePoint.x + (distanceX * percent);
newPoint.y = preMovePoint.y + (distanceY * percent);
pointList.push_back(newPoint);
}
}
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent)
{
pointList.clear();
}
相关文章推荐
- Cocos2d-x 水果忍者划痕效果
- Cocos2d-x 水果忍者划痕效果
- 水果忍者划痕效果
- COCOS2D-X 抖动效果 CCShake
- cocos2d-x初探学习笔记(11)--拖动间隐效果
- cocos2d-x游戏开发(十二)场景切换:滑门效果
- Cocos2d-x 3.2编写常用UI组件(三)收集器效果Collector
- Cocos2d下实现UIScrollView/UIPageController效果
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果
- 【Cocos2d-x游戏引擎开发笔记(9)】实现DotA的技能冷却效果(转)
- cocos2d-x 之 场景间切换效果
- cocos2d-x 利用CCLabelTTF制作文字描边与阴影效果的实现方法
- cocos2d-iphone粒子效果
- cocos2d-x提供的场景切换效果
- cocos2d-x场景切换与过渡效果
- Cocos2D结合CoreGraphics实现RPG人物中空黑洞吸入效果
- cocos2d 制作动态光晕效果基础 —— blendFunc
- cocos2d-x for wp之EaseActions——运动加速效果
- Cocos2d-x之CCScene场景切换效果的使用
- cocos2d-x粒子效果plist文件编写教程