在AS3中产卵和摧毁东西

时间:2012-06-12 22:51:08

标签: actionscript-3 oop actionscript mouseevent addeventlistener

好的,所以我正在做一个小游戏,用户随机挑选产生的花朵。当摘花时,它会消失并且用户获得积分。

以下是我的一些代码:

import flash.events.MouseEvent;

function makeFlower() {

    var flower:Flower = new Flower();

    addChild(flower);
    flower.x = Math.random() * 500;
    flower.y = Math.random() * 400;
}

function removeFlower(event:MouseEvent):void {
    flower.pick();
}


setInterval(makeFlower, 2500);
addEventListener(MouseEvent.CLICK, removeFlower);

所以在上面的代码中,flower.pick()不起作用,因为它超出了范围(顺便说一下,我怎么能在范围内得到它?)......这是一个问题。但是这个问题让我质疑花的创造应该在哪里发生。将addChild()放在构造函数方法中会不会更好?

然后是破坏部分......事件监听器检测到被点击的花......这应该是分开的(比如我有它)还是应该放入Flower类?我是ActionScript的新手,想知道应该放在哪里。

谢谢!

2 个答案:

答案 0 :(得分:3)

尝试:

import flash.events.MouseEvent;

var flower:Flower;

function makeFlower() {
    flower = new Flower();
    addChild(flower);
    flower.x = Math.random() * 500;
    flower.y = Math.random() * 400;

    flower.addEventListener(MouseEvent.CLICK, removeFlower);
}

function removeFlower(event:MouseEvent):void {
    event.target.pick();
    //removeChild(event.target); // active this to remove the clicked flower
}

setInterval(makeFlower, 2500);

答案 1 :(得分:2)

你应该处理的事情取决于很多因素,如果你使用的是Flex框架,我列表中的第一个就是第二个,这对于给定的应用程序来说是最好的。对于您的情况,您似乎只是使用Flash IDE。

您需要添加添加到显示树的花卉对象集合。然后在点击时你会想要使用点击的目标来知道他们选择了哪个“花”,而不是任意删除一些花。

拥有鲜花集合的另一个好处是,您实际上可以切换可见性(这也可以切换触摸/单击与对象交互的能力)。然后你可以让Flower对象一次创建或至少重新使用,而不是必须进行垃圾收集并制作更多的对象(正如丹尼尔在术语下面指出的那样是对象池)。

import flash.events.MouseEvent;

var allFlowers:Array = [];
var oldFlowers:Array = [];

function makeFlower() {
    var flower:Flower;

    if(oldFlowers.length>0)  //if there's stale ones, already created but since picked
    {
        flower = oldFlowers.pop();//grab the last one from the list
        flower.visible=true;//show it, update to position below should happen fast enough so you won't see it move
    }
    else
        flower = new Flower();

    allFlowers.push(flower);

    addChild(flower);

    flower.addEventListener(MouseEvent.CLICK, removeFlower);  //Adding the listener directly to the Flower object, assuming it's a Sprite/MovieClip/InteractiveObject of some sort

    flower.x = Math.random() * 500;
    flower.y = Math.random() * 400;
}

function removeFlower(event:MouseEvent):void {
    var clickedFlower:Flower = (event.target as Flower); //this is a local reference
    clickedFlower.pick();  //assuming this toggles the visibility
    oldFlowers.push(allFlowers.splice(clickedFlower,1)); //removing it from the "active array" putting it in the "stale array"
}


setInterval(makeFlower, 2500);

理想情况下,这一切都会被包含在一个类中,真正的范围变量在类的上下文中对我来说更有意义,而不仅仅是在某个代码块中晃来晃去。

由于在原始代码中,您声明该花是一个var并且赋予它存储在该var(Flower)中的对象类型,因此它的范围仅限于该函数的开始和结束花括号。对于我定义的变量,只要包含代码的对象可用,它们就应该可用。

在AS3中的类(即public,protected或private)中声明变量或函数时,可以使用三个主要的“范围修饰符”。使用public意味着属性/方法(成员)可以在类定义(通常是文件,something.as)以及其他任何内容中访问,如果你将变量设为public,它可以被任何使用代码的东西修改,这个如果无意中从外部进行更改,则可能导致应用程序无法预测。使用protected意味着继承或扩展类的任何东西都可以访问/使用受保护的成员,但只有对象实例的任何东西都可以访问这些成员(因此称为访问修饰符)。第三级是私有的,这意味着只有该类中的代码(跨所有方法)才能访问该成员,但该类的任何继承/子类都不能访问该成员。这基本上是通常称为计算机科学中的封装的概念的实现。有更多的细节,但实际上它已经太长了一个体面的SO帖子。