AS3计算器?

时间:2012-03-16 15:55:35

标签: actionscript-3

我正在完全通过动作脚本创建计算器,暂存区域没有任何内容。到目前为止,我正在进行计算。但是我似乎遇到了问题。我的代码示例如下所示:

import flash.events.MouseEvent;

var btn:Array = new Array();

for(var i = 0; i < 10; i++) {
var myBtn:Btn = new Btn();
myBtn.y = 15;
myBtn.x = i * 100 + 15;
myBtn.width = 48;
myBtn.height = 48;
myBtn.buttonMode = true;
myBtn.mouseChildren = false;
myBtn.num = Number(i);
myBtn.caption.text = String (i);
addChild(myBtn);
btn.push(myBtn);
btn[i].addEventListener(MouseEvent.CLICK,pressNumber);//EVENT TO ADD NUMBERS TO     DISPLAY 

}
btn[0].y += 370;
btn[0].x += 10;

btn[1].y += 310;
btn[1].x += -90;

btn[2].y += 310;
btn[2].x += -130;

btn[3].y += 310;
btn[3].x += -170;

btn[4].y += 250;
btn[4].x += -390;

btn[5].y += 250;
btn[5].x += -430;

btn[6].y += 250;
btn[6].x += -470;

btn[7].y += 190;
btn[7].x += -690;

btn[8].y += 190;
btn[8].x += -730;

btn[9].y += 190;
btn[9].x += -770;

//OPERATORS//
var operators:Array = new Array();
for(var io:int = 0; io < 6; io++) {
var opBtn:Btn_operator = new Btn_operator();
opBtn.width = 48;
opBtn.height = 48;
opBtn.buttonMode = true;
opBtn.mouseChildren = false;
opBtn.caption_op.text = String (".");
addChild(opBtn);
operators.push(opBtn);  
operators[io].addEventListener(MouseEvent.CLICK, pressOperator);//EVENT TO ADD   OPERATORS TO DISPLAY
}

//ADD DOT
var dot:Btn_dot = new Btn_dot();
dot.width = 48;
dot.height = 48;
dot.buttonMode = true;
dot.mouseChildren = false;
dot.caption_op.text = String (".");
addChild(dot);

dot.y += 383;
dot.x += 78;
dot.addEventListener(MouseEvent.CLICK, addDot);//EVENT TO ADD DOT TO DISPLAY

//BACKSPACE
var goBack:Btn_backspace = new Btn_backspace();
goBack.width = 48;
goBack.height = 48;
goBack.buttonMode = true;
goBack.mouseChildren = false;
goBack.caption_op.text = String ("<--");
addChild(goBack);

goBack.y += 203;
goBack.x += 256;
goBack.addEventListener(MouseEvent.CLICK, backSpace);//EVENT TO GO BACK SPACE IN DISPLAY

//BACKSPACE
var clearAll:Btn_clear = new Btn_clear();
clearAll.width = 48;
clearAll.height = 48;
clearAll.buttonMode = true;
clearAll.mouseChildren = false;
clearAll.caption_op.text = String ("C");
addChild(clearAll);


clearAll.y += 323;
clearAll.x += 256;
clearAll.addEventListener(MouseEvent.CLICK, clearFields);//EVENT TO GO BACK SPACE IN   DISPLAY

operators[0].y += 383;
operators[0].x += 138;
operators[0].caption_op.text = String("=");

operators[1].y += 383;
operators[1].x += 198;
operators[1].caption_op.text = String("/");

operators[2].y += 323;
operators[2].x += 198;
operators[2].caption_op.text = String("*");

operators[3].y += 263;
operators[3].x += 198;
operators[3].caption_op.text = String("-");

operators[4].y += 203;
operators[4].x += 198;
operators[4].caption_op.text = String("+");

operators[5].y += 263;
operators[5].x += 256;
operators[5].caption_op.text = String("-/+");


//VARIABLE HANDLE OPERATION NOT BUTTON
var operate:String;

//HANDLE FIRST AND SECOND VALUE
var num1:Number;
var num2:Number;

//grouping all buttons in function


//display_txt.text = "0";
//DISPLAYING NUMBERS IN DISPLAY
//var numberEntered:String ="";
function pressNumber(e:MouseEvent):void{
       display_txt.appendText(e.target.num);
}

