范围错误在一个程序中但在另一个程序中正常工作

时间:2014-07-22 06:57:50

标签: actionscript-3 flash

如果答案显而易见,我很陌生。基本上我有这个程序名为测试的东西,由其他人制作,你可以从影片剪辑中绘制多个孩子,它工作正常。 然而另一个,我移植和调整代码给了我一个错误

RangeError:错误#1125:索引-1超出范围13。     在jocAmare2_fla :: MainTimeline / endDragIt()

非常感谢任何和所有帮助。

https://www.dropbox.com/s/ciy0l2s7hys5lte/test%20stuffs%20for%20the%20things.fla

https://www.dropbox.com/s/9m5s98hq3d3jkrs/joc%20Amare%202.fla

我在pastebins中添加了代码,因为我不想在这里有一面文字

工作:http://pastebin.com/bnV5dnUt

无效:http://pastebin.com/8sUeyntW

1 个答案:

答案 0 :(得分:0)

function endDragIt(evt:Event)
{
    var target:MovieClip = evt.target as MovieClip;

    target.stopDrag();

    var i:int = isOver();

    if (target.dropTarget != null && casete.indexOf(target.dropTarget.parent) != -1)
    {

        target.removeEventListener(MouseEvent.MOUSE_DOWN,dragIt);
        target.mouseEnabled = false;

        var caseta:MovieClip = casete[i];

        var clasaTarget = Object(target).constructor;


        if (clase[i] == clasaTarget)
        {
            trace("Bravo!");
            trace("Ai facut bine!");
            score+=3/5;
            target.x = caseta.x;
            target.y = caseta.y;
            trace("Scor ok="+score);
            if(score>1 && score<1.5){
                scorfinal=1;
                trace(scorfinal);
            }
            if(score>1.5 && score < 2.5){
                scorfinal=2;
                trace(scorfinal);
            }
            if(score>2.5){
                scorfinal=3;
                trace(scorfinal);
            }
        } 
        else
        {

            target.x=caseta.x;
            target.y=caseta.y;
            trace("gresit");
        }
    }else{
        target.x+=1000;
        target.y+=1000;
    }
}

导致错误的功能......

看着它,我猜这里出错:

var caseta:MovieClip = casete[i];

因为i = -1,并且该数组中没有-1

现在...... 为什么我会到-1?

这样做是因为isOver()返回-1。

这似乎是你的问题。你停止拖东西...... 而且你不再超过你选择的对象了。呵呵。 多奇怪。

查看其他代码,我看不出太多差异。

我的建议:改变两个应用程序以跟踪isOver()函数中的信息。检查输出中是否有任何不同。特别感兴趣的是宽度和高度的计算。

function isOver():int{
    for(var i:int = 0; i<casete.length; i++){

        if(this.mouseX >= casete[i].x-casete[i].width/2 && this.mouseX <= casete[i].x+casete[i].width/2)
            if(this.mouseY >= casete[i].y-casete[i].height/2 && this.mouseY <= casete[i].y+casete[i].height/2)
                return i;
    }

    return -1;

}

我会将该功能更改为

function isOver():int{
    trace("isOver called");
    trace("mouseX: "+this.mouseX+", mouseY:"+this.mouseY);
    for(var i:int = 0; i<casete.length; i++){
        trace("testing casete "+i);
        trace("x lower bound:"+(casete[i].x-casete[i].width/2)+", x upper bound:"+(casete[i].x+casete[i].width/2));
        trace("y lower bound:"+(casete[i].y-casete[i].height/2)+", y upper bound:"+(casete[i].y+casete[i].height/2));
        if(this.mouseX >= casete[i].x-casete[i].width/2 && this.mouseX <= casete[i].x+casete[i].width/2)
            if(this.mouseY >= casete[i].y-casete[i].height/2 && this.mouseY <= casete[i].y+casete[i].height/2)
                return i;
    }

    return -1;

}

理想情况下,您应该看到的是两个程序之间没有区别。

如果是这样,那么你偶然发现了另一个错误;当释放鼠标时,您仍然在对象上的假设是假的。如果两个程序之间存在差异(执行类似的操作时!),那么其余部分的实现可能是错误的。