Просмотр полной версии : Движение клипа
Коллеги, помогите никчёмному малевальщику. Я в формулах и уравнениях не силён, а требуется написать скрипт для такой штуки:
клип шевелится в сторону, противоположную движению мышки, но не линейно, а с коэффициентом и плавно замедляясь, при остановке мышки.
После того как мышь выходит за пределы рабочей области, клип возвращается на исходное место, так же плавно замедляясь.
А?
Нашёл скрипт, который заставляет клип бегать за курсором нужным образом. Как его модифицировать, чтобы клип бегал в противоположную сторону?
pic.onMouseMove = function () {
this.speed = 0.1;
this.onEnterFrame = function () {
var dx = this._x - this._parent._xmouse;
var dy = this._y - this._parent._ymouse;
this._x -= dx * this.speed;
this._y -= dy * this.speed;
if (!(Math.abs (dx) > 0.01 && Math.abs (dy) > 0.01)) {
this._x = this._parent._xmouse;
this._y = this._parent._ymouse;
delete this.onEnterFrame;
}
};
};
pic.onMouseMove = function () {
this.speed = 0.1;
this.onEnterFrame = function () {
var dx = this._x - this._parent._xmouse;
var dy = this._y - this._parent._ymouse;
this._x += dx * this.speed;
this._y += dy * this.speed;
if (!(Math.abs (dx) > 0.01 && Math.abs (dy) > 0.01)) {
this._x = this._parent._xmouse;
this._y = this._parent._ymouse;
delete this.onEnterFrame;
}
if (pic._x < 0 || pic._y < 0 || pic._x > Stage.height || pic._y > Stage.width)
{
pic._x = Stage.width/2;
pic._y = Stage.height/2;
}
};
};
AlexDesinger
25.06.2008, 21:51
а как сделать что бы клип не уезжал за экран а плавно останавливался?
посмотрите как тут здорово сделано))))) вот бы тоже так забабацать))))
http://www.ffk-schick.com/ru/
если кто знает напишите плиз очень нужно и еще инетересно как сделано что разные клипв по разному смещаются? видимо смещение предусмотрено))))
Заставку можно пропустить))))
AlexDesinger, положение упаковки просто инвертировано положению мыши, деленному на какоето число. Если Вам известны высота и ширина сцены, и размеры клипа, кудаж он уедет?)))) Для маленьких клипов то же правило.
В общем виде так (стандартная точка привязки)mc.onMouseMove = function () {
this._x = Stage.width-this._width-_xmouse + this._width/(Stage.width/_xmouse);
this._y = Stage.height-this._height-_ymouse + this._height/(Stage.height/_ymouse);
}границы конечно можно урегулировать, если не нужно движение от борта до борта)))
AlexDesinger
26.06.2008, 05:28
да это все так но как сделать что бы происходило замедление и остановка?
Ну т.е чтобы мувик не моментально реагировал на двиение
ясно что через onEnterFrame но у меня в голове неукладывается как это можно посчитать...
На примере выше происходит наоборот ускорение...чем дальше друг от друга мувик и курсор, тем быстрее скорость
AlexDesinger
27.06.2008, 17:39
вот нашел наконец что-то похожее
function CursorMovement() {
speed = 0.9;
dx = speed*(dx-_xmouse)+_xmouse;
dy = speed*(dy-_ymouse)+_ymouse;
mc._x = (1-mc._width/Stage.width)*dx+mc._width/2;
mc._y = (1-mc._height/Stage.height)*dy+mc._height/2;
}
setInterval(CursorMovement,100);
весь фокус в том что клип должен быть больше чем Stage, тогда происходит "обратное движение", но если меньше то движение будет ЗА мышкой.
Вот теперь как бы придумать чтобы , скажем два или три клипа смещались немного поразному, но при этом не перегрузить проц?
Так Вам инерции чтоли не хватает? ОК, тормозим!
mc.onMouseMove = function () {
this.cell_x = Stage.width-this._width-_xmouse + this._width/(Stage.width/_xmouse);
this.cell_y = Stage.height-this._height-_ymouse + this._height/(Stage.height/_ymouse);
}
mc.onEnterFrame = function () {
this._x = this._x + (this.cell_x - this._x)/10
this._y = this._y + (this.cell_y - this._y)/10
}
AlexDesinger
27.06.2008, 20:35
Офигеть, просто!!! Круто....то что надо!!! Спасибо)))))))))))
AlexDesinger
20.09.2008, 18:19
Wolsh, подскажи плиз как мне сделать, чтобы клип mc двигался не по всей поверхности Stage, а находился внутри клипа, скажем clip_mc и двигался только в пределах границ этого клипа?
var xborder:Number = clip_mc._width-clip_mc.mc._width;
var yborder:Number = clip_mc._height-clip_mc.mc._height;
////
clip_mc.mc.onMouseMove = function () {
var xcell:Number = xborder-clip_mc._xmouse + this._width/(clip_mc._width/clip_mc._xmouse);
this.cell_x = Math.min(xborder, Math.max(0, xcell));
var ycell:Number = yborder-clip_mc._ymouse + this._height/(clip_mc._height/clip_mc._ymouse);
this.cell_y = Math.min(yborder, Math.max(0, ycell));
}
clip_mc.mc.onEnterFrame = function () {
this._x = this._x + (this.cell_x - this._x)/10
this._y = this._y + (this.cell_y - this._y)/10
}
AlexDesinger
22.09.2008, 00:45
клааассс....!!! Супер, сапсибо большое =)
мне б в жизни не сообразить....слишком плохо с математикой))))))))
только у этого кода есть один недостаток - клип не реагирует на мышку, если мышка находится по углам Stage(при расположение clip_mc где-то в центре Stage) =|
В смысле не реагирует? Забивается в угол clip_mc и сидит там, а как еще? Дальше ведь ему нельзя двигаться! Или Вы хотели чтобы clip_mc был какбы уменьшенной проекцией Stage, и только когда мышь заходит в угол стейджа, mc заходит в противоположный угол clip_mc? А когда мышь скажем на 2/3 расстояния от центра до угла стейджа, то mc на 2/3 расстояния от центра до угла clip_mc?
AlexDesinger
22.09.2008, 02:37
Или Вы хотели чтобы clip_mc был какбы уменьшенной проекцией Stage, и только когда мышь заходит в угол стейджа, mc заходит в противоположный угол clip_mc? А когда мышь скажем на 2/3 расстояния от центра до угла стейджа, то mc на 2/3 расстояния от центра до угла clip_mc?
да...вот...я именно это имел ввиду :) сорри, что не так выразился...я именно это пытаюсь сообразить как сделать, но вообще ничего не могу...
я не могу в голове уложить все зависимости что от чего зависит и что на что надо делить....
впринципе соотношение сторон не принципиально, оно впринципе может быть и как у Stage лишь бы можно было регулировать размеры этой области и его местоположение - клип, который как бы уменьшенная копия Stage или проекция Stage...:wacko:
AlexDesinger
23.09.2008, 16:44
у меня получилось вот что:
xRatio = (Stage.width+clip_mc.mc._width)/clip_mc._width;
yRatio = (Stage.height+clip_mc.mc._height)/clip_mc._height;
onMouseMove = function () {
dx = (Stage.width-clip_mc.mc._width-_xmouse+clip_mc.mc._width/(Stage.width/_xmouse))/xRatio;
dy = (Stage.height-clip_mc.mc._height-_ymouse+clip_mc.mc._height/(Stage.height/_ymouse))/yRatio;
};
onEnterFrame = function () {
clip_mc.mc._x = clip_mc.mc._x+(dx-clip_mc.mc._x)/10;
clip_mc.mc._y = clip_mc.mc._y+(dy-clip_mc.mc._y)/10;
};
не совсем точно, край клипа mc либо выезжает либо не доезжает до края клипа clip_mc, но по крайней мере работает...еле разобрался как это можно сделать.
Это Вам кажется, что всё так просто - всего лишь чуть другое условие. Но если раньше Вы хотели соблюдение одного условия, то теперь - одновременно двух, но сами этого по-моему не поняли))) Представьте, что clip_mc находится не в центре стейджа.
Если положение mc внутри clip_mc соответствует зеркальному отражению положения мыши на сцене, то когда мышь в центре сцены, мс - в центре клип_мс. Когда мышь в центре клип_мс, мс - почти у самой грани клип_мс. Т.е. изначальное правило, что мс убегает от мышки относительно центра клип_мс, не может быть соблюдено одновременно с "проецированием" сцены.
AlexDesinger
23.09.2008, 20:54
Что-то я и в правду вас не понимаю. Наверное мы представляем себе разные эффекты, либо я действительно что то упустил...я прикрепил файл, в которм клипы движутся как бы мне хотелось - точно так как вы подсказали ранее, только я попробовал их разместить внутри клипа, чтобы они не по всему стэйджу перемещались а внутри клипа, ограничивающего их перемещение.
Где бы я не размещал клип_мс на стейдже, клипы внутри него двигаются правильно...:wacko:
Как Вы сказали? :wacko: ?)))))
Не знаю, я затруднился обнаружить какуюто единую систему. По-моему там никто "правильно" не движется. Но если это то, что Вы имели в виду - здорово! Вы сами решили задачу, казавшуюся Вам такой неразрешимой. Мои поздравления и дальнейших успехов!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.