好的,所以我正在做一个小游戏,用户随机挑选产生的花朵。当摘花时,它会消失并且用户获得积分。
以下是我的一些代码:
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的新手,想知道应该放在哪里。
谢谢!
答案 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帖子。