如何在按钮按下时删除子/精灵?

Posted

技术标签:

【中文标题】如何在按钮按下时删除子/精灵?【英文标题】:How to remove child/sprites on button press? 【发布时间】:2017-09-29 09:47:42 【问题描述】:

我正在做一个项目,如果用户点击“种植花园”,它将生成随机数量的花和随机数量的杂草。一旦他们完成了他们的“成长”序列,用户就会看到一个“种植新花园”,其中的花朵/杂草将从舞台上删除并重新开始。

我绞尽脑汁,这是我最接近“移除孩子”的一个概念——我从来没有理解过这个概念哈哈。非常感谢任何帮助/指导。

** 复制旧文件时编辑的代码**

import flash.events.MouseEvent;
import flash.display.DisplayObject;

// stops the playhead on frame 1
stop();

// random amount of flowers generated
var flowerAmount:int = (Math.ceil((Math.random() * 20)) + 9);
var weedAmount = Math.ceil((Math.random() * 10));


// garden display container
var newGarden:DisplayObjectContainer;

// setting new flower variable equal to the function that creates an instance of the flower
var newFlower_mc:DisplayObject = newFlower();

// flowers currently in the garden
var flowersInGarden:int = 0;
var weedsInGarden:int = 0;


// event listener for the grow button to start the garden
grow_btn.addEventListener(MouseEvent.MOUSE_UP, frameTwo);

// when grow button is clicked go to frame two
function frameTwo(event:MouseEvent) 
    gotoAndPlay(2);


// changes the size and position of the flower
function configureFlower(myFlower_mc:DisplayObject) 
    myFlower_mc.x = Math.random() * 400;
    myFlower_mc.y = Math.random() * 200;
    var flowerSize:Number = Math.random() + .5;
    myFlower_mc.height = myFlower_mc.height * flowerSize;
    myFlower_mc.width = myFlower_mc.width * flowerSize;

import flash.display.DisplayObject;

// function to create new instance of a flower
function newFlower():DisplayObject 
    var newFlower_mc:DisplayObject = new flower();
    return newFlower_mc;


// function to call the create flower function and add flower to sprite 
function createFlower() 
    var myFlower_mc = newFlower();
        configureFlower(myFlower_mc);
        newGarden.addChild(myFlower_mc);
    trace(flowerAmount);
    

newGarden = new Sprite();

// adds the flower to the stage/sprite and adds to the flower counter
    function showFlowers() 
    createFlower();
    addChild(newGarden);
    flowersInGarden++;
    trace("Flowers:" + flowersInGarden + " " + weedAmount + " weedsingarden" + weedsInGarden);



// calls the above function
showFlowers();


// function to create a weed, configure weed and add to the garden sprite
function createWeed() 
    var newWeed:DisplayObject; 
    trace("creating weed"); 
    newWeed = new weed(); 
    newGarden.addChild(newWeed); 
    configureFlower(newWeed);
    weedsInGarden++;
// if all the flowers haven't grown yet, go back to frame 2 until they have

if (flowersInGarden < flowerAmount) 
    gotoAndPlay(2);


// if the amount of weeds decided haven't grown yet, create another weed

if (weedsInGarden < weedAmount) createWeed(); ;
stop();

// event listener to grow a new garden
new_btn.addEventListener(MouseEvent.MOUSE_UP, growNewGarden);


// function to create a new garden if there are more than 1 instance in the container
function growNewGarden(event:MouseEvent) 
    while (newGarden.numChildren > 0) 
    stage.removeChild(newFlower_mc); 
        stage.removeChild(newGarden);
        // add a new, fresh sprite
        stage.addChild(newGarden);
        // randomly chooses a number of flowers
        flowerAmount = (Math.ceil((Math.random() * 21)) + 10);
        // resets flower counter to zero
        flowersInGarden = 0;
    gotoAndPlay(2);


【问题讨论】:

【参考方案1】:

如果您打算使用numChildren 属性作为循环遍历的属性,您应该使用子索引作为循环中的变量来选择子项。您所做的是循环遍历孩子并尝试删除名为 newFlower_mc 或类似的东西,而该变量在该函数的范围内并不意味着任何东西。它可能看起来像这样

for (var i:int = newGarden.numChildren - 1; i >= 0; i--)
    var f:DisplayObject = newGarden.getChildAt(i);
    f.parent.removeChild(f);

所以这是一种方式。

我认为只是移除花园会更简单,因为所有的杂草和花朵都是花园的孩子,它们也会被移除。简单地说:

newGarden.parent.removeChild(newGarden);

瞧!

另外,只是关于您的var newFlower_mc = newFlower(); 的旁注。我不确定你是否理解这是在做什么。它没有设置一个等于函数的变量。它将该变量设置为等于输出或该函数被调用一次的结果。那行代码就是这样做的:

    声明一个具有唯一名称的变量newFlower_mc。 调用构造函数newFlower(),它返回一个DisplayObject 将返回的 DisplayObject 实例设置为变量newFlower_mc

这一切都很好,但你有一个问题。稍后,在您的构造函数中,如果newFlower,您声明另一个变量...其名称已经在使用...newFlower_mc。这是不好的。我不知道结果是什么。如果闪存以某种方式允许它编译和运行而没有错误,我会感到惊讶,但无论如何这是不好的做法。我认为这是因为您不了解设置变量= 函数时会发生什么。我希望我的解释有所帮助。

【讨论】:

我从教科书上一个示例中获取了代码,所以我可能误用了它。我会在早上看看 - 感谢您抽出时间来提供详细的答案 - 非常感谢!

以上是关于如何在按钮按下时删除子/精灵?的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt5 中按下时如何切换按钮文本

如何在按钮按下时在集合视图中滚动(水平)?

如何在按钮按下时转到 tableView 的顶部

如何在按钮按下时通过动画进行文本转换?

如何在按钮按下时扫描二维码?

使用 TouchableHighlight 在 React Native 中按下时如何更改按钮颜色?