CCActionEase想說愛你也不難(完)

2022-09-16 05:33:08 字數 2937 閱讀 1537

本文函式影象使用geogebra繪製,感謝它才華橫溢的作者。

那麼這個elastic是什麼呢?

維基百科上說,elastic是對彈性體或者可伸縮纖維的口語說法,或者是指小孩子玩的跳皮筋遊戲。

下面我們就研究一下這個elastic和皮筋有什麼關係。

要研究動作的行為,就離不開它的update函式。

1

void cceaseelasticin::update(cctime time)2 8

else

9

1415 m_pother->update(newt);

16 }

這是乙個分段函式,兩端的時間點被獨立出來了。先拋開這兩點不管,我們看主要的變換**。

首先看到:

time = time - 1;

這其實就是做了一次以x=0.5為軸的軸對稱。

為了方便我們將time - 1記作u,m_fperiod記作p,那麼變換公式如下:

u=t-1 t∈(0,1)

s(u)=-1*2^(10u)*sin((u-p/4)*2π/p) u∈(-1,0)

s(u)=-1*2^(10u)*sin(2πu/p-π/2) u∈(-1,0)

s(u)=2^(10u)*sin(π/2-2πu/p) u∈(-1,0)

s(u)=2^(10u)*cos(2πu/p) u∈(-1,0)

大家都知道余弦函式是以2π為週期的,這裡公式中有乙個除以p的操作,這說明cos(2πu/p)的週期為p。

又因為u∈(-1,0),1/1024<2^(10u)<1,這說明2^(10u)與cos(2πu/p)相乘最多影響函式曲線的幅度,絕不會改變原來的週期。

所以s(u)的函式週期就是p。

因為這是乙個分段函式,所以可能存在的最大問題就是,在實際運動過程中,精靈的動作可能不是連續的,即(0,0)和(1,1)兩點不在函式曲線上。所以如果你希望讓精靈完美地運動,你就需要小心地選取這個週期引數。

如何選取週期引數呢?

假設我們有這樣乙個函式:

f(u)=cos(2πu/p)

我們希望它能滿足以下條件:

也就是說,我們希望點(0,f(0))落在圖中點a的位置,而點(1,f(1))落在圖中點b、c、d、e、f這樣的位置上。

條件一是時刻滿足的,我們只要針對條件二來確定p就可以了。於是我們得出等式:

2π/p=π/2+n*π n≥0

p=4/(2*n+1) n≥0

於是我們可以得出,比較合適的p的取值有:4、4/3、4/5、4/7。。。

我們選取p=4/7,繪出完整函式影象,看看是什麼樣子的。

這是一條振盪曲線,或者叫做波動曲線,它描述的是精靈運動的幅度。

用什麼來形容這個動作呢?我也說不好。**監測儀上的那支筆?也許吧。

1

void cceaseelasticout::update(cctime time)2 8

else

9

1314 m_pother->update(newt);

15 }

將cceaseelasticin的影象按照點(0.5,0.5)中心對稱映象,得到的就是cceaseelasticout的影象。

但是,如果你直接將中心對稱公式套入cceaseelasticin的函式中,推導出的並不是上面cceaseelasticout使用的計算公式。不過不用特別擔心,如果再考慮上正弦函式的性質,你會發現他們是相等的。

這是最後乙個ccactionease類動作,勝利在望,加把勁。

1

void cceaseelasticinout::update(cctime time)2 8

else

9

1516 cctime s = m_fperiod / 4;

1718 time = time - 1;

19if (time < 0)

20

23else

24

27 }

2829 m_pother->update(newt);

30 }

在這段**中,首先將time擴大一倍,然後在減去一,也就是將時間分成了前後兩段。

接著對前後兩段時間分別套用相應的公式,進行變換。

基本都挺正常的,除了下面這一段:

11

if (! m_fperiod)

12

這個週期引數百分之百會被賦值,而且正常人也不會傳入乙個零作週期。我實在是看不出來這段**有什麼用途,所以還得請高人賜教。

至此ccactionease類系的動作就都介紹完了。其中最頭痛的就是這個ease elastic類的動作,要把這類動作所做的運動描述清楚,感覺是挺費勁的。

最後,總結一下本節的重點:

1.如果fperiod的值越小,那麼精靈彈的次數就越多。

2.如果想要精靈完美運動,即起始點(0,0)、結束點(1,1)以及連線點(0.5,0.5)都在函式曲線上,那麼fperiod的值應該符合下面的公式:

fperiod=4/(2*n+1) n≥0

3.在邏輯上fperiod的值要大於零,在實際應用中還要受float型別精度的限制。

IT 想說愛你不容易

檢查了半天,也跟蹤了伺服器端的執行日誌,沒有發現什麼問題,重啟伺服器程序,繼續跟蹤排程程序和執行程序,依舊沒有看出什麼問題,後來根據日誌中的select語句又到資料庫裡面查了一下,嘿!居然沒有資料。估計是命令解析的時候出了錯誤,看來是程式問題了,在伺服器上找到執行程序的源程式,make clean ...

crontab,想說愛你不easy

跑自己主動化指令碼的機器連不上toastserver了,僅僅能自己寫個指令碼每天跑了。當然要放在crontab裡了。5 3 sh nosecron.sh 第二天過來一看結果,fail了大半。然後在log的最前面有一句 warning failed to execute tcpdump.check i...

ROR TDD,想說愛你不容易

tdd,也就是 test driven development 測試驅動開發,其實是一種開發方式的巨大提高。它 提出了一種新的開發方式 以測試為驅動。在此,我仍然想引用乙個曾經看過的thoughtworks的 乙個人的blog中的一句話 什麼是tdd?tdd就是把你的需求用測試給描述出來。這句話一下...