Actionscript 3 AS3-删除父容器中的子容器不会';t正确地重新定位儿童
我制作了这个插件,它将容器的所有子对象放置在网格中。现在,我向容器中的child添加了一个clickhandler,当我单击其中一个时,它将被删除。当我移除右侧的一整行(从上到下)时,一切正常,但当我移除左侧的一整行时,容器中所有项目的位置保持不变,但容器本身将移动到x=0和y=0。我想要的是将容器中的所有子对象作为一个组移动到x:0,y:0 一些关于我得到什么和我想要什么的图片: 1)我得到的:Actionscript 3 AS3-删除父容器中的子容器不会';t正确地重新定位儿童,actionscript-3,grid,click,containers,Actionscript 3,Grid,Click,Containers,我制作了这个插件,它将容器的所有子对象放置在网格中。现在,我向容器中的child添加了一个clickhandler,当我单击其中一个时,它将被删除。当我移除右侧的一整行(从上到下)时,一切正常,但当我移除左侧的一整行时,容器中所有项目的位置保持不变,但容器本身将移动到x=0和y=0。我想要的是将容器中的所有子对象作为一个组移动到x:0,y:0 一些关于我得到什么和我想要什么的图片: 1)我得到的: private function clickHandler(event:MouseEvent):v
private function clickHandler(event:MouseEvent):void {
var name:String = event.currentTarget.name;
if(container.getChildByName(name) != null)
container.removeChild(container.getChildByName(name));
trace(name, "container.width: ", container.width);
trace(name, "container.width: ", container.height);
trace(name, "container.x: ", container.x);
container.graphics.clear();
container.graphics.beginFill(0x2C2C2C);
container.graphics.drawRect(container.x ,container.y, container.width, container.height);
container.graphics.endFill();
}
private function generateGrid(rows:int, cols:int, spacing:int):void
{
for (var py:int = 0; py <rows; py++)
{
for (var px:int = 0; px <cols; px++)
{
if(childs.length > 0)
{
var child:* = childs.shift();
child.x = (child.width + spacing) * px;
child.y = (child.height + spacing) * py;
} else {
break;
}
}
}
}
2)删除左侧整行时得到的结果:
private function clickHandler(event:MouseEvent):void {
var name:String = event.currentTarget.name;
if(container.getChildByName(name) != null)
container.removeChild(container.getChildByName(name));
trace(name, "container.width: ", container.width);
trace(name, "container.width: ", container.height);
trace(name, "container.x: ", container.x);
container.graphics.clear();
container.graphics.beginFill(0x2C2C2C);
container.graphics.drawRect(container.x ,container.y, container.width, container.height);
container.graphics.endFill();
}
private function generateGrid(rows:int, cols:int, spacing:int):void
{
for (var py:int = 0; py <rows; py++)
{
for (var px:int = 0; px <cols; px++)
{
if(childs.length > 0)
{
var child:* = childs.shift();
child.x = (child.width + spacing) * px;
child.y = (child.height + spacing) * py;
} else {
break;
}
}
}
}
3)我想要什么:
private function clickHandler(event:MouseEvent):void {
var name:String = event.currentTarget.name;
if(container.getChildByName(name) != null)
container.removeChild(container.getChildByName(name));
trace(name, "container.width: ", container.width);
trace(name, "container.width: ", container.height);
trace(name, "container.x: ", container.x);
container.graphics.clear();
container.graphics.beginFill(0x2C2C2C);
container.graphics.drawRect(container.x ,container.y, container.width, container.height);
container.graphics.endFill();
}
private function generateGrid(rows:int, cols:int, spacing:int):void
{
for (var py:int = 0; py <rows; py++)
{
for (var px:int = 0; px <cols; px++)
{
if(childs.length > 0)
{
var child:* = childs.shift();
child.x = (child.width + spacing) * px;
child.y = (child.height + spacing) * py;
} else {
break;
}
}
}
}
我使用的代码:
private function clickHandler(event:MouseEvent):void {
var name:String = event.currentTarget.name;
if(container.getChildByName(name) != null)
container.removeChild(container.getChildByName(name));
trace(name, "container.width: ", container.width);
trace(name, "container.width: ", container.height);
trace(name, "container.x: ", container.x);
container.graphics.clear();
container.graphics.beginFill(0x2C2C2C);
container.graphics.drawRect(container.x ,container.y, container.width, container.height);
container.graphics.endFill();
}
private function generateGrid(rows:int, cols:int, spacing:int):void
{
for (var py:int = 0; py <rows; py++)
{
for (var px:int = 0; px <cols; px++)
{
if(childs.length > 0)
{
var child:* = childs.shift();
child.x = (child.width + spacing) * px;
child.y = (child.height + spacing) * py;
} else {
break;
}
}
}
}
有人知道如何解决这个问题吗?:)
编辑:创建网格的代码:
private function clickHandler(event:MouseEvent):void {
var name:String = event.currentTarget.name;
if(container.getChildByName(name) != null)
container.removeChild(container.getChildByName(name));
trace(name, "container.width: ", container.width);
trace(name, "container.width: ", container.height);
trace(name, "container.x: ", container.x);
container.graphics.clear();
container.graphics.beginFill(0x2C2C2C);
container.graphics.drawRect(container.x ,container.y, container.width, container.height);
container.graphics.endFill();
}
private function generateGrid(rows:int, cols:int, spacing:int):void
{
for (var py:int = 0; py <rows; py++)
{
for (var px:int = 0; px <cols; px++)
{
if(childs.length > 0)
{
var child:* = childs.shift();
child.x = (child.width + spacing) * px;
child.y = (child.height + spacing) * py;
} else {
break;
}
}
}
}
private函数generateGrid(行:int,列:int,间距:int):void
{
对于(var py:int=0;py来说,实际上没有什么需要“修复”的,您只是没有编写任何代码来移动这些对象,因此它们没有移动。您正在根据新的宽度重新绘制容器的背景,但您没有实际移动容器内的任何对象
有很多方法可以做到这一点。想到的最简单的解决方案是这样的:
-循环遍历容器的所有子级并找到最低的x位置
-再次循环并从每个子对象的x位置中减去最低的x值
(您可能也希望对y位置执行此操作,以便在删除顶行时它们将向上移动。)
每次删除子对象时,您都会运行整个过程。如果最低位置为0,表示在最左侧位置有一个对象,则不会移动任何对象,如果有一个空行,则最低x将大于0,所有对象都将移动该值
免责声明:
最好不要把图形视图和数据结构搞得太混乱,但这是我能提供的最好的建议,不用看你的其余代码。实际上没有什么需要“修复”,你只是没有编写任何代码来移动这些对象,所以它们不会移动。你正在重新绘制容器的背景r基于新的宽度,但实际上没有移动该容器中的任何对象
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Grid extends Sprite{
private var _squ:Square;
private var _cont:Sprite;
public function Grid() {
// constructor code
_cont = new Sprite();
addChild(_cont);
for( var i:uint = 0;i< 20; i++){
_squ = new Square(50,50,2,Math.random() * 0xFFFFFF);
_cont.addChild(_squ);
_squ.name = "square_"+i;
_squ.x = 100 + 52 * Math.round(i%5);
_squ.y = 50 + 52 * Math.floor(i/5);
_squ.buttonMode = true;
}
this.addEventListener(MouseEvent.CLICK, onClickAction);
}
public function gridAlign(cont:Sprite):void{
for( var i:uint = 0;i< cont.numChildren; i++){
_cont.getChildAt(i).x = 100 + 52 * Math.round(i%5);
_cont.getChildAt(i).y = 50 + 52 * Math.floor(i/5);
}
}
private function onClickAction(e:MouseEvent):void{
_cont.removeChild(_cont.getChildByName(e.target.name));
this.gridAlign(_cont);
}
}
}
有很多方法可以做到这一点。想到的最简单的解决方案是这样的:
-循环遍历容器的所有子级并找到最低的x位置
-再次循环并从每个子对象的x位置中减去最低的x值
(您可能也希望对y位置执行此操作,以便在删除顶行时它们将向上移动。)
每次删除子对象时,您都会运行整个过程。如果最低位置为0,表示在最左侧位置有一个对象,则不会移动任何对象,如果有一个空行,则最低x将大于0,所有对象都将移动该值
免责声明:
最好不要把图形视图和数据结构搞得太混乱,但这是我能提供的最好的建议,而不必看代码的其余部分。package{
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Grid extends Sprite{
private var _squ:Square;
private var _cont:Sprite;
public function Grid() {
// constructor code
_cont = new Sprite();
addChild(_cont);
for( var i:uint = 0;i< 20; i++){
_squ = new Square(50,50,2,Math.random() * 0xFFFFFF);
_cont.addChild(_squ);
_squ.name = "square_"+i;
_squ.x = 100 + 52 * Math.round(i%5);
_squ.y = 50 + 52 * Math.floor(i/5);
_squ.buttonMode = true;
}
this.addEventListener(MouseEvent.CLICK, onClickAction);
}
public function gridAlign(cont:Sprite):void{
for( var i:uint = 0;i< cont.numChildren; i++){
_cont.getChildAt(i).x = 100 + 52 * Math.round(i%5);
_cont.getChildAt(i).y = 50 + 52 * Math.floor(i/5);
}
}
private function onClickAction(e:MouseEvent):void{
_cont.removeChild(_cont.getChildByName(e.target.name));
this.gridAlign(_cont);
}
}
}
导入flash.display.Sprite;
导入flash.events.MouseEvent;
公共类网格扩展了Sprite{
私有变量squ:Square;
私有变量(续):Sprite;
公共功能网格(){
//构造代码
_cont=新精灵();
addChild(续);
对于(变量i:uint=0;i<20;i++){
_squ=新的平方(50,50,2,Math.random()*0xFFFFFF);
_cont.addChild(_squ);
_squ.name=“square_uu”+i;
_squ.x=100+52*数学四舍五入(i%5);
_squ.y=50+52*数学楼层(i/5);
_squ.buttonMode=true;
}
this.addEventListener(MouseEvent.CLICK,onClickAction);
}
公共函数gridAlign(续:精灵):无效{
对于(变量i:uint=0;i
试试这个。软件包{
导入flash.display.Sprite;
导入flash.events.MouseEvent;
公共类网格扩展了Sprite{
私有变量squ:Square;
私有变量(续):Sprite;
公共功能网格(){
//构造代码
_cont=新精灵();
addChild(续);
对于(变量i:uint=0;i<20;i++){
_squ=新的平方(50,50,2,Math.random()*0xFFFFFF);
_cont.addChild(_squ);
_squ.name=“square_uu”+i;
_squ.x=100+52*数学四舍五入(i%5);
_squ.y=50+52*数学楼层(i/5);
_squ.buttonMode=true;
}
this.addEventListener(MouseEvent.CLICK,onClickAction);
}
公共函数gridAlign(续:精灵):无效{
对于(变量i:uint=0;i