如何检查用户是否在较大的对象之前点击了较小的对象?

时间:2015-04-14 03:21:11

标签: actionscript-3 if-statement boolean flash-cs6 boolean-logic

嘿所有人所以我目前正在开发游戏,目标是让用户点击舞台上的对象。但是,用户必须先在用户单击较小的对象之前单击最大的对象。我想说,如果用户首先点击较小的对象而不是较大的对象,则游戏将结束。我以为我可以为舞台上的每个对象设置布尔值,但我的if语句不是在这里切割它是我如何设置的:

以下是我使用的物品和布尔值:

//Add box references
    public var box_1:MovieClip;
    public var box_2:MovieClip;
    public var box_3:MovieClip;
    public var box_4:MovieClip;

    //Booleans
    private var b1:Boolean;
    private var b2:Boolean;
    private var b3:Boolean;
    private var b4:Boolean;

现在我将所有布尔值设置为false,如果用户点击其中一个对象,我将布尔值设置为true。

以下是我的主要ENTER_FRAME监听器的if语句:

    private function level_1():void 
    {

        if (b1)
        {
            mainScreen.box_1.gotoAndPlay("B1GONE");
            b1 = false;
        }else
        if (b2)
        {
            mainScreen.box_2.gotoAndPlay("B2GONE");
            b2 = false;
        }else
        if (b3)
        {
            mainScreen.box_3.gotoAndPlay("B3GONE");
            b3 = false;
        }else
        if (b2 && !b1)
        {
            endGameCondition();
        }

    }

在此声明中:

if (b2 && !b1)
        {
            endGameCondition();
        }

我试图说明如果box_2为真意味着它的点击和box_1还没有被点击,这是一个更大的对象,那么游戏现在已经结束了,因为用户没有先点击最大的对象。我将它设置为box_1是最大的对象,其他的是下一个尺寸。

任何人都可以看到为什么这种方法无法正常工作或者有更好的方法吗?

****更新我的主要课程现在如何设置**************

我添加了所有电影片段和变量:

public class boxTapEngine extends MovieClip 
{

    //Screens
    private var mainScreen:mcMainScreen;



    //Add box references
    public var box_1:MovieClip;
    public var box_2:MovieClip;
    public var box_3:MovieClip;
    public var box_4:MovieClip;


    private var aBoxesArray:Array;

在我的构造函数中:

         aBoxesArray = [box_1, box_2, box_3, box_4];

        //AddMainScreen
        mainScreen = new mcMainScreen();
        mainScreen.x = (stage.stageWidth / 2);
        mainScreen.y = (stage.stageHeight / 2);
        stage.addChild(mainScreen);

        //Initiate numbers
        nLevel = 1;

        for each(var box:MovieClip in aBoxesArray)
        {
            box.addEventListener(MouseEvent.CLICK, boxClick);
        }

最后在boxClick函数:

private function boxClick(e:MouseEvent):void 
    {

         var box:MovieClip = e.currentTarget as MovieClip; //get a reference to one that was just clicked
         box.mouseEnabled = false; //we'll use this as a flag to know if it's been clicked yet
         box.gotoAndPlay("BGONE");


          //check to see if previous boxes have been clicked.
         //this will iterate through all the boxes in order
         for (var i:int = 0; i < aBoxesArray.length; i++)
         {
             if(aBoxesArray[i] == box) return; //if we've reached the currently clicked box, all is good, no need to keep checking so let's exit this loop and function
             if (!aBoxesArray[i].mouseEnabled)
             { //one of the previous boxes hasn't been clicked yet
                 endGameCondition();
             }
         }

    }

2 个答案:

答案 0 :(得分:1)

可能无法正常工作,因为您的最终else if声明无法达成(因为您之前正在处理b2 == true,之后会绕过所有其他声明)。当你提前处理它时,再加上你的设置b2为false,所以它在你的最终陈述时总是假的。

如果在检查其他事情之前,你需要移动最后一个。参见代码注释:

    //Do this first, and not as a else if
    if (b2 && !b1){
        endGameCondition();
        return; //no need to check checking things if it's game over
    }

    //now you can do the rest
    if (b1)
    {
        mainScreen.box_1.gotoAndPlay("B1GONE");
        b1 = false;
    }else
    if (b2)
    {
        mainScreen.box_2.gotoAndPlay("B2GONE");
        b2 = false;
    }else
    if (b3)
    {
        mainScreen.box_3.gotoAndPlay("B3GONE");
        b3 = false;
    }

顺便说一句,你不需要输入框处理程序,你可以点击查看所有内容。像这样的东西会起作用:

var boxes:Array = [box_1,box_2,box_3,box_4]; //make sure this is in order of what needs to be clicked first

//if you wanted to actually sort them dynamically based off total size (regardless of what order you've stuffed them in the array), you could add in something like this, which will order them from biggest to smallest:
boxes.sort(function(a,b){
    //compare which item has a greater total area (width * height)
    if(a.width * a.height > b.width * b.height) return -1; //A is bigger, so put a before b in the array
    if(a.width * a.height < b.width * b.height) return 1; //put b before a in the array
    return 0; //return 0 if they are the same
});




for each(var box:MovieClip in boxes){
    box.addEventListener(MouseEvent.CLICK, boxClick,false,0,true);
}

function boxClick(e:Event):void {
    var box:MovieClip = e.currentTarget as MovieClip; //get a reference to one that was just clicked

    box.mouseEnabled = false; //we'll use this as a flag to know if it's been clicked yet
    box.gotoAndPlay("BGONE");

    //or you could just do this to get rid of the box:
    if(box.parent) box.parent.removeChild(box);

    //check to see if previous boxes have been clicked.
    //this will iterate through all the boxes in order
    for(var i:int=0;i<boxes.length;i++){
        if(boxes[i] == box) return; //if we've reached the currently clicked box, all is good, no need to keep checking so let's exit this loop and function
        if(!boxes[i].mouseEnabled){ //one of the previous boxes hasn't been clicked yet
            endGameCondition();
        }
    }
}

答案 1 :(得分:1)

//Store your clips in an array
var myClips:Array = [mc1,mc2,mc3,mc4];

//get the clip sizes and store it to an array.
var sizes:Array = new Array();
for (var i:uint = 0; i < myClips.length; i++) {
    sizes.push(myClips[i].width);
}

//apply Numeric array sort. 
sizes.sort(Array.NUMERIC);
function onClickAction(e:MouseEvent):void { 
    //Check wheather the array is empty or not.
    if (sizes.length != 0) {
        //Check wheather the clicked object bigger or not.
        if (e.target.width == sizes[sizes.length - 1]) {
            trace("Bigger");
            e.target.alpha = .5;
            sizes.splice(sizes.length-1,1);         
        } else {
            trace("Smaller");
        }
    }
}