|
具體項(xiàng)目中,其實(shí)可以用擴(kuò)展Sprite類并建立setter和getter來實(shí)現(xiàn),不再贅述了。
一個(gè)頭痛了幾天的bug終于fixed……我真的是太遲鈍了。
最近,遇到這樣一個(gè)案例,需要以非常緩慢的速度移動(dòng)某幾個(gè)物體,而且,這些物體之間還會(huì)發(fā)生“無損彈性碰撞”(修正主義萬惡的高中課本翻譯的是“完全彈性碰撞”,我個(gè)人覺得Perfect Collision應(yīng)該為“無損”更易理解吧?)
總之,這些物體的速度(即位移增量)可能灰;页P P〉绞裁闯潭饶?這么說吧,由于所有的值都是根據(jù)動(dòng)量守恒定律和能量守恒定律(還記得這倆公式的同學(xué)你們可以去解放美帝國(guó)主義了)算出來的,因?yàn)殡y免出現(xiàn)某一個(gè)物體從某一個(gè)角度撞擊另一個(gè)物體之后,兩者中某一物體的某一方向(x或者y)上的速度被“中和”掉了。
剛才提到,在計(jì)算機(jī)語(yǔ)言中,速度即位移增量。ActoinScript的寫法則是:
fuckCERNET.x += fuckCERNET.vx; //fuckCERNET is an instance of some dynamic class當(dāng)fuckCERNET.vx < 1/20時(shí),F(xiàn)lash則不再渲染。這是根據(jù)FlashPlayer萬惡的內(nèi)部機(jī)制來實(shí)現(xiàn)的。根據(jù)我和一些美帝國(guó)主義的Flasher討論,發(fā)現(xiàn),F(xiàn)lashPlayer對(duì)物體x、y屬性是有保護(hù)的:
Implementation
public function get x():Number
public function set x(value:Number):void為什么要有這個(gè)保護(hù)呢,也不難理解:肯定是因?yàn)槟阒苯幼屢粋(gè)物體移動(dòng)到0.001的位置上后計(jì)算機(jī)(FlashPlayer)不知道怎么去顯示它:計(jì)算機(jī)是根據(jù)像素組成的,例如我們通常所說的1024×768:即便你的影片再高清再無碼,你放到80×60的顯示器上還是只能顯示4800個(gè)點(diǎn)。
雖然“萬惡”,但不得不承認(rèn)FlashPlayer很聰明地回避了這樣的問題,甚至,很優(yōu)雅地通過一個(gè)setter來解決了問題,我們可以想象這個(gè)setter可能會(huì)是:
public function set x(value:Number):void {
if (value < 0.05) value = 0;
// blah .. blah
}好的,知道這個(gè)之后,就好辦了。每次速度改變(即碰撞的時(shí)候)做一次“最低值判斷”:當(dāng)速度標(biāo)量(即不考慮方向)不為0(實(shí)際上這種情況很。┑∮0.05時(shí),讓速度等于0.05就好,可以用我寫的這個(gè)函數(shù)來修正:
private function fixDecimalFractionPosition(value:Number):Number {
if (Math.abs(value) < .05) {
return (value > 0) ? .05 : -.05;
}
return value;
}
Still looking for something? |
|
【收藏】【打印】【進(jìn)入論壇】 |
|
|
|
|
|
|
|