рыба в бассейне, когда мышь рядом, должна уходить - PullRequest
0 голосов
/ 01 февраля 2011

Я бы хотел сделать что-то вроде рыбного бассейна.когда не происходит никаких действий, ожившие рыбы ходят вокруг.когда мышь приближается к этому, они уходят от мыши.Я думаю, что это было сделано много раз, но я не могу найти учебники, которые объясняют эту проблему.я ищу учебник спасибо

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

(это совсем не тривиальная проблема)

привет,

этот тип движения называется flocking .есть довольно простые правила, и ваши boids станут автономными.оригинальная концепция boids была найдена и разработана Крейгом Рейнольдсом и доступна здесь: http://www.red3d.com/cwr/boids/.

объяснения и реализация в ActionScript были выполнены Кейт Питерс в своей книге 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

. Возможно, вас также заинтересует класс скидерного движения Гранта Скиннера: http://gskinner.com/blog/archives/2009/11/wander_motion_c.html

2 голосов
/ 01 февраля 2011

В зависимости от сложности движения рыбы, вы должны измерить расстояние и угол между рыбой и позицией мыши на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...