私はdarkBlueRect
の矩形スプライトと、より大きいスケールとより明るい色の同じスプライトのコピーを持っています - lightBlueRect
。マウス座標からX座標を設定する
darkBlueRect
の上をマウスが移動しているときにmouse.x
の位置に応じてlightBlueRect
の位置を移動しようとしています。この方法は、マウスがdarkBlueRect
の右側にある場合は、拡大されたlightBlueRect
の位置が反対側になり、マウスの位置とスケールに比例して左にシフトします。さらに、lightBlueRect
はdarkBlueRect
に「ロック」されている必要があります。したがって、lightBlueRect.x
は、darkBlueRect.x
を超えてはならず、lightBlueRect.x + lightBlueRect.width
は決してdarkBlueRect.x + darkBlueRect.width
以上にならないようにしてください。
- 状態A:01が
darkBlueRect.x = 1
上で、両方のスプライトが左に整列しているは下の画像は、私が達成しようとしてるかの3つの状態を示しています。
- 状態B:
mouse.x
はdarkBlueRect
の真ん中にあり、両方のスプライトが真ん中に整列しています。 - 状態C:
mouse.x
は、最後のピクセルがdarkBlueRect
で、両方のスプライトが右側に揃っています。この例の
、darkBlueRect.width
は170
に等しく、lightBlueRect.width
は320
に等しい、又は1.89
のスケール。
マウスが変わるたびにの位置が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));
iはlightBlueRect
の規模は、それが最初の位置は2つのスプライトをもたらすであろう(最後の画素上マウス)、ならびに整列される(最初のピクセル上でマウス)及び最後の位置ということに関係なく、それでは方程式を使用することができ間にプロパティの比例したポジション?
[EDIT] darkBlueRectの座標は{0、0}、そうlightBlueRectは、それが負に移動して左に向かって移動します。表示オブジェクトが小さい場合、問題が気づくことは困難である
var scale:Number = 1.89;
lightBlueRect.x = 0 - Math.round((mouse.x * scale)/darkBlueRect.width * (lightBlueRect.width - darkBlueRect.width));
[EDIT 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;
}
私はこの問題は、図形の拡大縮小ということであると信じています。
こんにちはガレス。これは私にとってはうまくいかなかった。最初にlightBlueRectはマウスがdarkBlueRectの最初のピクセルの上にあるときにはさらに左にあり、もう1つはマウスxが真ん中に達していないときにはイメージが速すぎて右に整列を終了します。 darkBlueRectの座標は{0、0}ですので、ligthBlueRectが左に移動すると負になります。 – TheDarkIn1978
座標は '{0、0}'であるので、あなたのコードから 'dBR.x'を削除しました(これは単純に0なので)、今度はこれを持っていますが、動作しません:' lBR.x = *(dBR.width - lBR.width); ' – TheDarkIn1978
また、私はあなたが幅が必要であると言うときに私はあなたに従うとは確信していません浮動小数点その幅はピクセルに基づいているため、符号なし整数です。この場合、dBRの幅は170です。 – TheDarkIn1978