2011-02-01 70 views
0

我想製作像魚池一樣的東西。 當沒有動作發生時,動畫魚會四處走動。當鼠標靠近時,它們離開鼠標。 我認爲它已經做了很多次,但我無法找到解釋這個問題的教程。 我在找一個教程 感謝魚在池中,當鼠標靠近時必須離開

回答

3

(這不是一個簡單的問題都沒有)

喜,

這種運動被稱爲植絨。有相當簡單的規則放在一起,你的將成爲自治。 boids的原始概念由Craig Reynolds發現,可在此處獲取:http://www.red3d.com/cwr/boids/

解釋和actionscript中的實現由Keith Peters在他的書AdvncED actionscript 3.0中完成。

關於植絨章,請訪問:http://books.google.fr/books?id=QuwsOHYA0p4C&pg=PA92&lpg=PA93&vq=flocking#v=onepage&q=flocking&f=false

與材料(類和樣本文件)可在這裏:http://www.friendsofed.com/download.html?isbn=1430216085

注意,其他實現方式存在,我建議這一個http://blog.inspirit.ru/?p=231

您可能也有興趣授予skinner的漂移運動類:http://gskinner.com/blog/archives/2009/11/wander_motion_c.html

2

根據魚的運動是如何精心製作的,你必須衡量魚和Event.ENTER_FRAME(或在Timer間隔),然後讓鼠標位置之間的距離和角度如果距離小於最小值,則魚朝相反的方向移動。

這些可能幫助:

function getDistance (posa:Point, posb:Point) : Number { 
    var distanceX : Number = posa.x - posb.x; 
    var distanceY : Number = posa.y - posb.y; 
    return Math.sqrt(Math.pow(distanceX, 2) + Math.pow (distanceY, 2)); 
} 

function getAngle (posa:Point, posb:Point) : Number { 
    var distanceX : Number = posa.x - posb.x; 
    var distanceY : Number = posa.y - posb.y; 
    var angleInRadians : Number = Math.atan2 (distanceY, distanceX); 
    var angleInDegrees : Number = angleInRadians * (180/Math.PI); 
    return angleInDegrees > 0 ? angleInDegrees : angleInDegrees + 360; // always returns a positive value to avoid confusion when used with the rotation property 
} 

用法:

var posa:Point = fish.parent.localToGlobal (new Point (fish.x, fish.y); // fish position relative to the stage 
var posb:Point = new Point (stage.mouseX, stage.mouseY);     // mouse position relative to the stage 
var distance:Number = getDistance (posa, posb);       // distance in pixels 
var angle:Number = getAngle (posa, posb);        // angle in degrees 
+0

感謝所有的建議,我會學習 – sefiroths 2011-02-02 10:32:54