Установка координаты X из положения мыши - PullRequest
1 голос
/ 28 июля 2011

У меня есть darkBlueRect прямоугольный спрайт и копия того же спрайта с увеличенным масштабом и более светлым цветом - lightBlueRect.

Я пытаюсь изменить местоположение lightBlueRectв соответствии с местоположением mouse.x, когда мышь перемещается над darkBlueRect.таким образом, если мышь находится справа от darkBlueRect, то положение увеличенного lightBlueRect будет на противоположной стороне и смещено влево пропорционально положению и масштабу мыши.кроме того, lightBlueRect должен выглядеть «заблокированным» для darkBlueRect, поэтому lightBlueRect.x никогда не должно быть больше darkBlueRect.x, а lightBlueRect.x + lightBlueRect.width никогда не должно быть меньше darkBlueRect.x + darkBlueRect.width.

изображенияниже показаны 3 состояния того, что я пытаюсь выполнить:

  1. Состояние A: mouse.x больше darkBlueRect.x = 1, и оба спрайта выровнены по левому краю.
  2. Состояние B: mouse.x находится в середине darkBlueRect, и оба спрайта выровнены по середине.
  3. Состояние C: mouse.x находится в последнем пикселе darkBlueRect, и оба спрайта выровнены вправо.

enter image description here

для этого примера 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;
}

Я считаю, что проблема заключается в том, чтомасштабирование форм.

1 Ответ

1 голос
/ 28 июля 2011

Предполагая, что у вас есть функция Clamp, и что width является плавающей точкой, так что деление работает как положено:

lBR.x = dBR.x + Clamp((mouse.x - dBR.x) / dBR.width, 0, 1) * (dBR.width - lBR.width);

(Вы можете определить Clamp(x, m, M) = min(max(x, m), M), если неесть один.)

...