actionscript-3 - Flash ActionScript : moneycounter code not behaving correctly

标签 actionscript-3 flash actionscript actionscript-2

我正在尝试在 Adob​​e Flash (Animate) 动画中设置虚拟巴士售票机。

前提是您必须在投币口输入准确的票价,因为司机不找零钱。确切的票价是2美元。该机器可接受 5 美分、10 美分、25 美分、1 美元、5 美元、10 美元和 20 美元面额。如果输入的金额超过 2 美元,则会弹出一条消息,提示“请仅提供准确票价。司机无法找零。”因此,在本例中,只有 5 美分、10 美分、25 美分和 1 美元面额才有效,但必须输入这些面额,使其总和恰好为 2 美元。

下面的代码对于单独使用 25 分和 1 美元面值以及组合使用 25 分和 1 美元面值的情况均正确,但当单独使用 5 分和 10 分面值或与 25 分和 1 美元面值组合使用时,代码会出现不稳定的情况。例如,如果您尝试仅使用 10 美分来达到 2 美元,则总额会达到 1.90 美元,但当您输入最后 10 美分时不会支付票价。相反,会触发弹出的“请仅提供准确票价”消息。如果您随后添加 5 分钱,总金额将达到 1.95 美元,但当您输入最后 5 分钱时,将不再支付票价。相反,会弹出“请提供准确票价”。消息再次被触发。

输入 $1,然后再输入 $1 效果很好。输入 8 个季度的效果与输入 1 美元和 4 个季度的效果一样。无法弄清楚问题是什么。将不胜感激任何帮助。 谢谢!

代码如下:

var Cash = 00.00
var payola = Money.text = "02.00";
Money.text = "$" + Cash.toFixed(2);
popup.visible = false;


nickel_btn.addEventListener(MouseEvent.CLICK, add5cents);

function add5cents(event:MouseEvent):void
{
    nickelcoin_mc.gotoAndPlay ("nickel_pay"); 
    Cash+=00.05;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        nickelcoin_mc.gotoAndPlay ("nickel_nopay");
        Cash-=00.05;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

dime_btn.addEventListener(MouseEvent.CLICK, add10cents);

function add10cents(event:MouseEvent):void
{
    dimecoin_mc.gotoAndPlay ("dime_pay"); 
    Cash+=00.10;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        dimecoin_mc.gotoAndPlay ("dime_nopay");
        Cash-=00.10;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

quarter_btn.addEventListener(MouseEvent.CLICK, add25cents);

function add25cents(event:MouseEvent):void
{
    quartercoin_mc.gotoAndPlay ("quarter_pay"); 
    Cash+=00.25;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        quartercoin_mc.gotoAndPlay ("quarter_nopay");
        Cash-=00.25;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

one_btn.addEventListener(MouseEvent.CLICK, add$1);

function add$1(event:MouseEvent):void
{
    onebill_mc.gotoAndPlay ("one_pay"); 
    Cash+=01.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        onebill_mc.gotoAndPlay ("one_nopay");
        Cash-=01.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

five_btn.addEventListener(MouseEvent.CLICK, add$5);

function add$5(event:MouseEvent):void
{
    fivebill_mc.gotoAndPlay ("five_pay"); 
    Cash+=05.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        fivebill_mc.gotoAndPlay ("five_nopay");
        Cash-=05.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

ten_btn.addEventListener(MouseEvent.CLICK, add$10);

function add$10(event:MouseEvent):void
{
    tenbill_mc.gotoAndPlay ("ten_pay"); 
    Cash+=10.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        tenbill_mc.gotoAndPlay ("ten_nopay"); 
        Cash-=10.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}

twenty_btn.addEventListener(MouseEvent.CLICK, add$20);

function add$20(event:MouseEvent):void
{
    twentybill_mc.gotoAndPlay ("twenty_pay"); 
    Cash+=20.00;
    Money.text = "$" + Cash.toFixed(2);
    if(Cash == payola){
      setTimeout(delay, 500);
      function delay(){
        gotoAndStop(46);
        }
    }
    if(Cash > payola){
        twentybill_mc.gotoAndPlay ("twenty_nopay");
        Cash-=20.00;
        Money.text = "$" + Cash.toFixed(2);
        popup.visible = true;
    }
    else {
        popup.visible = false;
    }
}


stop();

最佳答案

这可能是由 float 引起的问题。尝试将其放入您的代码中并检查控制台输出:

// Expect result to be 0.1
trace(0.3-0.2);

0.09999999999999998

// Adding lots of 5 cent coins. Expect result to be 0.5
trace(0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05);

0.49999999999999994

您的 == 比较有时会失败,因为将 float 相加可能会产生意外的值。这个答案很好地解释了这个问题:https://stackoverflow.com/a/3730040/11678918

对于您的情况,尝试将 Cash 变量更改为 int,并存储美分而不是美元:

var Cash:int = 0;
var payola:int = 200; // 2 dollars

// Add 5 cents
Cash += 5;

// Adding 1 dollar
Cash += 100;

// Printing out the amount in dollars and cents
Money.text = "$" + (Cash / 100).toFixed(2);

// Our exact check is safe now that we avoid floats.
if(Cash == payola) { ... }

关于actionscript-3 - Flash ActionScript : moneycounter code not behaving correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56843335/

相关文章:

actionscript-3 - Actionscript 3.0 MovieClip 帧更改监听器

actionscript-3 - 哪些设备支持 adobe air?

apache-flex - 从 Flex 3 安全访问 .NET Web 服务

javascript - 在此网站上运行的交互式动画角色。这个怎么做?

flash - 在网页上播放多播视频的选项

java - 从移动物体的速度 x,y 获取旋转角度?

javascript - Chrome 通知/权限栏 - 检测是否可见

javascript - 未捕获错误 : ERROR: . .. 找不到 ZeroClipboard JS 对象

flash as3 使用 curveTo 绘制一个 donut 楔形(具有内外半径的圆弧)

apache-flex - 如何删除 BitmapData 对象中的区域?