Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 调用removeChild后的Actionscript奇怪协调_Flash_Actionscript_Coordinates_Sprite_Removechild - Fatal编程技术网

Flash 调用removeChild后的Actionscript奇怪协调

Flash 调用removeChild后的Actionscript奇怪协调,flash,actionscript,coordinates,sprite,removechild,Flash,Actionscript,Coordinates,Sprite,Removechild,有谁能帮我弄明白以下几点吗 我创建了几个方形精灵,然后移除了第一个 并显示坐标。 结果是: (x=0, y=0, w=208, h=40) 0 208 (x=42, y=0, w=166, h=40) 0 166 x坐标仍然为0,但宽度已更改, getBounds显示正确的值。 我希望x也会改变。 由于x的值错误,GlobalToGlocal和localToGlobal工作不正确 如果单击第二个(仍然可见)矩形左侧的某个位置 你会得到: 228(x=2,y=28) 这毫无用处。括号中的

有谁能帮我弄明白以下几点吗

我创建了几个方形精灵,然后移除了第一个 并显示坐标。 结果是:

  (x=0, y=0, w=208, h=40) 0 208
  (x=42, y=0, w=166, h=40) 0 166
x坐标仍然为0,但宽度已更改, getBounds显示正确的值。 我希望x也会改变。 由于x的值错误,GlobalToGlocal和localToGlobal工作不正确

如果单击第二个(仍然可见)矩形左侧的某个位置 你会得到:

228(x=2,y=28)

这毫无用处。括号中的值应为阶段坐标,而不是阶段坐标

守则:

    public function test():void {
        var s:Sprite;
        var i:int;

        var arr:Array = new Array();
        for (i = 0; i < 5; ++i)
        {
            s = new Sprite();
            s.graphics.beginFill(0x999);
            s.graphics.drawRect(0, 0, 40, 40);
            s.graphics.endFill();
            s.x = i * 42;
            arr.push(s);
            addChild(s);
        }
        trace(this.getBounds(stage), x, width);
        removeChild(arr[0]); arr[0] = null;
        trace(this.getBounds(stage), x, width);
        addEventListener(MouseEvent.CLICK, click);
    }

    private function click(e:MouseEvent):void {
        trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    }
public function test():void{
变量s:雪碧;
变量i:int;
var arr:Array=new Array();
对于(i=0;i<5;++i)
{
s=新精灵();
s、 图形填充(0x999);
s、 graphics.drawRect(0,0,40,40);
s、 graphics.endFill();
s、 x=i*42;
arr.push(s);
addChild(s);
}
跟踪(this.getBounds(stage),x,width);
removeChild(arr[0]);arr[0]=null;
跟踪(this.getBounds(stage),x,width);
addEventListener(MouseEvent.CLICK,CLICK);
}
私有函数单击(e:MouseeEvent):无效{
跟踪(e.localX,e.localY,localToGlobal)(新点(e.localX,e.localY));
}

你对两个不同的观点感到困惑,但我认为它们都源于对Flash如何处理坐标系的不完整理解。回想一下,每个显示对象都有自己的坐标系。在第一个问题中,对象的“x”和“y”属性不会动态计算以反映对象的左上角,它们只是表示该对象的原点相对于其父坐标系的位置。因此,对象的“x”值不会仅仅因为对象的内容改变而改变,而是在移动对象本身时改变

stage坐标的问题是
localToGlobal
方法从调用它的作用域转换坐标-您从矩形的父级调用它,但您从矩形内的本地系统传入坐标。盯着下面的内容看一看,这应该是有意义的:

function click(e:MouseEvent):void {
    // bad - uses rectangle coords in scope of "this"
    //trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    // works - call localToGlobal from the scope of the rectangle
    trace( e.target.localToGlobal(new Point(e.localX, e.localY)));
    // alternately, call it from any scope with coordinates taken from that scope:
    trace( localToGlobal( new Point( mouseX, mouseY )));
    trace( e.target.localToGlobal( new Point( e.target.mouseX, e.target.mouseY )));
}

更新: 让人困惑的部分原因是事件冒泡在AS3中的工作原理。阅读的前几段以获得大致思路,然后理解在本例中,事件最初是从矩形发出的(因为单击的图形就是从矩形发出的),但您只能在它们在设置侦听器的范围内冒泡时捕捉它们。因此
e.target
是矩形,而
e.currentTarget
是侦听器的范围。最后一个难题是理解
e.localX
e.localY
始终位于事件原始目标的坐标系中。(这是因为它们是事件的属性,当事件在显示列表中冒泡出现时,它们不断更改是没有意义的。)


最后,如果您想知道初学者通常如何处理这些内容,那么答案是人们通常将侦听器直接附加到显示对象上,该显示对象具有将被单击的图形内容。在这种情况下,e.target和e.currentTarget将始终是相同的,大多数初学者不需要理解任何一点。

您对两个不同的点感到困惑,但我认为它们都源于Flash如何处理坐标系的不完整视图。回想一下,每个显示对象都有自己的坐标系。在第一个问题中,对象的“x”和“y”属性不会动态计算以反映对象的左上角,它们只是表示该对象的原点相对于其父坐标系的位置。因此,对象的“x”值不会仅仅因为对象的内容改变而改变,而是在移动对象本身时改变

stage坐标的问题是
localToGlobal
方法从调用它的作用域转换坐标-您从矩形的父级调用它,但您从矩形内的本地系统传入坐标。盯着下面的内容看一看,这应该是有意义的:

function click(e:MouseEvent):void {
    // bad - uses rectangle coords in scope of "this"
    //trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    // works - call localToGlobal from the scope of the rectangle
    trace( e.target.localToGlobal(new Point(e.localX, e.localY)));
    // alternately, call it from any scope with coordinates taken from that scope:
    trace( localToGlobal( new Point( mouseX, mouseY )));
    trace( e.target.localToGlobal( new Point( e.target.mouseX, e.target.mouseY )));
}

更新: 让人困惑的部分原因是事件冒泡在AS3中的工作原理。阅读的前几段以获得大致思路,然后理解在本例中,事件最初是从矩形发出的(因为单击的图形就是从矩形发出的),但您只能在它们在设置侦听器的范围内冒泡时捕捉它们。因此
e.target
是矩形,而
e.currentTarget
是侦听器的范围。最后一个难题是理解
e.localX
e.localY
始终位于事件原始目标的坐标系中。(这是因为它们是事件的属性,当事件在显示列表中冒泡出现时,它们不断更改是没有意义的。)


最后,如果您想知道初学者通常如何处理这些内容,那么答案是人们通常将侦听器直接附加到显示对象上,该显示对象具有将被单击的图形内容。在这种情况下,e.target和e.currentTarget将始终是相同的,大多数初学者都不需要理解这一点。

没错-我没有以正确的方式调用localToGlobal。非常感谢。因此,似乎返回的本地坐标始终与实际使用的雪碧部分有关。为了得到关于(x,y)的坐标,你必须考虑边界。这是有道理的,但与Flash一样,它完全没有文档记录。:-)对不起,你把它倒过来了-库尔