编辑: 哇,我没有意识到我做了很多太糟糕的事情。这是我自己编写的第一个代码,没有使用学校提供的东西。我猜想在经过这么少的课程后,我试着咬掉的东西比我能咬的还多。
我在google搜索答案之后获得了大部分内容,然后复制了我想要的代码部分(强调'思考')我需要。
还有办法'保存'代码吗?或者最好是废弃它并重新开始?无论哪种方式,那么正确的方法是什么?
另外,如果可以,我会问我的老师。但是我们不再和他一起上课,因此这个男人不再可用了(或者至少没有回复我的电子邮件。)我正在为自己的另一个学校作业做这件事。所以这就是我转向互联网的原因。
感谢你解释所做的一切。我很感激您花时间这样做:)
现在,回答你的一些问题,并提出新的问题:
只有第一个符号被称为符号1,其他符号都有“真实”的名称。当我启动项目并保持这种状态时,我忘了改变它,因为我确切知道它是什么,因为它是唯一一个这样称呼的方式。
..你知道如果计数器等于5,会出现什么样的名字? “HalfCircle15”。 是的,我意识到了。现在,我认为这样,同意这不是一个非常简洁的方式来写下来。在命名我的HalfCirlce1-4时没想到这一点。
您认为它做什么? 好的,让我试着更清楚地解释一下: 当您拖放副本时,您无法再移动它/选择它。我希望用户能够选择它,因此他可以根据需要再次拖放它。所以,我认为这意味着我必须将eventListeners添加到我制作的所有副本中?这就是我在这里尝试做的事情。 另外,感谢错误说明。 那么,这更像是吗?:
function makeListeners(copy:DisplayObject):void
{
var i = this.numChildren;
i.addEventListener(MouseEvent.CLICK, moveCopy);
}
我还将makeListeners调用移动到我制作副本的地方。所以当你制作副本时,它应该只运行一次,对吗?
为什么使用索引3作为“最新的子”索引?这没有任何意义。 我用谷歌搜索了如何做到这一点,我相信它告诉我''索引'是'层'(缺少更好的词)你想把孩子添加到?我将它添加到3,以便它们高于我的一些其他图像和其他图像。它看起来像那样工作,虽然现在我也开始质疑这一点。
这就是我现在所拥有的(删除了其他数字,以便更容易查看代码)。这给了我一个新的错误 TypeError:错误#1006:value是geen functie。 在rondje1 / makeListeners() 在rondje1 / dragRondje(): 所以我意识到这是不对的。但这至少比以前的方向更正确吗?
import flash.display.*;
import flash.events.MouseEvent;
import flash.ui.Mouse;
var counter=1;
var copy;
//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
this["rondje"+ (counter)]=new block;
this["rondje"+(counter)].x=mouseX-45;
this["rondje"+ (counter)].y=mouseY-45;
copy = addChildAt(this["rondje"+(counter)], 3);
counter++;
copy.startDrag();
makeListeners(copy);
}
//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
stopDrag();
}
//Remove latest child
buttonRemoveChild.addEventListener(MouseEvent.CLICK, removeNewestChild);
function removeNewestChild(event:MouseEvent):void
{
var i = 0;
i = this.numChildren;
if (i > 10 )
{
this.removeChildAt(3);
}
}
function makeListeners(copy:DisplayObject):void
{
var i = this.numChildren;
i.addEventListener(MouseEvent.CLICK, moveCopy);
}
function moveCopy(event:MouseEvent):void
{
trace('move copy!');
}
ORINIAL POST 我正在为一个学校项目做一些“拖放”的事情,但我遇到了一个问题。
现在我已经设置了当你点击一个按钮时,你开始从库中拖动一个符号的副本。当您单击应用程序中的某个位置时,再次将其删除。 我遇到的问题是允许用户选择此副本以再次拖动它的代码。
它给了我这个错误:
TypeError:错误#1034:类型强制失败:无法将块@ 2a308041转换为flash.events.Event。在rondje1 / dropEverything()
以下是我制作副本的代码:
//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
this["rondje"+ (counter)]=new block;
this["rondje"+(counter)].x=mouseX-45;
this["rondje"+ (counter)].y=mouseY-45;
copy = addChildAt(this["rondje"+(counter)], 3);
counter++;
copy.startDrag();
}
代码放置它的位置,并将eventlisteners添加到副本中:
//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
stopDrag();
makeListeners(copy);
}
添加侦听器的代码:
function makeListeners(e:Event):void
{
var i = 0;
i = this.numChildren;
for (i = this.numChildren;i<10;i++)
{
this.addEventListener(MouseEvent.CLICK, moveCopy);
}
}
function moveCopy(event:MouseEvent):void
{
trace('move copy!');
}
符号设置如下:
我真的不明白为什么我在这里收到错误:S 希望有人可以帮助我。我永远感激不尽。 提前致谢, XX
ps:这是整个代码:
import flash.display.*;
import flash.events.MouseEvent;
import flash.ui.Mouse;
var counter=1;
var copy;
//Copy dan drag and drop Rondje
buttonRondje.addEventListener(MouseEvent.CLICK, dragRondje);
function dragRondje(event:MouseEvent):void
{
this["rondje"+ (counter)]=new block;
this["rondje"+(counter)].x=mouseX-45;
this["rondje"+ (counter)].y=mouseY-45;
copy = addChildAt(this["rondje"+(counter)], 3);
counter++;
copy.startDrag();
}
//Copy dan drag and drop HalfCircle1
buttonHalfCircle1.addEventListener(MouseEvent.CLICK, dragHalfCircle1);
function dragHalfCircle1(event:MouseEvent):void
{
this["HalfCircle1"+(counter)]=new HalfCircle1;
this["HalfCircle1"+(counter)].x=mouseX - 45;
this["HalfCircle1"+(counter)].y=mouseY - 55;
copy = addChildAt(this["HalfCircle1"+(counter)], 3);
counter++;
copy.startDrag();
}
//Copy dan drag and drop HalfCircle2
buttonHalfCircle2.addEventListener(MouseEvent.CLICK, dragHalfCircle2);
function dragHalfCircle2(event:MouseEvent):void
{
this["HalfCircle2"+(counter)]=new HalfCircle2;
this["HalfCircle2"+(counter)].x=mouseX - 45;
this["HalfCircle2"+(counter)].y=mouseY - 55;
copy = addChildAt(this["HalfCircle2"+(counter)], 3);
counter++;
copy.startDrag();
}
//Copy dan drag and drop HalfCircle3
buttonHalfCircle3.addEventListener(MouseEvent.CLICK, dragHalfCircle3);
function dragHalfCircle3(event:MouseEvent):void
{
this["HalfCircle3"+(counter)]=new HalfCircle3;
this["HalfCircle3"+(counter)].x=mouseX - 45;
this["HalfCircle3"+(counter)].y=mouseY - 5;
copy = addChildAt(this["HalfCircle3"+(counter)], 3);
counter++;
copy.startDrag();
}
//Copy dan drag and drop HalfCircle4
buttonHalfCircle4.addEventListener(MouseEvent.CLICK, dragHalfCircle4);
function dragHalfCircle4(event:MouseEvent):void
{
this["HalfCircle4"+(counter)]=new HalfCircle4;
this["HalfCircle4"+(counter)].x=mouseX - 45;
this["HalfCircle4"+(counter)].y=mouseY - 5;
copy = addChildAt(this["HalfCircle4"+(counter)], 3);
counter++;
copy.startDrag();
}
//Copy dan drag and drop Streep
buttonStreep.addEventListener(MouseEvent.CLICK, dragStreep);
function dragStreep(event:MouseEvent):void
{
this["streep"+(counter)]=new Streep;
this["streep"+(counter)].x=mouseX - 2;
this["streep"+(counter)].y=mouseY - 5;
copy = addChildAt(this["streep"+(counter)], 3);
counter++;
copy.startDrag();
}
//DROP
stage.addEventListener(MouseEvent.MOUSE_UP, dropEverything);
function dropEverything(event:MouseEvent):void
{
stopDrag();
makeListeners(copy);
}
//Remove latest child
buttonRemoveChild.addEventListener(MouseEvent.CLICK, removeNewestChild);
function removeNewestChild(event:MouseEvent):void
{
var i = 0;
i = this.numChildren;
if (i > 10 )
{
this.removeChildAt(3);
}
}
function makeListeners(e:Event):void
{
var i = 0;
i = this.numChildren;
for (i = this.numChildren;i<10;i++)
{
this.addEventListener(MouseEvent.CLICK, moveCopy);
}
}
function moveCopy(event:MouseEvent):void
{
trace('move copy!');
}
答案 0 :(得分:1)
您的代码可以改进。如果学校学会了你编码和命名这样的东西,你应该生气。名为“符号1”的符号未完成,就像使用荷兰语名称编码一样。我建议让代码更清洁。
this["HalfCircle1"+(counter)]
..你知道如果计数器等于5,会出现什么样的名字? “HalfCircle15”
仔细看看这个功能:
function makeListeners(e:Event):void
{
var i = 0;
i = this.numChildren;
for (i = this.numChildren;i<10;i++)
{
this.addEventListener(MouseEvent.CLICK, moveCopy);
}
}
您认为它有什么作用?首先,将i设置为0.然后将其设置为当前影片剪辑中的子项数。这可以是任何数字。所以首先将其设置为0是没有意义的。但是为什么在世界上你想要从3循环到10并且不使用索引i
?你只是多次做同样的事情。在听众的情况下,这是不好的做法。
你多次向同一个对象添加相同的监听器(?!)1个相同类型的监听器应该足够,否则它会过度杀戮并且会产生不必要的影响。
对我而言,目前还不清楚你要做什么,但我想你的意思是将侦听器添加到特定对象,因为你使用的是numChildren。
makeListeners(copy);
函数makeListeners
需要Event
作为参数,您发送的copy
是DisplayObject
。这会导致错误。您可能应该将e:Event
更改为copy:DisplayObject
,这会隐藏错误。
在您的代码中,看起来您在每次拖动/点击时都会继续添加侦听器,但是没有一个被删除。这意味着如果你点击10次,moveCopy可以调用100次(!)这将在点击时增加。您应该使用某种call-once init-function添加一次侦听器。
// add child at certain index
copy = addChildAt(this["HalfCircle4"+(counter)], 3);
// and..
this.removeChildAt(3);
我想知道为什么你使用索引3作为'最新的孩子'索引?
很抱歉,也许这条评论不是很有用,也不是问题的答案,但您的代码可以在几个方面得到改进。如果它已经因为黑魔法而起作用,但它充满了泄漏和不那么干净的代码。
我认为这足以创建一个复制并拖动该剪辑应用程序:
import flash.display.*;
import flash.events.MouseEvent;
var _lastClip:MovieClip;
// add a listener to all buttons.
buttonRondje.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle1.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle2.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle3.addEventListener(MouseEvent.CLICK, handleClick);
buttonHalfCircle4.addEventListener(MouseEvent.CLICK, handleClick);
buttonStreep.addEventListener(MouseEvent.CLICK, handleClick);
function handleClick(event:Event):void
{
var clip:MovieClip;
trace("Clicked on: " + clip);
// based on which clip is clicked, we deside which object should be created.
switch(event.currentTarget)
{
case buttonRondje:
{
clip = new Circle();
break;
}
case buttonHalfCircle1:
{
clip = new HalfCircle1();
break;
}
case buttonHalfCircle2:
{
clip = new HalfCircle2();
break;
}
case buttonHalfCircle3:
{
clip = new HalfCircle3();
break;
}
case buttonHalfCircle4:
{
clip = new HalfCircle4();
break;
}
case buttonStreep:
{
clip = new Streep();
break;
}
}
// Move to mouse. It would be better to move the center points inside the clips so we don't need custom offsets here
clip.x = mouseX;
clip.y = mouseY;
clip.startDrag();
this.addChildAt(clip, 3);
// remember the latest added clip
this._lastClip = clip;
}
stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
function handleMouseUp(event:MouseEvent):void
{
// if you where dragging, stop it
if(this._lastClip)
{
this._lastClip.stopDrag();
}
}