如何获得循环以使用事件监听器加载动画片段
How to get a loop to load movieclips with eventlisteners
我想要场景加载 5 个不同的影片剪辑(名为 B1-B5)。每个影片剪辑都放置在特定的 x 和 y 上。每个影片剪辑 grows/shrinks 卷 over/roll 出来....
我通过输入所有内容并每次复制每个部分来使代码正常工作,但它很混乱,我想通过循环来清理代码(如果可能的话?)。
这是有效的代码,但我必须为每个影片剪辑复制它(更改明显的位)...
var scene1:MovieClip = new B1();
addChild(scene1);
scene1.x = 170.30;
scene1.y = 231.15;
scene1.addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent1);
scene1.addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent1);
function onRollOverEvent1(e:MouseEvent) {
scene1.width=25.9;
scene1.height=25;
}
function onRollOutEvent1(e:MouseEvent) {
scene1.width = 20.9;
scene1.height = 20;
}
下面是我试过但卡住了好一阵子的...
for (var i:int=1; i<5; i++){
var scene[i]:MovieClip = new "B"+i();
addChild("scene"+i);
//var scene[i]:MovieClip = new B[i]();
scene[i].addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent);
scene[i].addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent)
function onRollOverEvent(e:MouseEvent) {
scene[i].width=25.9;
scene[i].height=25;
}
function onRollOutEvent(e:MouseEvent) {
scene[i].width = 20.9;
scene[i].height = 20;
}
}
scene1.x = 170.30;
scene1.y = 231.15;
scene2.x = 284.30;
scene2.y = 250.75;
scene3.x = 377.30;
scene3.y = 280.15;
scene4.x = 444.30;
scene4.y = 321.15;
scene5.x = 196.30;
scene5.y = 172.15;
首先,让我们回顾一下你的错误。
new "B"+i();
最好 转换为调用数字 i 作为函数并将结果添加到 "B" 作为字符串。但是即使 new "B1"() 也不等同于 new B1()。事实上,有一种方法 getDefinitionByName(..) 允许通过它的名字来寻址 class,但我不建议使用它,因为它是高级的主题。
var scene[i]:MovieClip
你不能用这种方式定义变量 scene1、scene2 等。您实际上可以设计的最接近的东西是方括号符号:this["scene" + i] = ....
addChild("scene"+i);
参数必须是 DisplayObject 实例,而不是 String.
for (...)
{
...
function onRollOverEvent(e:MouseEvent)
...
}
不要在其他函数或循环中定义函数。
scene[i].width = 20.9;
scene[i].height = 20;
到循环结束时 i 将等于 5,那么,您认为这样的记录将解决什么问题?
然后,解决方案。
当您将工作解决方案扩展到多个实例时,您将采用算法。循环和 数组 是你的朋友。
// Lets devise a list of classes and (x,y) coordinates.
var Designs:Array = [
null, // the 0-th element
{id:B1, x:170, y:230},
{id:B2, x:285, y:250},
];
for (var i:int = 1; i < Design.length; i++)
{
// Retrieve a record for the future object.
var aDesign:Object = Designs[i];
// Get a reference to the object's class.
var aClass:Class = aDesign.id;
// Create the object. Yes, you CAN omit () with
// the "new" operator if there are no mandatory arguments.
var aThing:Movieclip = new aClass;
// Set coordinates from the design record.
aThing.x = aDesign.x;
aThing.y = aDesign.y;
// Add to the display list.
addChild(aThing);
// Subscribe the event handlers.
aThing.addEventListener(MouseEvent.MOUSE_OVER, onOver);
aThing.addEventListener(MouseEvent.MOUSE_OUT, onOut);
// Save the object's reference for the later use.
// If you'd need to address, say, 3rd object,
// you do it as following:
// Designs[3].instance
aDesign.instance = aThing;
}
function onOver(e:MouseEvent):void
{
// You subscribed all of the objects to this one event handler.
// This is the correct way to learn, which one of the objects
// is under the mouse and is dispatching the said event.
var aThing:MovieClip = e.currentTarget as MovieClip;
// Change the object's size.
aThing.width = 26;
aThing.height = 25;
}
function onOut(e:MouseEvent):void
{
// Get the source of the dispatched event.
var aThing:MovieClip = e.currentTarget as MovieClip;
// Change the object's size.
aThing.width = 21;
aThing.height = 20;
}
我想要场景加载 5 个不同的影片剪辑(名为 B1-B5)。每个影片剪辑都放置在特定的 x 和 y 上。每个影片剪辑 grows/shrinks 卷 over/roll 出来....
我通过输入所有内容并每次复制每个部分来使代码正常工作,但它很混乱,我想通过循环来清理代码(如果可能的话?)。
这是有效的代码,但我必须为每个影片剪辑复制它(更改明显的位)...
var scene1:MovieClip = new B1();
addChild(scene1);
scene1.x = 170.30;
scene1.y = 231.15;
scene1.addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent1);
scene1.addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent1);
function onRollOverEvent1(e:MouseEvent) {
scene1.width=25.9;
scene1.height=25;
}
function onRollOutEvent1(e:MouseEvent) {
scene1.width = 20.9;
scene1.height = 20;
}
下面是我试过但卡住了好一阵子的...
for (var i:int=1; i<5; i++){
var scene[i]:MovieClip = new "B"+i();
addChild("scene"+i);
//var scene[i]:MovieClip = new B[i]();
scene[i].addEventListener(MouseEvent.MOUSE_OVER, onRollOverEvent);
scene[i].addEventListener(MouseEvent.MOUSE_OUT, onRollOutEvent)
function onRollOverEvent(e:MouseEvent) {
scene[i].width=25.9;
scene[i].height=25;
}
function onRollOutEvent(e:MouseEvent) {
scene[i].width = 20.9;
scene[i].height = 20;
}
}
scene1.x = 170.30;
scene1.y = 231.15;
scene2.x = 284.30;
scene2.y = 250.75;
scene3.x = 377.30;
scene3.y = 280.15;
scene4.x = 444.30;
scene4.y = 321.15;
scene5.x = 196.30;
scene5.y = 172.15;
首先,让我们回顾一下你的错误。
new "B"+i();
最好 转换为调用数字 i 作为函数并将结果添加到 "B" 作为字符串。但是即使 new "B1"() 也不等同于 new B1()。事实上,有一种方法 getDefinitionByName(..) 允许通过它的名字来寻址 class,但我不建议使用它,因为它是高级的主题。
var scene[i]:MovieClip
你不能用这种方式定义变量 scene1、scene2 等。您实际上可以设计的最接近的东西是方括号符号:this["scene" + i] = ....
addChild("scene"+i);
参数必须是 DisplayObject 实例,而不是 String.
for (...)
{
...
function onRollOverEvent(e:MouseEvent)
...
}
不要在其他函数或循环中定义函数。
scene[i].width = 20.9;
scene[i].height = 20;
到循环结束时 i 将等于 5,那么,您认为这样的记录将解决什么问题?
然后,解决方案。
当您将工作解决方案扩展到多个实例时,您将采用算法。循环和 数组 是你的朋友。
// Lets devise a list of classes and (x,y) coordinates.
var Designs:Array = [
null, // the 0-th element
{id:B1, x:170, y:230},
{id:B2, x:285, y:250},
];
for (var i:int = 1; i < Design.length; i++)
{
// Retrieve a record for the future object.
var aDesign:Object = Designs[i];
// Get a reference to the object's class.
var aClass:Class = aDesign.id;
// Create the object. Yes, you CAN omit () with
// the "new" operator if there are no mandatory arguments.
var aThing:Movieclip = new aClass;
// Set coordinates from the design record.
aThing.x = aDesign.x;
aThing.y = aDesign.y;
// Add to the display list.
addChild(aThing);
// Subscribe the event handlers.
aThing.addEventListener(MouseEvent.MOUSE_OVER, onOver);
aThing.addEventListener(MouseEvent.MOUSE_OUT, onOut);
// Save the object's reference for the later use.
// If you'd need to address, say, 3rd object,
// you do it as following:
// Designs[3].instance
aDesign.instance = aThing;
}
function onOver(e:MouseEvent):void
{
// You subscribed all of the objects to this one event handler.
// This is the correct way to learn, which one of the objects
// is under the mouse and is dispatching the said event.
var aThing:MovieClip = e.currentTarget as MovieClip;
// Change the object's size.
aThing.width = 26;
aThing.height = 25;
}
function onOut(e:MouseEvent):void
{
// Get the source of the dispatched event.
var aThing:MovieClip = e.currentTarget as MovieClip;
// Change the object's size.
aThing.width = 21;
aThing.height = 20;
}