AS3: не удается очистить строки

#actionscript-3 #line

#actionscript-3 #строка

Вопрос:

Итак, что я настроил, так это экран разблокировки шаблона с точками, и вы рисуете свой шаблон, после чего экран разблокируется. Но проблема в том, что шаблон не будет завершен, если вы не наведете курсор мыши непосредственно на точку. Если вы пройдете точку, ничего не произойдет, но строки останутся на экране, и вы по-прежнему будете находиться на экране блокировки. Затем используемому пользователю придется щелкнуть, чтобы очистить строки, и повторить попытку. Я поиграл с этим, но, похоже, не могу понять, почему это так работает.

Вот код

 package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import fl.transitions.Tween;
    import fl.transitions.easing.Strong;
    import flash.display.Shape;



    public class Main extends Sprite
    {    
        private var lineContainer:Shape = new Shape();
        private var dots:Array = []; // Stores the in stage movieclips
        private var pattern:Array = []; //The pattern entered by the user 
        private var pass:Array;

        public function Main():void
        {
            dots = [one,two,three,four,five,six,seven,eight,nine]; //add the clips in stage
            pass = [one,four,seven,eight,five,two]; //The correct pattern to proceed
            addChildAt(lineContainer, this.getChildIndex(one)); //the line container right behind the first dot.
            addListeners();
        }

        private function addListeners():void //adds the listeners to each dot
        {
            var dotsLength:int = dots.length;

            for (var i:int = 0; i < dotsLength; i  )
            {
                dots[i].addEventListener(MouseEvent.MOUSE_DOWN, initiatePattern);
                dots[i].addEventListener(MouseEvent.MOUSE_UP, stopPattern); 

            }
        }

        /* Adds a mouse over listener and uses it to add the number of the dot to the pattern */

        private function initiatePattern(e:MouseEvent):void
        {
            pattern = []; //reset array
            lineContainer.graphics.clear(); //clear lines

            for (var i:int = 0; i < dots.length; i  )
            {
                dots[i].addEventListener(MouseEvent.MOUSE_OVER, addPattern);
            }

                    addPattern(e); //trigger the mouse over for this element
        }

        private function addPattern(e:MouseEvent):void
        {
            if (pattern.indexOf(e.currentTarget) == -1) { 
                pattern.push(e.currentTarget); //adds the pattern on mouse over
                drawLines();

                var dot:MovieClip = MovieClip(e.currentTarget);
                if(dot.currentFrame < 2) dot.play(); //play only if on the first frame
            }
        }

        private function drawLines():void {
            lineContainer.graphics.clear(); //clear the current lines
            lineContainer.graphics.lineStyle(5, 0x00FF00); //thickness (8px) and color (green) of the lines

             if (pattern.length > 1) { //don't draw if there aren't at least two dots in the pattern
             lineContainer.graphics.moveTo(pattern[0].x   pattern[0].width * .0, pattern[0].y   pattern[0].height * .0); //move to first
         for (var i:int = 1; i < pattern.length; i  ) {
        lineContainer.graphics.lineTo(pattern[i].x   pattern[i].width * .0, pattern[i].y   pattern[i].height * .0); //draw a line to the current dot
    }
          }

              lineContainer.graphics.endFill();

        }

        private function stopPattern(e:MouseEvent):void //stops storing the pattern on mouse up
        {
            for (var i:int = 0; i < dots.length; i  )
            {
                dots[i].removeEventListener(MouseEvent.MOUSE_OVER, addPattern);
                dots[i].gotoAndStop(1); //go back to the first frame
            }

            checkPattern();
        }

        private function checkPattern():void //compares the patterns
        {
            var pLength:int = pass.length;
            var correct:int = 0;

            for (var i:int = 0; i < pLength; i  ) //compares each number entered in the user array to the pass array
            {
                if (pass[i] == pattern[i])
                {
                    correct  ;
                }
            }

            if (correct == pLength) //if the arrays match
            {
              //Hides Sign In
              MovieClip(root).LockScreen.visible = false;
              MovieClip(root).RTID.visible = false;
              MovieClip(root).SignIn.visible = false;
              //Turns On Main Menu
              MovieClip(root).gamemenu_mc.visible = true;
              MovieClip(root).biggamesmenu_mc.visible = true;
              MovieClip(root).totaltextmenu_mc.visible = true;
              MovieClip(root).tmenu_mc.visible = true;
              MovieClip(root).smenu_mc.visible = true;
              MovieClip(root).optionsmenu_mc.visible = true;
            }

            pattern = []; //clears the user array
            lineContainer.graphics.clear(); //clear the lines

        }
    }
}
  

Комментарии:

1. наведите курсор мыши на Android? Вы уверены, что эти события действительно запускаются?

2. Да, именно так работает AS3, я еще не тестировал его на сенсорном экране, но из того, что я прочитал, и мне сказали, что он должен работать должным образом @BotMaster

3. Я думаю, вам сначала следует убедиться, что наведение курсора мыши действительно приводит к результату. Если этого не произойдет, то весь вопрос неразрешим.

4. Это слишком запутанно, вопрос помечен как Android, но вы не тестировали его в Android? Итак, почему он помечен как Android, если эта платформа отсутствует на картинке? На какой платформе вы пытаетесь заставить это работать?

