现在我来介绍一种Flash特有的类——元件。
元件的概念有些类似于GUI编程的控件,但是Flash的元件种类更少(只有三种:图形、按钮、影片剪辑),而且更容易自定义画面。
点击“插入”菜单->“新建元件”,弹出一个对话框:
注意红框部分要和图片保持完全一致,除了元件名称和类名,这两个只要保持一致,并且用类名的大写首字母命名风格就可以。然后在弹出的对话框中点“确定”,对话框下边有个复选框,勾上之后可以一劳永逸,我就是因为之前给勾了,所以现在截不了图。
至于为什么要选中“为ActionScript导出”,这是为了方便给元件一个绑定的类,以便于面向对象程序设计的进行,具体操作下一节再说。
我随便画了一个矩形,但注意如果没有特殊需要,尽量把绘图区域中间的十字保持在矩形的中心,或者是左上角,这样以后添加元件的时候会比较方便。十字表示了元件的x、y位置坐标取值点。
然后我们来说说游戏轮询。
Flash中的游戏轮询和微软的XNA可不一样,XNA的游戏轮询是保罗了整个XNA项目的,所有的操作都在其中进行,而Flash的游戏轮询所能覆盖的范围就小一些了。XNA的输入判断要在游戏轮询里进行,而Flash的输入判断则是采用了Java Swing类似的事件侦听器的方式,这样事件处理函数就和游戏轮询分离了。
如下代码增加一个游戏轮询:
public function Main() {
// constructor code
addEventListener(Event.ENTER_FRAME, gameLoop);
}
function gameLoop(event:Event):void
{
}
addEventListener就是添加事件侦听器的方法,后边的两个参数一个是事件类型,一个是事件处理方法,下边的gameLoop是我们自定义的方法,里边可以写一些内容。
如下代码我增加了一些内容:
package {
import flash.display.MovieClip;
import flash.events.Event;
public class Main extends MovieClip {
var player:Player=null;
public function Main() {
// constructor code
addEventListener(Event.ENTER_FRAME, gameLoop);
}
function gameLoop(event:Event):void
{
if(player==null)
{
player=new Player();
player.x=stage.stageWidth/2;
player.y=stage.stageHeight/2;
addChild(player);
}
player.x--;
}
}
}
创建一个Player类型的对象player,把它的坐标设计在舞台的中心(宽度和高度都除以2),然后用addChild()显示在舞台上,并且让他每帧x坐标自减。
Event.ENTER_FRAME是Flash的一个事件,意思是每次进入帧就执行,这样就实现了游戏轮询。
现在按Ctrl-Shift-Enter调试,如图所示:
一个蓝色矩形被放置在了舞台的中央,并且缓慢向左移动。
给元件实例命名除了在代码里用var定义变量之外,还可以直接在舞台上,把元件拖入舞台,在属性里的“实例名称”处修改,方法也很简单,这个不细说了,留给读者自己搜索~~
还有一个问题,这个Event.ENTER_FRAME在元件上也可以用——我说的是每个元件,这时候每个Event.ENTER_FRAME的先后顺序是不同步的,有可能导致一些错误,这个问题我们下节就会讨论。