Регистрация: Nov 2003
Сообщений: 128
|
перемещение объектов. мерцание
Доброго времени!
Возникла необходимость в подвижном указателе-стрелке, состоящем из двух маркеров (прямоугольного[начала] и треугольного[конца]), соединённых линией.
При перемещении одного из маркеров линия следует за ними.
Приведённая ниже реализация работает, но отъявленно мерцает - видно, как линия мечется за маркером, при этом не всегда корректно останавливается.
Никто не подскажет, как это можно побороть?
Пример кода (Flash MX 2003, Ctrl+C, Ctrl+V):
// создаём линию
_root.createEmptyMovieClip("line1", 0);
with (_root.line1)
{
moveTo(0,0);
lineStyle(0, 0x4B78FE, 100);
lineTo(200,0);
_width = 150;
}
// создаём маркер начала - прямоугольник
_root.createEmptyMovieClip( "r1", 1);
with (_root.r1)
{
lineStyle(0, 0x4B78FE, 100);
beginFill(0x4B78FE, 100);
moveTo(-8,-8);
lineTo(8,-8);
lineTo(8,8);
lineTo(-8,8);
lineTo(-8,-8);
endFill();
};
_root.r1.onPress = function(){startDrag(this)};
_root.r1.onRelease = function(){stopDrag()};
_root.r1.onReleaseOutside = function(){stopDrag()};
_root.r1.onMouseMove = function() {if (_root.isDown) {_x = _root._xmouse; _y = _root._ymouse;}};
// создаём маркер конца - треугольник
_root.createEmptyMovieClip( "tr1", 2);
with (_root.tr1)
{
lineStyle(0, 0x4B78FE, 100);
beginFill(0x4B78FE, 100);
moveTo(-8,-8);
lineTo(8,0);
lineTo(-8,8);
lineTo(-8,-8);
endFill();
_x = 150;
};
_root.tr1.onPress = function(){startDrag(this)};
_root.tr1.onRelease = function(){stopDrag()};
_root.tr1.onReleaseOutside = function(){stopDrag()};
_root.tr1.onMouseMove = function() {if (_root.isDown) {_x = _root._xmouse; _y = _root._ymouse;}};
// создаём обработчик событий мыши
mh = new Object();
isDown = false;
mh.onMouseDown = function()
{
isDown = true;
}
mh.onMouseUp = function()
{
isDown = false;
}
mh.onMouseMove = function()
{
if (isDown)
{
with (_root)
{
ax = r1._x;
ay = r1._y;
bx = tr1._x;
by = tr1._y;
dx = line1._x - bx;
dy = line1._y - by;
dxp = 1;
if (dx<0)
{ dxp = 0;}
line1._x = ax;
line1._y = ay;
line1._rotation = (Math.atan(dy/dx)/Math.PI + dxp)*180;
line1._width = Math.abs(bx - ax);
line1._height = Math.abs(by - ay);
r1._rotation = line1._rotation;
tr1._rotation = line1._rotation;
}
}
}
Mouse.addListener(mh);
|