0

これに似た地図アプリケーションを作成しようとしています。画像の左側にある [SWF プレビュー] タブをクリックします。具体的には、どのようにパンすることができるか、マップ上のクリック可能なボタンがそれに合わせて移動することに気付きました。基本的に、彼らはそれをどのように行うのですか?

私のアプリケーションには、startDrag() 関数を使用してクリックしてパンできるマップがあります。マップ レイヤーのパンをたどりたい、他のクリック可能なムービー クリップを含む別のレイヤーがあります。残念ながら、Flash では、一度にドラッグできるムービー クリップは 1 つだけに制限されています。誰かがプロトタイプを使用した解決策を提案しましたが、それが正しく機能しません。ActionScript 3.0 を使用しているためかどうかはわかりません。

私がやろうとしていることを達成するためのより良い方法、または私が現在行っていることを行うためのより良い方法を誰かが概説できますか? 感謝します。

4

6 に答える 6

3

単純。マップクリック可能なボタンを新しいMovieClipに配置し、 interactiveMapContainerなどと呼んでから、 interactiveMapContainerでstartDragメソッドを呼び出すと、ドラッグした後もボタンをクリックできます。

Jakub Kotrlaの方法も、少し複雑ですが、非常にうまく機能します。

于 2008-09-19T19:35:48.193 に答える
2

すべてを「メイン」のドラッグ可能なオブジェクトの子にすることができれば、defmetaのメソッドが最適だと思います。これは、(UI応答時間の点で)最も高速で、最もシンプルで、必要なコードも最小限です。

それがオプションでない場合は、他にもいくつかの方法があります。

  • Flexを使用している場合は、MoveEvent .MOVEイベントをリッスンし、それに応じて移動することで、他のオブジェクトをマップと一緒に移動させることができます。
  • ドラッグ機能を自分で実装して、より詳細に制御できるようにすることができます(以下を参照)。

これは、オブジェクトのドラッグ機能を実装する例です。この機能は、一連の「兄弟」オブジェクトも一緒に移動します。この例では、

  • アンダースコアで始まる変数は、このコードを含むクラスのプライベートメンバーです。
  • _siblingsキーが移動する必要のある他のオブジェクトである辞書です。

private var _dragStartCoordinates:Point = null;
private var _siblingsDragStartCoordinates:Dictionary = null;

private function mouseDownHandler(event:MouseEvent):void
{
    this.startDrag();
    _dragStartCoordinates = new Point(this.x, this.y);

    _siblingsDragStartCoordinates = new Dictionary(true);
    for (var sibling:DisplayObject in _siblings)
    {
        _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y);
    }

    stage.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false, 0, true);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false, 0, true);
}

private function dragMouseUpHandler(event:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false);
    this.stopDrag();
    moveSiblings();
    _dragStartCoordinates = null;
    _siblingsDragStartCoordinates = null;
}

private function dragMouseMoveHandler(event:MouseEvent):void
{
    moveSiblings();
}

// expects _dragStartCoordinates and _siblingsDragStartCoordinates
// to be set
private function moveSiblings():void
{
    var xDiff:Number = this.x - _dragStartCoordinates.x;
    var yDiff:Number = this.y - _dragStartCoordinates.y;

    for (var sibling:DisplayObject in _siblings)
    {
        sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
        sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
    }
}
于 2008-09-19T19:36:07.337 に答える
1

リンクした SWF をドラッグすることはできません。mouseWheel でズームするだけです。

イベント mousedown、mouseMove、および mouseUp を使用して、一度に複数のムービークリップをドラッグできます。

Mouse.addListener(object) を介してイベントのイベント ハンドラーを追加します。

  • mouseDown でいくつかのフラグを設定し、現在のマウス位置を記憶します。
  • フラグが設定されている場合、mouseMove で移動オフセットを計算し、ドラッグするすべてのムービークリップの .x と .y を変更するだけです。
  • mouseUp でフラグを false に設定します
于 2008-09-19T19:23:52.980 に答える
1

どうもありがとうございました。以下のように変更しました: package { import flash.display.MovieClip; インポート flash.events.*; flash.geom.Rectangle をインポートします。インポート flash.utils.setInterval; インポート flash.utils.clearInterval; flash.display.MovieClip をインポートします。flash.display.DisplayObject をインポートします。flash.display.Sprite をインポートします。flash.geom.Point をインポートします。flash.utils.Dictionary をインポートします。

public class DragSync { 
    private var _dragStartCoordinates:Point = null;
    private var _siblingsDragStartCoordinates:Dictionary = null;
    private var _primaryItem:Object = null;

private var _workSpace:Object = null; private var _dragWithPrimary:Array = null;

    public function DragSync(primaryItem:Object,workSpace:Object, dragWithPrimary:Array)
    {
            _primaryItem = primaryItem;
            _dragWithPrimary = dragWithPrimary;
_workSpace = workSpace;

            _workSpace.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler);
_workSpace.addEventListener(MouseEvent.MOUSE_OUT, dragOut);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
            trace("event mouse down");
_primaryItem.startDrag();
_dragStartCoordinates = new Point(_primaryItem.x, _primaryItem.y);
            _siblingsDragStartCoordinates = new Dictionary(true);

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y)
            }
    }

    private function dragMouseUpHandler(event:MouseEvent):void
    {
            moveSiblings();
_primaryItem.stopDrag();
            _dragStartCoordinates = null;
            _siblingsDragStartCoordinates = null;
    }

    private function dragMouseMoveHandler(event:MouseEvent):void
    {
            trace("event mouse MOVE MOVE");
moveSiblings();
    }

private function dragOut(event:MouseEvent):void { _primaryItem.stopDrag(); }

    // expects _dragStartCoordinates and _siblingsDragStartCoordinates
    // to be set
    private function moveSiblings():void
    {
            if (!_dragStartCoordinates || !_siblingsDragStartCoordinates) return;

            var xDiff:Number = _primaryItem.x - _dragStartCoordinates.x;
            var yDiff:Number = _primaryItem.y - _dragStartCoordinates.y;

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
                    sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
            }

    }


} 

}

于 2010-03-04T01:42:57.040 に答える
0

ムービークリップを親クリップに追加して、イベント ハンドラで親をドラッグできますか?

于 2008-09-19T19:29:57.523 に答える