2011-02-01 59 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

相关问题