Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Объект вращается в сторону курсора (http://www.flasher.ru/forum/showthread.php?t=106925)

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

Цитата:

Сообщение от NUTTT
Я дизайнер, а вот со скриптами не дружу... :wacko:
...

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

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


Часовой пояс GMT +4, время: 11:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.