2011-07-28 19 views
1

私はdarkBlueRectの矩形スプライトと、より大きいスケールとより明るい色の同じスプライトのコピーを持っています - lightBlueRectマウス座標からX座標を設定する

darkBlueRectの上をマウスが移動しているときにmouse.xの位置に応じてlightBlueRectの位置を移動しようとしています。この方法は、マウスがdarkBlueRectの右側にある場合は、拡大されたlightBlueRectの位置が反対側になり、マウスの位置とスケールに比例して左にシフトします。さらに、lightBlueRectdarkBlueRectに「ロック」されている必要があります。したがって、lightBlueRect.xは、darkBlueRect.xを超えてはならず、lightBlueRect.x + lightBlueRect.widthは決してdarkBlueRect.x + darkBlueRect.width以上にならないようにしてください。

  1. 状態A:01​​がdarkBlueRect.x = 1上で、両方のスプライトが左に整列している

    下の画像は、私が達成しようとしてるかの3つの状態を示しています。

  2. 状態B:mouse.xdarkBlueRectの真ん中にあり、両方のスプライトが真ん中に整列しています。
  3. 状態C:mouse.xは、最後のピクセルがdarkBlueRectで、両方のスプライトが右側に揃っています。この例のenter image description here

darkBlueRect.width170に等しく、lightBlueRect.width320に等しい、又は1.89のスケール。

マウスが変わるたびにの位置がdarkBlueRectを超えています。しかし、私の現在のコードはほとんどの部分で動作しますが、正確には正しくありません。 mouse.xdarkBlueRect.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] :私は単に代わりに、このように私のコードを(何が動作しません)書かれている可能性があります。しかし、それらが大きくなると、問題は明らかになります。ここで問題となるのは、左側のオブジェクトの位置がずれることです。

また、lightBlueRectdarkBlueRectの両方がスケーラブルであるという事実によって、この問題はおそらく驚異的です。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

その部門が期待通りに動作しますので、あなたがClamp機能便利を持っている、とwidthがされていることを、浮動小数点と仮定:(お持ちでない場合は、Clamp(x, m, M) = min(max(x, m), M)を定義することができます)

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

+0

こんにちはガレス。これは私にとってはうまくいかなかった。最初にlightBlueRectはマウスがdarkBlueRectの最初のピクセルの上にあるときにはさらに左にあり、もう1つはマウスxが真ん中に達していないときにはイメージが速すぎて右に整列を終了します。 darkBlueRectの座標は{0、0}ですので、ligthBlueRectが左に移動すると負になります。 – TheDarkIn1978

+0

座標は '{0、0}'であるので、あなたのコードから 'dBR.x'を削除しました(これは単純に0なので)、今度はこれを持っていますが、動作しません:' lBR.x = *(dBR.width - lBR.width); ' – TheDarkIn1978

+0

また、私はあなたが幅が必要であると言うときに私はあなたに従うとは確信していません浮動小数点その幅はピクセルに基づいているため、符号なし整数です。この場合、dBRの幅は170です。 – TheDarkIn1978

関連する問題