【问题标题】:Flash if statement satisfies true and falseFlash if 语句满足真假
【发布时间】:2010-10-02 20:10:54
【问题描述】:

我有以下代码:

if(pickedUp == true){
    trace("released and picked up" + pickedUpNum);
    this.storedClick = false;
    this.onMouseMove = null;
    this.onMouseDown = null;
    this.onMouseUp = null;
    this.onEnterFrame = this.refresh;
    pickedUpNum++;
    if( pickedUpNum > 60) pickedUp = false;
}

if(pickedUp == false){
    trace("released and not picked up");
    this.storedClick = false;
    this.onEnterFrame = this.refresh;
    this.onMouseDown = this.onStoreDrag;
    this.onMouseUp = this.onClearStoreDrag;
    this.onMouseMove = null;
}

我在 60 左右得到这个输出:

released and picked up59
released and picked up60
released and not picked up
released and picked up61
released and not picked up  

这怎么可能?我一定错过了一些简单的东西。

我正在进行的项目实际上是在尝试模拟拿起一张纸并四处移动,然后将其放回原处。我正在尝试修改 Flash 页面翻转代码以创建此效果。

【问题讨论】:

  • 一个建议:按照脑海中的功能,从pickUpNum的值60开始。如果行为仍然让您感到惊讶,请告诉我们。并告诉我们为什么它令人惊讶以及代码应该做什么来让您满意(特别是“pickedUpNum++”行应该做什么。)
  • Bryan,请用 cmets 回答人们对您原始帖子的回答或编辑。当你写出新的答案并且他们被投票赞成或反对时,后来的观众不可能弄清楚被问到什么以及答案是什么。

标签: flash actionscript actionscript-2 conditional


【解决方案1】:

我同意什维拉姆的观点。学习如何使用逐步调试器是一项非常有价值的技能,它使错误更容易诊断。我会推荐 Flex 的调试器而不是 Flash 的调试器,但总比没有好。

【讨论】:

    【解决方案2】:

    不使用调试器? 使用 flex builder 构建代码并使用友好的编程环境 (eclipse) 有一个简单的方法来调试代码

    【讨论】:

      【解决方案3】:

      Bryan - 我盯着这个看了一会儿,想知道为什么你不能接受 Kyle 的回答,然后我突然想到你确实确实希望它这样做:

      released and picked up60
      released and not picked up
      

      问题是关于之后发生了什么。乍一看,您的问题被误解了,这是一个相当教科书式的例子,即有人可能在条件句中犯下的错误。 Micheal 似乎有正确的想法,因为给出的代码中没有任何内容可以解释它,但我还想补充一点,flash IDE 中的调试器虽然不完美,但对于追踪这类事情来说非常棒。

      【讨论】:

        【解决方案4】:

        查看初始条件 (pickedUpNum, pickedUp) = (59, true) 的跟踪。我们将执行第一个条件,并将1 添加到pickedUpNum。添加1pickedUpNum = 60 后,我们不执行内部条件,pickedUp 仍然设置为true。有了这个值,我们就跳过了第二个条件。

        所以我们在 (pickedUpNum,pickedUp) = (60,true)。我们再次执行第一个条件,并将1 添加到pickedUpNum。现在,pickedUpNum = 61,所以我们执行内部条件并设置pickedUp = false。使用这个新值,将执行第二个条件。

        (对不起,如果我是迂腐的,有时最好是明确的:))

        编辑:谢谢,大卫,你发现我的逻辑错字

        【讨论】:

        • 有一个错字:在第一段中,您的意思可能是“pickedUp 仍然设置为 TRUE”。
        【解决方案5】:

        如果您编写的代码处于循环中,则在检查 (pickedUp == false) 之后,pickedUp 会以某种方式设置为 true。所以,下一次循环会发生什么(比如当pickUpNum == 61时),pickUp将为真,true语句将运行,然后pickUp将再次设置为false(在“true”的末尾check) 允许运行错误的检查语句。

        确保您没有在错误检查后将pickUp重置为true(并且当pickUpNum > 60时,根据您的代码)并且它应该按您的意愿工作。

        【讨论】:

          【解决方案6】:

          回答你所有的问题

          • 是的,代码在循环中。 (onEnterFrame)

          • 我知道我可以使用“else if”,但如果我确实使用了 else,第二个条件将永远不会执行。

          • 我知道我不需要使用 == 并且可以使用 not 运算符 (!),但由于遇到问题,我决定明确说明

          • 我不明白 Kyle 如何在他的代码中解释该解决方案,以及为什么其他人认为这是一个解决方案 (+2)。

          问题仍然是如何满足两个条件(pickUp 是真假) 一旦pickUpNum达到61并且pickUp设置为false..

          【讨论】:

          • 我认为问题与迈克尔指出的相似;如果 bool 为真且 int > 60,则每次都会遇到此问题。我同意您将 bool 设置在循环开头的诊断。
          【解决方案7】:

          好的,有几件事。首先,您不需要为布尔值说“== true”。其次,一般不要使用“==false”使用“!” (非符号),但在您的情况下,只需使用“else”

              if(pickedUp){
                          trace("released and picked up" + pickedUpNum);
                          this.storedClick = false;
                          this.onMouseMove = null;
                          this.onMouseDown = null;
                          this.onMouseUp = null;
                          this.onEnterFrame = this.refresh;
                          pickedUpNum++;
                          if( pickedUpNum > 60) pickedUp = false;
                  }  else {
                      trace("released and not picked up");
                      this.storedClick = false;
                      this.onEnterFrame = this.refresh;
                      this.onMouseDown = this.onStoreDrag;
                      this.onMouseUp = this.onClearStoreDrag;
                      this.onMouseMove = null;
              }
          

          【讨论】:

          • 我当然可以反对你重新散列已经解释过的内容,但这当然是幼稚的......
          【解决方案8】:

          到了61,执行第二个条件应该怎么办?

          如果您的代码不在循环中,请检查pickUp 和pickUpNum 是否在第一个条件之外的其他地方更改。

          【讨论】:

            【解决方案9】:

            我怀疑你的代码每次循环都会重置标志。

            wile (true)
            {
                boolean pickedUp = true // Move this outside the loop ^^
            
                if (pickedUp == true)
                ....
            }
            

            【讨论】:

            • 通常最好避免在所有 ECMAScript 语言中使用“while”,这可能会严重影响性能。
            • while 循环与基于 ECMAScript 的语言中的任何其他类型的循环相比没有明显的性能差异。 while 循环基本上是一个没有初始化程序或计数表达式的 for 循环。它只有条件循环测试。
            【解决方案10】:

            我不确定我是否完全理解您要完成的工作,因为您没有解释您期望发生的事情。但是你不是要这样做吗?

            if(pickedUp == true){
            
            }
            else
            if(pickedUp == false){
            
            }
            

            【讨论】:

            • 抱歉 -1,因为您不需要“== true”或“== false”或“else if”。
            • OP与编码风格建议无关,请不要因为与您的风格不同而标记他人。
            • +1 这完全正确,原来的问题是缺少else。 == 来自原版。这是最直接、最简洁的回答方式。 kyle 的回答更完整,但仍然都是正确的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-31
            • 1970-01-01
            • 1970-01-01
            • 2021-06-20
            • 2012-12-17
            • 1970-01-01
            相关资源
            最近更新 更多