0

好的,所以我正在制作一个小游戏,用户可以选择随机生成的花朵。当一朵花被采摘时,它会消失并且用户获得积分。

这是我的一些代码:

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 的新手,想知道应该把东西放在哪里。

谢谢!

4

2 回答 2

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);
于 2012-06-12T23:00:45.057 回答
2

你应该在哪里处理事情取决于很多因素,我的列表中的第一个是你是否使用 Flex 框架,第二个是最适合给定应用程序的。对于您的情况,您似乎只是在使用 Flash IDE。

您需要收集添加到显示树的花卉对象。然后在点击时,您将希望使用点击的目标来了解他们采摘了哪朵“花”,而不是随意移除一些花。

收集花朵的另一个好处是您实际上可以切换可见性(这也可以切换触摸/单击与对象交互的能力)。然后,您可以一次创建全部 Flower 对象,或者至少重复使用,而不必进行垃圾收集并制造大量对象(正如 Daniel 在下面所指出的,该术语是对象池)。

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)。使用公共意味着属性/方法(成员)可以在类定义(通常是文件,something.as)以及其他任何东西中访问,如果你将变量设为公共,它可以被任何使用代码的东西修改,这个如果来自外部的更改是无意的,可能会导致您的应用程序出现不可预测的行为。使用受保护意味着从类继承或扩展类的任何东西都可以访问/使用受保护的成员,但是只有对象实例的任何东西都不能访问这些成员(因此称为访问修饰符)。第三级是私有的,这意味着只有该类中的代码(跨所有方法)可以访问该成员,但该类的继承/子类不能访问该成员。这本质上是计算机科学中通常称为封装的概念的实现。还有更多细节,但实际上对于一个像样的 SO 帖子来说已经太长了。

于 2012-06-12T23:05:35.543 回答