Flash CS5 startDrag способен перетаскивать объект только из определенной точки - PullRequest
1 голос
/ 08 августа 2011

У меня есть экран паузы, который добавляется, когда вы нажимаете кнопку паузы внутри моей текущей игры.Как только это вызывается, класс PausePanel включается и добавляет «представление» к себе на сцену (это отдельный фрагмент ролика с именем PauseScreenView, который содержит все кнопки, ползунки и т. Д., В которых он мне нужен).В этой панели паузы я пытаюсь настроить пользовательский слайдер, чтобы я мог контролировать громкость.Прямо сейчас я игнорирую весь объем и просто пытаюсь заставить его отображать некоторый текст в динамическом текстовом окне на той же панели паузы.Сейчас у меня все настроено и работает, однако есть проблема.Я могу только «захватить» ползунковую ручку (называемую volKnob), когда она находится на дальних концах своего диапазона.И что еще хуже, я не могу взять его из любой точки графического фрагмента ролика, за исключением левого края, когда он находится с левой стороны своего диапазона, и правого края, когда он находится с правой стороны своего диапазона.Также, если я отпущу это, пока не на дальнем краю, тогда я вообще не смогу схватить его.Я уже настраивал другие драг, и один даже находится в другом месте этой игры.Все они работают нормально, и я могу захватить объект из любого места, где я хочу, по краям графика.Но на этой странице я не могу понять, за исключением краев.Сейчас я впервые пытаюсь установить ограничение на его диапазон, но если я уберу этот бит, он все равно не позволит мне взять его из любого места.Вот код PausePanel.as:

package {
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.geom.Rectangle;

public class PausePanel extends MovieClip {
    public var viewPause:PauseScreenView;

    private var boundsRect:Rectangle;

    public function PausePanel():void {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
    }

    private function addedToStage(e:Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);

        //add the graphics
        viewPause = addChild(new PauseScreenView()) as PauseScreenView;

        //set up variables
        boundsRect = new Rectangle(60, 185, 360, 0);

        addEventListener(Event.ENTER_FRAME, onEnterFrame);

        viewPause.Knob.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    }

    private function onEnterFrame(event:Event):void {
        sliderValue = viewPause.Knob.x / 3;
        viewPause.status_txt.text = "Slider position is: " + sliderValue;
    }

    private function startDragging(event:MouseEvent):void {
        var currentDragObject:MovieClip = event.currentTarget as MovieClip;
        currentDragObject.startDrag(true, boundsRect);
            currentDragObject.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
    }

    private function stopDragging(event:MouseEvent):void {
        var currentDragObject:MovieClip = event.currentTarget as MovieClip;
         currentDragObject.stopDrag();
        currentDragObject.removeEventListener(MouseEvent.MOUSE_UP, stopDragging);
    }
}

}

Есть ли что-то, что кто-то видит, где я что-то пропустил или настроил что-то неправильно?Я перепробовал несколько разных вещей, и все они работали одинаково испорченным способом.Есть идеи?

ОБНОВЛЕНО:

ОК. Я вынул этот код и сделал его классом конструктора для пустого fla с помощью только ручки и текстового окна.Как только я вынул раздел viewPause, он работает отлично.Он тянет так же, как вы думаете.Проблема возникает с тем фактом, что ручка является дочерним элементом viewPause, кажется?Есть ли какая-то особая хитрость, чтобы заставить перетаскивать работать, когда объект перетаскивания является подобъектом другого, кроме того, как я показываю его в коде (т.е. viewPause.Knob) ??

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Этот код на самом деле отлично работает для тех, кто ищет эту тему. Моя проблема возникла из-за того, что у меня настроен диапазон, чтобы мышь не работала, чтобы на экране ниже этого не происходили ложные щелчки. Диапазон оказался выше большинства созданного мною слайдера, за исключением краев диапазона слайдеров. Отсюда и моя проблема. Так что, в конце концов, это была просто ошибка программиста, из-за которой он не работал должным образом.

0 голосов
/ 08 августа 2011

Попробуйте удалить событие startDragging при его запуске, а затем снова добавить его в событие stopDragging. Примерно так:

private function startDragging(event:MouseEvent):void {
    currentDragObject.removeEventListener(MouseEvent.MOUSE_DOWN, startDragging);

    var currentDragObject:MovieClip = event.currentTarget as MovieClip;
    currentDragObject.startDrag(true, boundsRect);
        currentDragObject.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}

private function stopDragging(event:MouseEvent):void {
    var currentDragObject:MovieClip = event.currentTarget as MovieClip;
     currentDragObject.stopDrag();
    currentDragObject.removeEventListener(MouseEvent.MOUSE_UP, stopDragging);

    currentDragObject.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
}

Также вы можете попробовать проверить это руководство, оно легко адаптируется к вашей проблеме. Я использовал этот код для одномерного слайдера, подобного тому, который вам нужен: http://www.flashandmath.com/basic/dragdroptour/dd_tour2.html

...