//DISPLAY OPERATORS
function pressOperator(event:MouseEvent):void{
var operatorEntered:String;
trace("a",display_txt.text,display_txt.text.length,event.currentTarget.caption_op.t     ext,event.currentTarget.caption_op.text.length);
display_txt.appendText(event.currentTarget.caption_op.text);
//CHECKING FOR VALUES AND STORING NUMBERS
trace("b",display_txt.text);         
if(isNaN(num1)){
    //CONVERT STRING TO NUMBER
    num1=Number(display_txt.text);
    operate = operatorEntered;
    display_txt.text = "";
    //trace(num1,isNaN(num1)); // if this outputs some number and true, display_txt an         html enabled textfield, has kerning enabled or is a multiline textfield.  fix that.
}
else if(isNaN(num2)){
    num2 = Number(display_txt.text);
    //trace(num1,isNaN(num2)); // if this outputs some number and true,        display_txt an html enabled textfield, has kerning enabled or is a multiline textfield.  fix that.
    performCalculation();
    operate = operatorEntered;
}
}


//CLEARS DISPLAY AREA
function clearFields(event:MouseEvent):void{
display_txt.text = "";
num1=NaN;
num2=NaN;
}

//ADDS DECIMAL PLACE
function addDot(event:MouseEvent):void{
if(event.target.num == Number(display_txt.text))
{
display_txt.text = "0";
}
if (display_txt.text.indexOf(".")==-1){
    display_txt.appendText(".");
}

}
//BACKSPACE DISPLAY AREA
function backSpace(e:MouseEvent):void{
var temp_str:String = display_txt.text;
display_txt.text = temp_str.substr(0, (temp_str.length-1)); // Get rid of last      character in the string, which in this case is the phantom \r or \n character
}

function performCalculation():void{

switch (operate){
case "multiply":
    num1*=num2;
break;
case "divide":
    num1/=num2;
break;
case "subtract":
    num1-=num2;
break;
case "add":
    num1+=num2;
break;
    default:
break;
}
//now that we found out the result
//let's display on the window
display_txt.text=String(num1);
num2=NaN;

}

它似乎没有执行计算,并且在下面显示的代码中,它意味着调用函数来执行计算,但它似乎不再这样做了,当我尝试跟踪num1时当我点击操作员时,它显示按下最后一次按下的按钮,输出为NaN。

function pressOperator(event:MouseEvent):void{
var operatorEntered:String;
trace("a",display_txt.text,display_txt.text.length,event.currentTarget.caption_op.t    ext,event.currentTarget.caption_op.text.length);
display_txt.appendText(event.currentTarget.caption_op.text);
//CHECKING FOR VALUES AND STORING NUMBERS
trace("b",display_txt.text);         
if(isNaN(num1)){
    //CONVERT STRING TO NUMBER
    num1=Number(display_txt.text);
    operate = operatorEntered;
    display_txt.text = "";
    //trace(num1,isNaN(num1)); // if this outputs some number and true, display_txt an     html enabled textfield, has kerning enabled or is a multiline textfield.  fix that.
}
else if(isNaN(num2)){
    num2 = Number(display_txt.text);
    //trace(num1,isNaN(num2)); // if this outputs some number and true,     display_txt an html enabled textfield, has kerning enabled or is a multiline textfield.  fix that.
    performCalculation();
    operate = operatorEntered;
}
}

我认为它导致了NaN,因为没有任何东西进入vars for operations和operatorEntered但是它们都相互进入。我该如何解决?

1 个答案:

答案 0 :(得分:1)

这可能无法直接回答您的问题,但我建议您先了解如何在“纯”ActionScript 3项目中编写文档类。它不仅会迫使你“紧缩”你的代码,如果只是略微。但是你也可以使用一个合适的IDE(即免费的FlashDevelop),它具有更好的调试功能,可以帮助你更轻松地找到问题。

此外,如果您发布您希望其他人查看的代码,请确保其格式良好且易于阅读(至少缩进,最好带注释)。在这种情况下,它使用FLA文件中的内容,因此我们不能只复制您的代码并将其粘贴到我们的闪存中。 所有这些因素都让你很难帮到你。