5. @BotMaster mouseOver запускается одновременно mouseDown или dragOver выполняется в actionscript на устройстве Android (я только что отладил это на своем телефоне). Хотя событие неоднозначно, его можно обнаружить, но оно не имеет той интерпретации, которая была бы на устройстве с указателем

Ответ №1:

Все, что вам нужно сделать, это добавить MOUSE_UP прослушиватель на сцену вместо каждой точки.

  1. Удалите эту строку методом addListeners:

     dots[i].addEventListener(MouseEvent.MOUSE_UP, stopPattern); 
      
  2. В методе initiatePattern добавьте эту строку:

     stage.addEventListener(MouseEvent.MOUSE_UP, stopPattern); 
      
  3. В методе stopPattern добавьте эту строку:

     stage.removeEventListener(MouseEvent.MOUSE_UP, stopPattern);
      

Теперь независимо от того, где находится курсор, когда вы отпускаете мышь (пока приложение находится в фокусе), это остановит шаблон.

Кроме того (согласно некоторым комментариям), события мыши отлично работают на мобильных устройствах, пока вы не включили мультитач.


ВОТ как теперь должны выглядеть измененные методы:

     private function addListeners():void //adds the listeners to each dot
    {
        var dotsLength:int = dots.length;

        for (var i:int = 0; i < dotsLength; i  )
        {
            dots[i].addEventListener(MouseEvent.MOUSE_DOWN, initiatePattern);
        }
    }

    /* Adds a mouse over listener and uses it to add the number of the dot to the pattern */

    private function initiatePattern(e:MouseEvent):void
    {
        pattern = []; //reset array
        lineContainer.graphics.clear(); //clear lines

        for (var i:int = 0; i < dots.length; i  )
        {
            dots[i].addEventListener(MouseEvent.MOUSE_OVER, addPattern);
        }

        stage.addEventListener(MouseEvent.MOUSE_UP,stopPattern);
        addPattern(e); //trigger the mouse over for this element
    }

    private function stopPattern(e:MouseEvent):void //stops storing the pattern on mouse up
    {
        for (var i:int = 0; i < dots.length; i  )
        {
            dots[i].removeEventListener(MouseEvent.MOUSE_OVER, addPattern);
            dots[i].gotoAndStop(1); //go back to the first frame
        }

        stage.removeEventListener(MouseEvent.MOUSE_UP,stopPattern);
        checkPattern();
    }
  

И просто для развлечения, вот немного более эффективный способ проверить правильность шаблона.

     private function checkPattern():void //compares the patterns
    {
        var correct:Boolean = true;

        for (var i:int = 0; i < pass.length; i  ) //compares each number entered in the user array to the pass array
        {
            if (pattern.length != pass.length || pass[i] != pattern[i]) //this way if they select less than the correct amount of dots, it won't error, and you stop the loop as soon as there's something incorrect
            {
                correct = false;
                break;
            }
        }

        if (correct) //if the arrays match
        {.....
  

Комментарии:

1. Спасибо за очень полезную информацию, но шаблон по-прежнему продолжается после точек, и он больше не работает с этим добавленным кодом. Есть идеи, почему?

2. Теперь он очищается должным образом, просто он удалил линию из чертежа, и как только вы создадите правильный шаблон, ничего не произойдет

3. Я хочу сказать, что это потому, что на самом деле он больше не «подбирает» точки, по которым вы проходите, следовательно, почему линия не рисуется, а шаблон не принимается

4. Ни одно из изменений кода в моем ответе не привело бы к тому, что точки не работали. Вы уверены, что не удалили что-то, чего нет в моем ответе? Нравится MOUSE_OVER прослушиватель?

Ответ №2:

Вы проверяете шаблон только в MOUSE_UP событии. Вам нужно это проверить MOUSE_OVER . Добавьте вызов checkPattern() в addPatern() .

 if (pattern.indexof(e.currentTarget)==-1) {
   patern.push(e.currentTarget);
   drawLines();

   var dot:MovieClip = MovieClip(e.currentTarget);
   if(dot.currentFrame < 2) dot.play();

   checkPattern(); // <---
}
  

Когда пользователь наводит курсор мыши на точки, вызывается программа addPatern() , которая затем проверяет шаблон, чтобы убедиться, что он правильный. (он же. if (correct=pLength) )

Редактировать:

Вам нужно поместить вызов для очистки строк и шаблона в if инструкцию, где вы фактически проверяете правильность шаблона. Вот почему строки не отображаются.

 if (correct==pLength)
{
  ...

  // Set pattern to [], clear screen, etc.
}
  

Комментарии:

1. извините, что проголосовал против, но вопрос помечен как Android, поэтому я не думаю, что наведение курсора мыши — это вариант.

2. Добавление этого checkPattern(); там больше не позволяет рисовать линию, а также точки по-прежнему остаются светлыми, когда вы проходите мимо них

3. @BotMaster Я предложил MOUSE_OVER, потому что OP настраивает прослушиватели MOUSE_OVER в initiatePattern().

4. удаляя голосование «Против», я думаю, что вопрос искажен и вводит в заблуждение. Пользователь говорит, что он не тестирует на Android, но вопрос помечен как Android.

5. проверка шаблона при наведении курсора мыши на каждую точку упрощает случайное угадывание шаблона. Если здесь используется Android, то вы проверяете шаблон только при наведении курсора мыши (когда пользователь закончит вводить шаблон)