[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-01-04 标题通过随机数实现一个简单的闪电效果分类编程 / 数据结构与算法 / C C 标签opengl·随机数·cocos2dx通过随机数实现一个简单的闪电效果最近需要使用【 opengl 】绘制一个闪电效果在网上翻了好多资料最后在一个网站上找到了一个比较好的样子参考了它的思路。参考网站链接【 http://krazydad.com/bestiary/bestiary_lightning.html 】。由于链接中的实现方式采用递归当点数很多的时候很容易出现堆栈溢出的问题这里作者修改成了for循环。下面作者备份下代码比较简单的一个实现采用cococs2d-x1首先定义两个类一个是闪电中的单独线段类一个是整条闪电类classSegmentNode:publiccocos2d::CCObject{public:cocos2d::CCPoint start;cocos2d::CCPoint end;floatoffset;};classThunderNode:publiccocos2d::CCObject{public:ThunderNode(){_pSegmentNodeArraynewcocos2d::CCArray;lineWidth1;}cocos2d::CCArray*_pSegmentNodeArray;intlineWidth;intcolor[4];voidsetColor(intr,intg,intb,inta){color[0]r;color[1]g;color[2]b;color[3]a;}~ThunderNode(){if(_pSegmentNodeArray){_pSegmentNodeArray-release();_pSegmentNodeArrayNULL;}}};2定义随机数方法并通过随机数来对Y轴坐标进行随机设置#defineMY_RAND((rand()%100-50)/50.0f)voidThunderLayer::internelGenerateThunderNode(ThunderNode*_pThunderNode,floatx1,floatx2,floaty,floatqiangdu,floatoffset,floatjiange){floatpos_x_lastx1;floatpos_y_lasty;for(floatpos_xx1jiange;pos_xx2;pos_xjiange){floatpos_yyMY_RAND*qiangdu;SegmentNode*pnnewSegmentNode;pn-startccp(pos_x_last,pos_y_last);pn-endccp(pos_x,pos_y);pn-offsetMY_RAND*offset;_pThunderNode-_pSegmentNodeArray-addObject(pn);pos_x_lastpos_x;pos_y_lastpos_y;}}3调用随机数方法来生成闪电数据voidThunderLayer::generateThunderNodes(floatdt){while(_pThunderNodeArray-count()0){CCObject*obj_pThunderNodeArray-lastObject();_pThunderNodeArray-removeLastObject(false);obj-release();objNULL;}ThunderNode*_pThunderNodeNULL;for(inttimes5;times0;times--){_pThunderNodenewThunderNode();_pThunderNode-lineWidth2MY_RAND*1;_pThunderNode-setColor(128MY_RAND*127,128MY_RAND*127,128MY_RAND*127,255);internelGenerateThunderNode(_pThunderNode,10,300,100MY_RAND*3,8,10,10);_pThunderNodeArray-addObject(_pThunderNode);}}4在draw函数中绘制voidThunderLayer::draw(){CHECK_GL_ERROR_DEBUG();CCObject*_pPointNodesObjNULL;CCARRAY_FOREACH(_pThunderNodeArray,_pPointNodesObj){ThunderNode*_pThunderNode(ThunderNode*)_pPointNodesObj;CCObject*pnObjNULL;ccDrawColor4B(_pThunderNode-color[0],_pThunderNode-color[1],_pThunderNode-color[2],_pThunderNode-color[3]);glLineWidth(_pThunderNode-lineWidth);CCARRAY_FOREACH(_pThunderNode-_pSegmentNodeArray,pnObj){SegmentNode*pndynamic_castSegmentNode*(pnObj);ccDrawLine(pn-start,pn-end);}}}5通过不停的调用【 generateThunderNodes 】方法来刷新闪电的数据this-schedule(schedule_selector(GameOverLayer::generateThunderNodes),1.0f);