Search code examples
actionscript-3flash

How to create a sequence of clicks in ActionScript?


I am creating a puzzle in which the player have to click on the buttons on the right order or sequence to go to the next level (Scene 2 for example). I don't know how to do it. If any one have any idea to how to achieve this in Action Script.

Thank you

Scene 1:

enter image description here

each number is a button. Now the player has to click in the right order or sequence (1 2 3 4 5 6 7 8) to open the next level (Scene 2)

var checkString:String = "";

//Create event listeners and their functions.
btn1.addEventListener(Mouse.CLICK, oneClick);
btn2.addEventListener(Mouse.CLICK, twoClick);
btn3.addEventListener(Mouse.CLICK, threeClick);
btn4.addEventListener(Mouse.CLICK, fourClick);
btn5.addEventListener(Mouse.CLICK, fiveClick);
btn6.addEventListener(Mouse.CLICK, sixClick);
btn7.addEventListener(Mouse.CLICK, sevenClick);
btn8.addEventListener(Mouse.CLICK, eightClick);


function oneClick(evt:Event):void
{
   //In each event listener function, add a letter or 
   //string to the checkString variable.
   checkString += "on";

   //Then, see if the string matches or not.
   check();
}

function twoClick(evt:Event):void
{
   checkString += "tw";
   check();
}

function threeClick(evt:Event):void
{
   checkString += "th";
   check();
}

function fourClick(evt:Event):void
{
   checkString += "fo";
   check();
}

function fiveClick(evt:Event):void
{
   checkString += "fi";
   check();
}

function sixClick(evt:Event):void
{
   checkString += "si";
   check();
}

function sevenClick(evt:Event):void
{
   checkString += "se";
   check();
}

function eightClick(evt:Event):void
{
   checkString += "ei";
   check();
}



//If the proper sequence is one, two, three, four, five, six, seven, eight the string would read "ontwthfofisiseei".
function check():void
{
   if(checkString == "ontwthfofisiseei")
   {
      //Clear the checkString for convenience before going on.
      clearString();
      //CODE TO GO TO NEW FRAME

gotoAndPlay(1, "Scene 3");
   }

}

function clearString():void
{
   //You will want to have a function for clearing the string.
   //This is especially useful if you have a button for "start over."
   checkString = "";
}

this the code i used before but it show error in the listener and it doesn't. work


Solution

  • To answer your updated question:

    Your error is likely that Mouse.CLICK should be MouseEvent.CLICK.

    Your other error is telling you that there is no scene called "Scene 3"


    Let's assume you have 8 MovieClips (or buttons) that are on a timeline in Flash/Animate.

    One (of many) ways to accomplish this would be the following:

    1. Give each of those buttons an instance name. To make for less code, lets give them the name btn + their respective correct order number - so btn1, btn2, btn3 etc.

    2. You'll need to add a click listener to each button, so they can have something happen when they are clicked.

      You could do this 8 times (one for each button): btn1.addEventListener(MouseEvent.CLICK, buttonClick); but to make things simpler, you can just iterate through all the objects on the timeline and add the listener to each object whose name starts with "btn":

      var totalBtns:int = 0; //create a var to store how many buttons there are
      //loop through each child of the current timeline
      var i:int = numChildren;
      while(i--){
          //if the child's name starts with 'btn'
          if(getChildAt(i).name.indexOf("btn") == 0){
              //add the click listener
              getChildAt(i).addEventListener(MouseEvent.CLICK, buttonClick,false,0,true);
              totalBtns++; //increase the total buttons variable by 1
          }
      } 
      

      This also means less work later if you add/remove buttons

    3. You need a way to track when a button was clicked. To accomplish this, we'll use an array.

      var clickArray:Array = []; //this creates a new array
      //When a button is clicked, you add it to this array
      
    4. lets create the function that is called when a button is clicked:

      function buttonClick(e:Event):void {
          //add the item that was just clicked (represented by the event's currentTarget property) to the array
          //so if btn1 was just clicked, btn1 would be e.currentTarget
          clickArray.push(e.currentTarget);
      
          //now disable the button so it can't be clicked anymore
          SimpleButton(e.currentTarget).enabled = false;
      
          //check if all button have been clicked
          if(clickArray.length == totalBtns){
      
             //lets go through every item in the array, and see if it's in the right order
             var ctr:int = 0; //a counter to keep track of the expected next number         var i:int = 0; //iterator for the for loops
             for(i=0;i<clickArray.length;i++){
                 //lets convert everything after the 3rd character of the name to a number - so for btn1, that would be 1
                 if(parseInt(clickArray[i].name.substring(3)) == ctr + 1){
                    ctr++; //increment the counter to the next expected number
                 }else{
                    break; //leave the for loop early since a click was out of place
                 }
             }
      
             //if the correct order was achieved
             if(ctr == totalBtns){
                 nextScene(); //or however you continue
             }else{
                 //the correct order was NOT acheived
      
                 //make all the buttons clickable again
                 for(i=0;i<clickArray.length;i++){
                     SimpleButton(clickArray[i]).enabled = true;
                 }
      
                 //reset the array
                 clickArray = [];
      
                 //probably want to tell the user to try again
             }
          }
      }