PDA

Просмотр полной версии : Объект вращается в сторону курсора


NUTTT
22.01.2008, 00:24
Я дизайнер, а вот со скриптами не дружу... :wacko:

Пожалуйста, подскажите, как сделать, чтобы объект стал медленно вращаться вокруг своей оси (не сдвигаясь с точки координат), как бы следил за движением курсора. Причем вращение как по часовой, так и против часовой. И также поверх этого объекта - невидимый слой - кнопка. Не хотелось бы чтобы она вращалась.
Идею можно посмотреть на www.refreshreality.com

Да, и ещё... - были тут исходники - по теме "Слежение за курсором".
Недостатки такие - 1. не понятно как управлять скоростью вращения.
2.нужно чтобы объект тормозил. Например при наведении курсора объект начинает вращаться, замедляет движение и останавливается на несколько секунд - иначе будет вечно вращаться.
3. На моем мувике несколько объектов(кубики) и к каждому применяется вращение. Если они будут все одновременно реагировать на курсор - это будет дурдом. Значит нужно обозначить радиус от центра объекта, в пределах которого объект будет реагировать.

Ну и загнула! Самой страшно стало... А вообще это возможно? И есть такие гении, которые такое могут?...

wvxvw
22.01.2008, 03:16
Если честно, глядя на сайт не понял, что нужно сделать =)

Но вообще. Предположим, что центр объекта, который нужно вращать находится в координатах Х=0, У=0. Тогда вычислить его угол поворота можно будет так:
var l:Number = Math.atan(_ymouse/_xmouse)*180/Math.PI;
Для создания всяких эффектов с движением лучше всего подойдут библиотеки mx.transitions или Tweener (первая есть в комплекте с Флешем, вторая распространяется бесплатно - ее легко найти по названию в гугле).
var r_mc:MovieClip = rct(this, Stage.width, Stage.height, Math.random()*0xffffff, 100);
r_mc._x = Stage.width/2;
r_mc._y = Stage.height/2;
var r_mc:MovieClip = rct(r_mc, 200, 200, Math.random()*0xffffff, 100);
function rct(_mc:MovieClip, w:Number, h:Number, c:Number, a:Number):MovieClip {
var mc:MovieClip = _mc.createEmptyMovieClip("rct"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());
mc.beginFill(c,a);
mc.moveTo(-w/2,-h/2);
mc.lineTo(w/2,-h/2);
mc.lineTo(w/2,h/2);
mc.lineTo(-w/2,h/2);
mc.lineTo(-w/2,-h/2);
mc.endFill();
return mc;
}
r_mc.onMouseMove = function():Void {
this._rotation = Math.atan(this._parent._ymouse/this._parent._xmouse)*180/Math.PI;
}Вот простенький пример
import mx.transitions.Tween;
import mx.transitions.easing.*;
import mx.utils.Delegate;
//
var r_mc:MovieClip = rct(this, Stage.width, Stage.height, Math.random()*0xffffff, 100);
r_mc._x = Stage.width/2;
r_mc._y = Stage.height/2;
var r_mc:MovieClip = rct(r_mc, 200, 200, Math.random()*0xffffff, 100);
var _tw:Tween = new Tween(r_mc, '_rotation', Bounce.easeOut, 0, 0, 1, true);
_tw.stop();
function rct(_mc:MovieClip, w:Number, h:Number, c:Number, a:Number):MovieClip {
var mc:MovieClip = _mc.createEmptyMovieClip("rct"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());
mc.beginFill(c,a);
mc.moveTo(-w/2,-h/2);
mc.lineTo(w/2,-h/2);
mc.lineTo(w/2,h/2);
mc.lineTo(-w/2,h/2);
mc.lineTo(-w/2,-h/2);
mc.endFill();
return mc;
}
r_mc.onMouseMove = Delegate.create(this, onMyMove);
function onMyMove():Void {
var _b:Number = _tw.begin;
_tw.begin = Math.atan(r_mc._parent._ymouse/r_mc._parent._xmouse)*180/Math.PI;
if(_tw.begin-_b>0){
_tw.finish=_tw.begin+10;
} else {
_tw.finish=_tw.begin-10;
}
_tw.start();
} А вот пример с использованием твина.

ЗЫ. Сейчас перечитал еще раз... так нужно, чтобы вращался за курсором, или чтобы скорость зависела от удаленности курсора от объекта?
import mx.transitions.Tween;
import mx.transitions.easing.*;
import mx.utils.Delegate;
//
var r_mc:MovieClip = rct(this, Stage.width, Stage.height, Math.random()*0xffffff, 100);
r_mc._x = Stage.width/2;
r_mc._y = Stage.height/2;
r_mc = rct(r_mc, 200, 200, Math.random()*0xffffff, 100);
var _tw:Tween = new Tween(r_mc, '_rotation', None.easeNone, 0, 360, 5, true);
var k:Number = (Stage.width+Stage.height)/(20*Math.max(Stage.width, Stage.height));
_tw.addListener(this);
function rct(_mc:MovieClip, w:Number, h:Number, c:Number, a:Number):MovieClip {
var mc:MovieClip = _mc.createEmptyMovieClip('rct'+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());
mc.beginFill(c,a);
mc.moveTo(-w/2,-h/2);
mc.lineTo(w/2,-h/2);
mc.lineTo(w/2,h/2);
mc.lineTo(-w/2,h/2);
mc.lineTo(-w/2,-h/2);
mc.endFill();
return mc;
}
onMotionFinished = function():Void {
_tw.start();
}
r_mc.onMouseMove = Delegate.create(this, onMyMove);
function onMyMove():Void {
if(_tw.begin < _tw.position%360-5 || _tw.begin > _tw.position%360+5){
_tw.begin = _tw.position%360;
_tw.rewind();
if(r_mc._parent._xmouse>0){
_tw.finish = _tw.begin + 360;
} else {
_tw.finish = _tw.begin - 360;
}
_tw.duration = Math.round(k*Math.sqrt(r_mc._parent._ymouse*r_mc._parent._ymouse + r_mc._parent._xmouse*r_mc._parent._xmouse));
_tw.resume();
}
}

Ну, тогда еще и такой вариант.

chingachgoog
23.01.2008, 09:52
Я дизайнер, а вот со скриптами не дружу... :wacko:
...

А функция поиска для дизайнера тоже недосигаемо сложна? :)

http://flasher.ru/forum/showpost.php?p=675016