为什么这个Switch / Case语句总是执行默认值? AS3

时间:2014-02-21 04:55:01

标签: actionscript-3

这个switch / case语句总是默认,我不希望发生这种情况。此外,我没有错误。有人可以告诉我我的问题是什么吗?该功能总能追踪我的预期,但我希望它能在推台上放置推土机。

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.ui.Mouse;

//START SCREEN
var startScreen: MovieClip;
var bulldozer: MovieClip;


startClick.addEventListener(MouseEvent.CLICK, startGame);

function startGame(event: MouseEvent): void {
    startScreen.parent.removeChild(startScreen);
startClick.parent.removeChild(startClick);
var enemyGenerator: Number = Math.random();
switch (enemyGenerator) {
    case 0.8 <= enemyGenerator && enemyGenerator <= 1:
        stage.addChild(bulldozer);
        bulldozer.x = stage.x = 150;
        bulldozer.y = stage.y = 150;
        break;
    case 0.6 <= enemyGenerator && enemyGenerator < 0.8:
        stage.addChild(bulldozer);
        bulldozer.x = stage.x = 250;
        bulldozer.y = stage.y = 250;
        break;
    case 0.4 <= enemyGenerator && enemyGenerator < 0.6:
        stage.addChild(bulldozer);
        bulldozer.x = stage.x = 350;
        bulldozer.y = stage.y = 350;
        break;
    case 0.2 <= enemyGenerator && enemyGenerator < 0.4:
        stage.addChild(bulldozer);
        bulldozer.x = stage.x = 400;
        bulldozer.y = stage.y = 400;
        break;
    case 0 <= enemyGenerator && enemyGenerator < 0.2:
        stage.addChild(bulldozer)
        bulldozer.x = stage.x = 450;
        bulldozer.y = stage.y = 450;
        break;
    default:
        trace (enemyGenerator);
}
startClick.removeEventListener(MouseEvent.CLICK, startGame);
}

4 个答案:

答案 0 :(得分:1)

因为你错了。

问题1 enemyGenerator变量的值类型是什么?    - 答案:int

问题2:您的切换条件的值类型是什么?    - 答案:布尔

因此将int与布尔值进行比较总是假的......

 ex: 0.9 == true  // will be false 

您需要将您的开关更改为IF-ELSE IF条件......如下所示

var enemyGenerator: Number = Math.random();

if(enemyGenerator >= 0.8) 
{
    stage.addChild(bulldozer);
    bulldozer.x = stage.x = 150;
    bulldozer.y = stage.y = 150;
}
else if(enemyGenerator >= 0.6)
{
    stage.addChild(bulldozer);
    bulldozer.x = stage.x = 250;
    bulldozer.y = stage.y = 250;
} 
else if(enemyGenerator >= 0.4)
{
    stage.addChild(bulldozer);
    bulldozer.x = stage.x = 350;
    bulldozer.y = stage.y = 350;
}    
else if(enemyGenerator >= 0.2)
{
    stage.addChild(bulldozer);
    bulldozer.x = stage.x = 400;
    bulldozer.y = stage.y = 400;
}
else
{
    stage.addChild(bulldozer)
    bulldozer.x = stage.x = 450;
    bulldozer.y = stage.y = 450;
}

另外,为什么不在IF语句之前或之后添加子buldozer ..除了在每个if / case分支中总是写它?

答案 1 :(得分:0)

案例陈述仅在您完全等同时才起作用。像这样:

case condition 1:

如果您想进行比较,则需要将其转换为ifelse if

答案 2 :(得分:0)

您的个案陈述无效。 Switch-case操作符仅执行相等性检查。如果您执行Math.random()调用,则会收到一个永远不会严格等于某个值的值。要从给定的N种可能性中进行选择,您可以使用int并像这样随机调用:

var r:int=Math.floor(N*Math.random());

然后,r将保存一个从0到N-1的值,然后您可以切换。

switch(r) {
    case 0: // bla bla
    case 1: // bla bla bla
    ...
    case N-1: // you know the drill
}

答案 3 :(得分:0)

这是一个棘手的问题。一旦以上人员回答正确的事情就是动作脚本有它的技巧。

如果您只是将switch (enemyGenerator)替换为switch (true),那么您的开关可以正常工作。

我只想表明你想做的事情是可能的,但我建议使用Adrian所描述的if语句。

干杯