我已经将AS3代码作为一个函数。但我认为我的代码太冗长了。你能帮忙改进吗?谢谢!
我首先创建了test.fla并添加了5个灰色块(来自PSD的外部图片)到舞台。我的功能是将鼠标悬停在相应的灰色块上时显示不同的图片。
我将这5个灰色块转换为Movie Clip,并将实例名称设置为sp1,sp2,sp3,sp4和sp5。然后我创建了一个文档类test.as并设置了5个EventListener。
sp1.addEventListener(MouseEvent.MOUSE_OVER,clickmouse1);
sp2.addEventListener(MouseEvent.MOUSE_OVER,clickmouse2);
sp3.addEventListener(MouseEvent.MOUSE_OVER,clickmouse3);
sp4.addEventListener(MouseEvent.MOUSE_OVER,clickmouse4);
sp5.addEventListener(MouseEvent.MOUSE_OVER,clickmouse5);
所以我的第一个问题是我可以使用任何方法将这5个EventListener组合成一个吗?因为在我看来,如此多的EventListener将花费更多的PC资源。
我的第二个问题是我将5张目标图片设为5级。
在test.as中我创建了以下代码:
public class EuroCup extends Sprite{
var arr:Array=new Array();
var Res1:Result609=new Result609();
var Res2:Result610=new Result610();
var Res3:Result611=new Result611();
var Res4:Result612=new Result612();
var Res5:Result613=new Result613();
var i:int=0;
public function EuroCup() {
arr[1]=Res1;
arr[2]=Res2;
arr[3]=Res3;
arr[4]=Res4;
arr[5]=Res5;
}
}
我觉得这太漫长了。有没有办法简化它? 这是test.fla和test.as:Download 无论如何,谢谢你们!
答案 0 :(得分:2)
重组:
public class EuroCup extends Sprite {
private var arr:Array;
public function EuroCup() {
arr = [ new Result609(), new Result610(),
new Result611(), new Result612(), new Result613()
];
}
}
然后使用结果为arr [0],arr [1]等。此外,如果您有几个精灵来监听点击,使用类似的侦听器,您可以将所有这些精灵连接到单个侦听器,并使用event.target来区分它们,其中事件是MouseEvent。或者将它们放入容器并为该容器创建一个监听器 - 再次,event.target将告诉单击哪个精灵。
还有两件事 - 每次看到new Array()
时,都会将其替换为[]
- 它越快越短。并将所有代码放入构造函数,而不是类体 - 它将被编译为更快地执行。
答案 1 :(得分:2)
您可以/应该使用词典来显示灰色rects和要显示的图像之间的关联。
package {
public class EuroCup {
private var _children:Array, _current:Sprite, _map:Dictionary;
public function EuroCup() {
super();
initialize();
}
protected function initialize():void {
_children = [];
_map = new Dictonary();
// i don't know the image's symbol name.
// _map[_children[_children.length] = new Result609()] = new SYMBOL_NAME();
for each(var child:Sprite in _children) {
child.addEventListener(MouseEvent.CLICK, click_handler);
}
}
private function click_handler(event:MouseEvent):void
{
if (_current) {
_current.visible = false; // or use fading, etc
}
_current = _map[event.currentTarget] as Sprite;
if (_current) {
_current.visible = true; // or use fading, etc
}
}
}
}
答案 2 :(得分:0)
简化代码的一个选项是使用 Dictionary 将sp
和Res
个实例按身份相互关联。这允许您避免跟踪数组索引的工作,这是您拥有单独的事件处理程序方法的一半原因。一旦实例通过标识关联,那么您可以使用调度事件的 currentTarget 属性来确定要在舞台上显示的字典中的哪个元素。
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.utils.Dictionary;
public class test extends Sprite
{
var dict:Dictionary = new Dictionary();
var visibleResult:MovieClip;
public function test()
{
dict[sp1]=new Result609();
dict[sp2]=new Result610();
dict[sp3]=new Result611();
dict[sp4]=new Result612();
dict[sp5]=new Result613();
sp1.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
sp2.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
sp3.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
sp4.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
sp5.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
}
private function clickmouse(evt:MouseEvent):void
{
if(visibleResult)
{
removeChild(visibleResult);
}
var Res:MovieClip = dict[evt.currentTarget] as MovieClip;
addChild(Res);
Res.x=300;
Res.y=400;
visibleResult=Res;
}
}
}
如果您希望应用程序中有超过5个sp
实例,那么您可以使用循环来分配事件侦听器。但是对于不到10个实例,你可能从循环中获得的收益不大。
答案 3 :(得分:0)
我会选择一个更简单的版本;仅添加一个事件侦听器,并使用Event.target
确定单击哪个项目,使用switch语句。
如果按钮应该执行不同的操作,这将非常有用。
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Test extends Sprite
{
public var sp1:Sprite;
public var sp2:Sprite;
public var sp3:Sprite;
public function Test()
{
this.addEventListener(MouseEvent.MOUSE_OVER, handleClick);
}
private function handleClick(event:MouseEvent):void
{
trace("Clicked on: " + event.target)
switch (event.target)
{
case this.sp1:
{
// do something here
break;
}
case this.sp2:
{
// do something here
break;
}
case this.sp3:
{
// do something here
break;
}
default
{
trace("No handler defined for: " + event.target)
}
}
}
}
}
但是,您也可以巧妙地使用它的类型。假设所有按钮都扩展了一个名为CustomButton
的自定义类,它们都需要执行相同的操作(比如调用函数),但使用基于它的id的参数。
如果按钮基本上应该做同样的事情,这很有用。
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Test extends Sprite
{
public function Test()
{
this.addEventListener(MouseEvent.MOUSE_OVER, handleClick);
}
private function handleClick(event:MouseEvent):void
{
if (event.target is CustomButton)
{
var button:CustomButton = event.target as CustomButton; // you're now sure it's a CustomButton
this.showById(button.id); // let's say CustomButton has a public var 'id'
}
}
private function showById(id:int):void
{
// do something
}
}
}
希望有所帮助。
提示:始终使用大写字母启动您的课程+文件名。变量以大写字母开头。这在actionscript世界非常普遍。