PDA

Просмотр полной версии : Слежение глаз за курсором.


dendead
27.12.2013, 02:55
Разбираю пример слежения глаз за курсором http://www.youtube.com/watch?v=gBOa06lcRWA. Как и в примере создаю глаза и зрачок:

http://www.picamatic.com/show/2010/02/05/10/13/9968302_506x325.jpg

В первом кадре пишу код:
import flash.events.Event;

const THRESHOLD = 200;
// every frame, make the pupil look at the mouse
addEventListener(Event.ENTER_FRAME, lookAtMouse);
// explain lookAtMouse
function lookAtMouse(e:Event) {
var angle = Math.atan2(mouseY, mouseX);

// ПРОВЕРЯЮ КООРДИНАТЫ
trace(pupil.x);

pupil.x = Math.cos(angle) * 8;
pupil.y = Math.sin(angle) * 8;
}

Всё работает без проблем. Координаты зрачков (pupil) меняются примерно от -3 до 3.

Теперь пытаюсь прописать функцию в классе:
// ОСНОВНОЙ КОД
// ГДЕ-ТО В КОДЕ
addEventListener(Event.ENTER_FRAME, lookAtMouse);

// ЧУТЬ ДАЛЬШЕ В КОДЕ
function lookAtMouse(e:Event) {
var angle = Math.atan2(mouseY, mouseX);

c_embryoEyes.c_embryoEye.pupil.x = Math.cos(angle) * 8;
c_embryoEyes.c_embryoEye.pupil.y = Math.sin(angle) * 8;
}


Глаза добавляются на сцену с помощью addChild.
Меняю pupil на полный путь к мувклипу c_embryoEyes.c_embryoEye.pupil. Перестаёт работать. Координаты зрачков доходят только от 3 до 0. Получается так, что зрачки не делают полный оборот в глазу. В каком направлении можно копать? Запутался.

in4core
27.12.2013, 03:51
Теперь пытаюсь прописать функцию в классе: А где класс? Покажите полный код

dendead
27.12.2013, 04:31
package monsters {
import flash.events.*;
import flash.display.*;

public class MouseFollowing extends Sprite {
public static const THRESHOLD = 200;
private var c_embryoEyes:MovieClip;

public function MouseFollowing( ):void {
// every frame, make the pupil look at the mouse
addObject( );
addEventListener(Event.ENTER_FRAME, lookAtMouse);

}

public function addObject( ):void {
addChild(c_embryoEyes);
}

// explain lookAtMouse
public function lookAtMouse(e:Event) {
// get the angle to the mouse
var angle = Math.atan2(mouseY, mouseX);
// get the distance - pythagoras
var distance = Math.sqrt((mouseX*mouseX) + (mouseY*mouseY));
if (distance > THRESHOLD) distance = THRESHOLD;
// move the pupil in that direction, starting from 0, 0
var desiredX = Math.cos(angle) * 4;
var desiredY = Math.sin(angle) * 4;
desiredX *= (distance / THRESHOLD);
desiredY *= (distance / THRESHOLD);
// ease to the position, instead of snapping
c_embryoEyes.c_embryoEye.pupil.x += (desiredX - c_embryoEyes.c_embryoEye.pupil.x) * 0.2;
c_embryoEyes.c_embryoEye.pupil.y += (desiredY - c_embryoEyes.c_embryoEye.pupil.y) * 0.2;
}

}
}

Isfet
27.12.2013, 06:00
скорее всего потому , что если пишете этот код в первом кадре, то mouseX/Y берется относительно stage, когда же переносите в класс, то mouseX беретсся относительно самого этого класса, нужно делать что-то вроде, чтобы сделать глобальные координаты.


var angle = Math.atan2(mouseY+this.y, mouseX + this.x);

опять же зависит как глубоко у вас лежит этот класс

dendead
27.12.2013, 06:10
Сами глаза находятся тут:
addChild(sprite1);
sprite1.addChild(mEyes);

А зрачок:
mEyes.eye.pupil

Хм, а сам класс где лежит...

А если указать в первом кадре stage.mouseY и stage.mouseX как раз повторяется ситуация при добавлении в класс...

Тогда возникает вопрос: какие координаты mouseX и mouseY фигурируют в коде при добавлении в кадр на timeline?

Добавлено через 29 минут
Всё, разобрался!
Поставил mEyes.eye.mouseY и mEyes.eye.mouseX и всё заработало. То есть mouseY и mouseX из того места, откуда они берутся при добавлении кода на timeline.

Добавлено через 31 минуту
Огромное спасибо за помощь в очередной раз.