最近有個小需求,需要實現水果忍者刀刃的效果,網上找了很多實例代碼,查了很多資料,終於搗鼓了出來。
效果圖如下:
圖1:
圖2:
該算法還是比較簡單的,先說說流程:
【收集軌跡點】主要是使用了cocos2dX中的ccTouchesBegan和ccTouchesMoved
ccTouchesBegan里面包含了刷新最近軌跡點的功能
ccTouchesMoved里面包含了添加軌跡點的功能
此時需要一個數組用於記錄軌跡的ccpoint,我將它命名為mPointArray,用於存儲這些軌跡點。每次手指按下時,就添加此時觸摸點的位置作為下次計算渲染的開始,那么就要將它設置到
mPointArray的最后一位。然后通過ccTouchesMoved獲取到相關的點,以此往前添加到mPointArray中。一般來說16個點就足夠了。
【計算軌跡點】這個是算法的核心部分(對照了相關的demo的代碼,發現類似做法,即構建多邊形),其實軌跡是遵循了這樣的形狀:
其中三角形ABC(F)並不是必須的,因為它是用於軌跡的頭部,作為一種修飾效果。重點還是A,C,D,E,F,G構成的四邊形,根據opengl頂點渲染規則,我們需要4個三角形,即12個頂點,因此可以將這些頂點分割,注意,這個多邊形是對稱的,因此算法不會太復雜。
這些頂點可以被分割成中間頂點數組,頂部頂點數組以及底部頂點數組,核心的算法如下
CCPoint* p=mPointArray;
//中間頂點數組
CCPoint* centerVertex=new CCPoint[mIndex];
memcpy(centerVertex,p,sizeof(CCPoint)*mIndex);
//頂部頂點數組
CCPoint pt1=ccpSub(p[i],p[i-1]);
float angle1=ccpToAngle(pt1);
topVertex[count1].x =sinf(angle1) * w + p[i].x;
topVertex[count1].y =cosf(angle1) * w + p[i].y;
//底部頂點數組
CCPoint pt2=ccpSub(p[i],p[i-1]);
float angle2=ccpToAngle(pt2);
bottomVertex[count2].x =sinf(angle2) * w + p[i].x;
bottomVertex[count2].y =cosf(angle2) * -w + p[i].y;
然后在算法的尾部,需要對這些頂點進行排列(用於渲染三角形)和顏色填充。
另外需要知道的是opengl的渲染頂點的順序是逆時針,順時針順序是剔除。
渲染就很簡單了,都是固定的語法,所以就和源代碼一起放上吧。
http://pan.baidu.com/s/1mg1F9lY
密碼ozk7
-------------------------------------
更正一下,原來的效果發現缺少了一個三角形,估計是點的位置不正確造成的,回去看了一下,果然如此,因此重新放上代碼
http://pan.baidu.com/s/1jGrAvAm
密碼v21e
修正效果如下