0

编辑:哇,我没有意识到我做了这么多非常错误的事情。这是我自己编写的第一个代码,没有使用学校提供的东西。猜猜我在几节课后试图咬得比我能咀嚼的更多。

在谷歌搜索答案然后复制我认为需要的代码部分(强调“思想”)后,我得到了大部分内容。

还有办法“保存”代码吗?还是最好放弃它并重新开始?无论哪种方式,那么正确的方法是什么?

另外,我会问我的老师是否可以。但是我们不再和他一起上课,因此这个人不再可用(或者至少不回复我的电子邮件。)我自己做这个是为了另一个学校作业。所以这就是我转向互联网的原因。

谢谢你解释你所做的一切。我很感激你花时间这样做:)

现在,继续回答您的一些问题,并提出新问题:

只有第一个符号称为符号 1,其他符号都有“真实”名称。当我开始这个项目并保持这种状态时,我忘记了改变它,因为我确切地知道它是什么,因为它是唯一一个这样称呼的。

.. 你知道如果计数器等于 5 会产生什么样的名字吗?“半圆 15”。 是的,我意识到这一点。现在我看到它是这样的,同意这不是一个很好的写下来的方式。在命名我的 HalfCircle1-4 时没有考虑足够的问题。

你认为它有什么作用? 好吧,让我尝试更清楚地解释它:当您拖放副本时,您不能再移动/选择它。我希望用户能够选择它,这样他就可以随意多次拖放它。所以,我认为这意味着我必须将 eventListeners 添加到我制作的所有副本中?这就是我在这里想要做的。另外,感谢您的错误解释。那么,这更像是它吗?:

function makeListeners(copy:DisplayObject):void
{
    var i = this.numChildren;
    i.addEventListener(MouseEvent.CLICK, moveCopy);
}

我还将 makeListeners 调用移到了我制作副本的地方。所以它应该只运行一次,当你制作副本时,对吧?

你为什么使用索引 3 作为“最新的孩子”索引?这没有任何意义。 我用谷歌搜索了如何做到这一点,我相信它告诉我“索引”是您想要将孩子添加到的“层”(因为没有更好的词)?我将它添加到 3,以便它们位于我的其他一些图像之上和其他一些图像之下。它似乎是这样工作的,尽管现在我也开始质疑这一点。

这是我现在所拥有的(删除了其他数字,以便更容易查看代码)。这给了我一个新的错误 TypeError: Error #1006: value is 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();       
}

代码放在哪里,并将事件监听器添加到副本中:

//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!');
}

符号设置如下:

  • 名称:符号 1
  • 类型:电影剪辑
  • 为 ActionScript 导出 -> 选中
  • 在第 1 帧中导出 -> 选中
  • 类:块
  • 基类:flash.display.MovieClip

我真的不明白为什么我在这里遇到错误: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!');
}
4

1 回答 1

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 并且不使用 indexi呢?你只是多次做同样的事情。在听众的情况下,这是不好的做法。您将相同的侦听器多次添加到同一个对象(?!) 1 个相同类型的侦听器应该足够了,否则它会矫枉过正并且会产生不必要的效果。

对我来说,不清楚您要做什么,但我想您的意思是向特定对象添加侦听器,因为您使用的是 numChildren。

解决错误

makeListeners(copy);

该函数makeListeners需要一个Eventas 参数,您正在发送copy,它是一个DisplayObject. 这会导致错误。您可能应该更改e:Eventcopy:DisplayObject,这将隐藏错误。

在您的代码中,您似乎在每次拖动/单击时都不断添加侦听器,但没有一个被删除。这意味着如果您单击 10 次,则 moveCopy 可以称为 100 次(!)这将在单击时增加。您应该使用某种 call-once init 函数添加一次侦听器。

// 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();
     }
}
于 2012-06-11T10:07:57.170 回答