0

編集:うわー、私は自分がそんなにひどく間違ったことをしていることに気づいていませんでした。これは、学校が提供したものを使用せずに、私が自分で書いた最初のコードです。数回のレッスンの後、噛むことができる以上に噛み砕こうとしたと思います。

答えをグーグルで検索し、必要だと思ったコードの部分(「思考」を強調)をコピーした後、このほとんどを取得しました。

コードを「保存」する方法はまだありますか?それとも、それを廃棄して新たに開始するのが最善ですか?そしていずれにせよ、それを行う正しい方法は何ですか?

また、できれば先生に聞いてみます。しかし、私たちはもう彼と一緒にクラスを持っていないので、その男はもう利用できません(または少なくとも私の電子メールに応答していません)。私は別の学校の割り当てのためにこれを自分で行っています。だから私はインターネットに目を向けました。

あなたがしたすべてを説明してくれてありがとう。お時間を割いていただきありがとうございます:)

さて、あなたの質問のいくつかに答えて、新しい質問をするために:

最初のシンボルのみがシンボル1と呼ばれ、他のシンボルはすべて「実際の」名前を持っています。プロジェクトを始めたとき、それを変更するのを忘れて、それが何であるかを正確に知っているので、それをそのままにしました。それは、そのように呼ばれる唯一のものだからです。

..カウンターが5の場合、その名前からどのような名前が出てくるか知っていますか?「HalfCircle15」。 はい、わかりました。そして今、私はそれをそのように見ているので、それを書き留めるのはあまりきちんとした方法ではないことに同意します。私のHalfCirlce1-4に名前を付けるとき、それを十分に考えていませんでした。

あなたはそれが何をすると思いますか? わかりました。もっと明確に説明しましょう。コピーをドラッグアンドドロップすると、移動/選択できなくなります。ユーザーがそれを選択できるようにしたいので、ユーザーは何度でもドラッグアンドドロップできます。だから、これは私が作成するすべてのコピーにeventListenersを追加する必要があることを意味すると思いますか?それが私がここでやろうとしていたことです。また、エラーの説明に感謝します。だから、これはもっと似ていますか?:

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

また、makeListeners呼び出しをコピーを作成する場所に移動しました。ですから、コピーを作成するときに、一度だけ実行する必要がありますよね?

なぜインデックス3を「最新の子」インデックスとして使用しているのですか?それは本当に意味がありません。 私はこれを行う方法をグーグルで検索しました、そしてそれはあなたが子供を追加したい「レイヤー」(より良い言葉の欠如のために)であると私に言ったと思いますか?3に追加して、他の画像の上と下に配置しました。それはそのように機能しているように見えましたが、今私もこれに疑問を呈し始めています。

これが私が今持っているものです(コードを見やすくするために他の図を削除しました)。これにより、新しいエラーTypeError:Error#1006:value isgeenfunctieが発生します。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

あなたのコードは改善される可能性があります。もし学校があなたにこのようなコーディングと名前付けを教えたら、あなたは腹を立てるはずです. 'Symbol 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 までループして index を使用したくないのiでしょうか? 同じことを何度も繰り返しているだけです。リスナーの場合、それは悪い習慣です。同じリスナーを同じオブジェクトに複数回追加します (?!) 同じタイプのリスナーが 1 つあれば十分です。

私にはあなたが何をしようとしているのかは不明ですが、numChildren を使用しているため、特定のオブジェクトにリスナーを追加することを意味していると思います。

エラーの解決

makeListeners(copy);

関数makeListenersEventas パラメータを必要とします。送信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();
     }
}
于 2012-06-11T10:07:57.170 に答える