我是AS3的新手,我试图通过在闪存中进行实验来学习,通过简单的代码制作一个简单的2D农业游戏。
我在6个作品中创造了一个作物田,这是一个动画片段,每个水果种植都有不同的框架。例如,第1-5帧是草莓种植,其中第5帧是准备采摘的时候,然后6-10是胡萝卜等等。
有没有办法让我这样做,以便我不必为下一个裁剪字段编写完全相同的代码,而是根据您点击的裁剪字段更改此代码中的变量?
这是代码
的一个例子if (field1.currentFrame == 1)
{
field1.nextFrame();
infoText.text = "You've watered the crop. Let's wait and see how it turns out!";
function plantStrawberry():void
{
field1.nextFrame();
if (field1.currentFrame == 5)
{
clearInterval(strawberryInterval);
}
}
var strawberryInterval = setInterval(plantStrawberry,5000);
}
没有判断,如上所述,我对AS3很新,哈哈。
答案 0 :(得分:5)
在这种情况下,有几种方法可以使用您的代码进行DRY(不要重复自己)。最好的方法是学习使用课程。类是蓝图,是为这些场景而制作的。
这是一个简单的类来做你想做的事情的例子。在Flash / Animate中,转到文件,然后转到 new ,然后转到“ ActionScript 3.0 Class ” - 将其命名为Crop
在出现的文档中,应该有一些基本的样板代码。一切都应该包装好。该软件包告诉flash在哪里找到这个类 - 所以这个例子,保持原样(只是package {
)并将此文件保存在与.fla
相同的文件夹中。所有函数都需要包装在类声明中,这应该根据您输入的名称(Crop
)为您生成。接下来,您将看到一个与该类名称相同的函数。这称为构造函数,只要您创建此类的新实例,此函数就会运行。由于类是蓝图,因此您创建它们的对象实例 - 这些对象然后获取您在此类中放置的所有代码。
所以,首先,你应该有这个:
package {
public class Crop {
public function Crop() {
// constructor code
}
}
}
让我们继续并将您的代码放入。请参阅代码注释以获取详细信息:
package {
//imports should go here
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
//lets make this class extend MovieClip - that means it will be a MovieClip in addition to everything else you add below
public class Crop extends MovieClip {
//instead of setInterval, use a timer - it's easier to manage and cleanup
//in class files, variables and functions have access modifiers, that's what the public and private words are about
//private means only this class can ever use the var/function
private var timer:Timer;
public function Crop() {
//initialize the timer - have it tick every 5 seconds, and repeat 4 times (to move you from frame 1 - 5)
timer = new Timer(5000, 4);
//listen for the TIMER event (which is the tick) and call the function 'grow' when the timer ticks
timer.addEventListener(TimerEvent.TIMER, grow);
}
//a function that starts the timer ticking
public function startGrowing():void {
timer.start();
}
//this function is called every timer tick.
private function grow(e:Event):void {
this.nextFrame(); //go to the next frame of your crop
}
}
}
保存文件。现在您已经拥有了这个类,您需要将它附加到您的库资源,以便它们都能获得此功能。
在库面板中,对于每个裁剪对象,右键单击(或按住ctrl +单击Mac)并转到properties
。在属性中,单击advanced
,并为其指定一个唯一的类名(例如Strawberry
)。然后在基类字段中,放置Crop
(我们刚刚创建的类)。重复其他人。
现在,在您的时间轴上,当您希望裁剪开始增长时,您可以执行以下操作:
field1.startGrowing(); //assuming your instance `field1` is one of the crops that you assigned the base class `Crop` to
希望这能为进入阶级的力量提供切入点。您可以在此功能中添加更多功能,它会自动应用于您附加的所有作物。
答案 1 :(得分:3)
虽然BFAT's tutorial绝对正确,但它不是唯一的办法,而且,如果您从Flash和AS3转移到其他地方,或者甚至尝试 Starling (a允许在Flash / AS3中构建快速且非延迟的移动应用程序的框架,您会发现该概念不适用。这是非常Flash-y,但我为它鼓掌。
不是将每个字段子类化为抽象(意味着,它从不实例化)裁剪类,您可以使裁剪类占用这6个字段中的1个作为创造(或后来)的论据。基本上,你告诉"我想用小麦图形制作农田"。所以,让我稍微重做一下这个课程。
package
{
// Imports.
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.Event;
import flash.events.TimerEvent;
public class Crop extends Sprite
{
// I agree with the use of Timer.
private var timer:Timer;
// Visuals go here.
private var field:MovieClip;
// Class constructor.
public function Crop(FieldClass:Class)
{
// With "new" keyword you can omit ()
// if there are no mandatory arguments.
field = new FieldClass;
field.stop();
addChild(field);
}
// A function that starts the timer ticking.
public function startGrowing():void
{
timer = new Timer(5000, 4);
timer.addEventListener(TimerEvent.TIMER, grow);
timer.start();
}
// This function is called every timer tick.
private function grow(e:Event):void
{
// Command the graphics to go to the next frame.
field.nextFrame();
}
}
}
然后,用法。创建字段时,需要为其设置AS3类才能访问,保留基类,Flash会自动将其设置为非特定的 MovieClip 。不过,你有 crops.Wheat 字段和 crops.Barley 字段。
import Crop;
import crops.Wheat;
import crops.Barley;
var W:Crop = new Crop(Wheat);
var B:Crop = new Crop(Barley);
addChild(W);
addChild(B);
B.x = 100;
W.startGrowing();
B.startGrowing();