У меня есть darkBlueRect
прямоугольный спрайт и копия того же спрайта с увеличенным масштабом и более светлым цветом - lightBlueRect
.
Я пытаюсь изменить местоположение lightBlueRect
в соответствии с местоположением mouse.x
, когда мышь перемещается над darkBlueRect
.таким образом, если мышь находится справа от darkBlueRect
, то положение увеличенного lightBlueRect
будет на противоположной стороне и смещено влево пропорционально положению и масштабу мыши.кроме того, lightBlueRect
должен выглядеть «заблокированным» для darkBlueRect
, поэтому lightBlueRect.x
никогда не должно быть больше darkBlueRect.x
, а lightBlueRect.x + lightBlueRect.width
никогда не должно быть меньше darkBlueRect.x + darkBlueRect.width
.
изображенияниже показаны 3 состояния того, что я пытаюсь выполнить:
- Состояние A:
mouse.x
больше darkBlueRect.x = 1
, и оба спрайта выровнены по левому краю. - Состояние B:
mouse.x
находится в середине darkBlueRect
, и оба спрайта выровнены по середине. - Состояние C:
mouse.x
находится в последнем пикселе darkBlueRect
, и оба спрайта выровнены вправо.
для этого примера darkBlueRect.width
равно 170
, а lightBlueRect.width
равно 320
или шкале 1.89
.
каждый раз, когда мышь меняет свое положение x
над darkBlueRect
, вызывается следующее.однако, хотя мой текущий код работает по большей части, он не совсем корректен.когда mouse.x
превышает darkBlueRect.x = 1
, как показано в состоянии A, lightBlueRect.x
не является свойством, выровненным с darkBlueRect
и выглядит меньше darkBlueRect.x
.
var scale:Number = 1.89;
lightBlueRect.x = darkBlueRect.x - Math.round((mouse.x * scale) / darkBlueRect.width * (lightBlueRect.width - darkBlueRect.width));
какое уравнение можноиспользуйте так, чтобы независимо от масштаба lightBlueRect
его первая позиция (мышь над первым пикселем) и последняя позиция (мышь над последним пикселем) приводили к выравниванию двух спрайтов, а также к пропорциональному расположению свойства между?
[EDIT] координаты darkBlueRect равны {0, 0}, поэтому, когда lightBlueRect движется влево, он перемещается в негатив.вместо этого я мог бы просто написать свой код (что не работает):
var scale:Number = 1.89;
lightBlueRect.x = 0 - Math.round((mouse.x * scale) / darkBlueRect.width * (lightBlueRect.width - darkBlueRect.width));
[РЕДАКТИРОВАТЬ 2] , когда экранные объекты маленькие, проблема в том, чтотрудно заметить.однако, когда они велики, проблема становится очевидной.проблема здесь в том, что объекты на левой стороне смещены.
также проблема, вероятно, вызвана тем, что и lightBlueRect
, и darkBlueRect
являются масштабируемыми.darkBlueRect
уменьшается, а lightBlueRect
увеличивается.
вот ссылка на тест, отображающий проблему.быстрое наложение на фигуру, очевидно, приведет к неточному выравниванию, поскольку оно основано на частоте кадров, но это не моя проблема.Тем не менее, когда вы медленно наводите курсор мыши на фигуру, она не будет правильно выровнена по левой стороне, когда мышь находится над первым пикселем darkBlueRect
: http://www.geoffreymattie.com/test/test.html
[SWF(width = "1000", height = "600", backgroundColor = "0xCCCCCC")]
import flash.display.Sprite;
import flash.events.MouseEvent;
var downScale:Number = 0.48;
var upScale:Number = 2.64;
var darkBlueRect:Sprite = createSprite();
darkBlueRect.scaleX = darkBlueRect.scaleY = downScale;
darkBlueRect.x = stage.stageWidth / 2 - darkBlueRect.width / 2;
darkBlueRect.y = stage.stageHeight / 2 - darkBlueRect.height / 2;
addChild(darkBlueRect);
var lightBlueRect:Sprite = createSprite();
lightBlueRect.scaleX = lightBlueRect.scaleY = upScale;
lightBlueRect.y = stage.stageHeight / 2 - lightBlueRect.height / 2;
lightBlueRect.x = stage.stageWidth;
lightBlueRect.mouseEnabled = false;
addChild(lightBlueRect);
darkBlueRect.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
function mouseMoveEventHandler(evt:MouseEvent):void
{
lightBlueRect.x = darkBlueRect.x + Math.max(0.0, Math.min(darkBlueRect.mouseX / darkBlueRect.width * downScale, 1.0)) * (darkBlueRect.width - lightBlueRect.width);
}
function createSprite():Sprite
{
var result:Sprite = new Sprite();
result.graphics.beginFill(0x0000FF, 0.5);
result.graphics.drawRect(0, 0, 700, 200);
result.graphics.endFill();
return result;
}
Я считаю, что проблема заключается в том, чтомасштабирование форм.