2011-01-18 4 views
0

私は質問がありました:AS 3.ドラッグ可能なポストイットのノートムービークリップを作成しました。ノートのパッド全体を作成するか、少なくともこれをシミュレートします。これを行う最善の方法は、startDrag()が起動されるたびに別のPost-Itを追加することだと思いました。MCの複数のコピーを動的にインスタンス化する

私は最初に記号でポストイットを作成しようとしましたが、この方法で新しいものを動的に作成することはできませんでした。その後、クラスを作成してステージに追加しました。

... addChild(新しいPostItNote());

しかし、ステージ上のx、yの位置を設定することができませんでした(またはわからない)。

誰かが、これを達成するための最良の方法、あるいは別の方法を提案していますか?

EDIT:

package { 

import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.text.TextField; 
import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.text.TextFormat; 

public class CoinHitTest extends MovieClip { 

    var count:Number = 0; 
    var total_count:TextField; 
    var hitting:Boolean = false; 
    var coinSnd:Sound = new coin_drop(); 
    var myMoney:TextFormat = new TextFormat(); 
    var noteStack:Vector.<PostItNotes> = new Vector.<PostItNotes>(); 

public function CoinHitTest(){ 
    for(var $i:int = 0; $i <5;$i++) 
{ 
    var newPostIt:PostItNotes = new PostItNotes(); 
    this.addChild(newPostIt); 
    this.noteStack.push(newPostIt); 
} 
// constructor code 
    coin.addEventListener(MouseEvent.MOUSE_DOWN, __handleCoinDown); 
    coin.addEventListener(MouseEvent.MOUSE_UP, __handleCoinUp); 

    total_count = new TextField(); 
    total_count.x = 795.20; 
    total_count.y = 506.15; 
    total_count.mouseEnabled = false; 

    myMoney.size = 28; 
    total_count.defaultTextFormat = myMoney; 
    total_count.text = String("$" + count); 
    addChild(total_count); 
    } 

    private function __handleCoinDown($evt:MouseEvent):void { 

    coin.startDrag(true); 
    coin.scaleX = 1.5; 
    coin.scaleY = 1.5; 
    addEventListener(Event.ENTER_FRAME, __checkHit); 
    } 

    private function __handleCoinUp($evt:MouseEvent):void { 
    coin.stopDrag(); 
    coin.scaleX = 1; 
    coin.scaleY = 1; 
    removeEventListener(Event.ENTER_FRAME, __checkHit); 
    } 

    private function __checkHit($evt:Event):void { 
    if (this.coffee.hitTestPoint(coin.x,coin.y, false)) 
    { 
     // do our in-circle check 
     if((coffee.x - coin.x) * 2 + (coffee.y - coin.y) * 2 <= (coffee.width/2 + coin.width/2) * 2) 
     { 
      stopDrag(); 
      coin.scaleX = 1; 
    coin.scaleY = 1; 
      removeChild(coin); 
      coin.x = 116; 
    coin.y = 380.1; 
     addChild(coin); 

     } 
    } 
    else 
    { 
     trace("Didn't Hit Mug"); 
    } 
    if (this.coin.hitTestObject(target)) { 
    if (!hitting) { 
     coinSnd.play(); 
    count++; 
     total_count.text = String("$" + count); 
     coin.stopDrag(); 

    removeChild(coin); 
    hitting = !hitting; 

    coin.x = 116; 
    coin.y = 380.1; 
     addChild(coin); 
    coin.scaleX = 1; 
    coin.scaleY = 1; 

} 
    } else { 
    hitting = false; 
    } 
    } 

    } 
} 

はEDIT:

package { 
    import flash.display.MovieClip; 
public class PostItNotes extends Sprite{ 

     public function PostItNotes() { 
      // constructor code 
     } 

    } 

} 

答えて

0

問題は、PostItNotesをClassクラスではなくBaseClassとして設定することです。

つまり、ステージに追加するのはロジックだけでグラフィック要素は含まないクラスです。

あなたがする必要があるのは、ライブラリのシンボル→右クリック→プロパティに戻り、BaseClassをflash.display.MovieClipに変更します(そうでない場合はflash.display.Sprite)。タイムラインが必要です)、PostItNotesをクラスとして設定します。

EDIT:

package { 

    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class PostItNotes extends Sprite { 

     public function PostItNotes() { 
      super(); 

      addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag); 
     } 

     protected function onStartDrag (event:MouseEvent):void { 

      stage.addEventListener(MouseEvent.MOUSE_UP, onStopDrag); 
      startDrag(false); 

     } 

     protected function onStopDrag (event:MouseEvent):void { 

      stage.removeEventListener(MouseEvent.MOUSE_UP, onStopDrag); 
      stopDrag(); 

     } 
    } 
} 

私はドラッグは本当に唯一のポストそれ自体に関係するとして、それが属するところ、これがあると思うので、私はあなたのPostItNotesクラスにドラッグアクションを追加しました。

ドラッグコードは、以前はどこかで削除する必要があります。

新しいPostItの作成についてのサポートも必要ですか?

+0

近づいて...私は思う。問題は、私のドラッグアンドドロップは、コード内に作成されたシンボルではなく、ステージ上に配置されたシンボルでのみ機能することです。私はシンボル上にドラッグ&ドロップのコードスニペットを使用しました。 – Casey

+0

質問をもう一度編集し、作成したPostItNotesクラスのコードを投稿してください。 – Mathias

+0

私のPostItNotesクラスをペーストしました。あなたが見るように、空になっているのは、その中にあったすべてが描画メソッドであったからです。ステージ上のシンボルとクラスを削除したので、削除しました。私はこのクラスに何かを持っているべきですか? – Casey

0

があなたのPostItNoteオブジェクトへの参照を保持するためのベクトルを作成してみてください...このような

何か:

var noteStack:Vector.<PostItNote> = new Vector.<PostItNote>(); 
for(var $i:int = 0; $i <5;$i++) 
{ 
    var newPostIt:PostItNote = new PostItNote(); 
    this.addChild(newPostIt); 
    this.noteStack.push(newPostIt); 
} 

そして、あなたあなたがところでPostItNote(X/Y/Z /何でも)

this.noteStack[0].x = 24; 
0

のプロパティを変更できるようにしたい時はいつでもちょうどベクトルの要素を参照することができます:あなたがしてAS3クラスを組み合わせることができますSymbolを使用して、同じクラス内でコードとグラフィックを操作できます。

PostItをグラフィック要素として扱い、ActionScriptで記述されたすべてのロジックを処理する必要がある場合は、それが簡単かもしれません。

こうすることで、PostItクラス自体のすべてのドラッグ操作を処理できます。質問のこの部分について

+0

ありがとうございます。コードwoksよくgreatdecayとマシア私は本当にありがとう、これを学ぶことがうれしいです:D – Casey

+0

私は助けることができるgaldです。しかし、1つの答えが実際にあなたの質問に答えたときはいつも、それを正解とマークしてください。これはどういうわけか、この全体的なstackoverflowの仕組みがどのように機能するのか... :)ありがとう。 – Mathias

+0

ああ申し訳ありませんが、私はそれを見ていませんでした:)コードの実装が完了しました。それはうまくいくと思いましたが、シンボルをクラスに提案してリンクしたら、下に。私は(var $ i:int = 0; $ i <5; $ i ++)を置く。 { var newPostIt:PostItNotes = new PostItNotes(); this.addChild(newPostIt); this.noteStack.push(newPostIt); }これを私のメインクラスのコンストラクターに入れて、バットから右に5を作ってもいいと思っています。 – Casey

0

私は、クラスを作成し、 ステージにこれを追加しました:

...にaddChild(新しいPostItNote());

ステージでx、yの位置を設定することができませんでした(またはわからない( )。への参照を保持するために言い換えれば

var newPostIt:PostItNote = new PostItNote(); 
newPostIt.x = 100; 
newPostIt.y = 200; 
addChild(newPostIt); 

、:

あなたがそのように追加した新しいオブジェクトのxとyを設定する最も基本的で一般的な方法は、おそらくこのような何かをすることですaddChild(新しいPostItNote())を実行する代わりに作成した新しいオブジェクトを作成し、x、yなどのプロパティをステージに追加する前(または後)に設定します。

+0

問題ですラース私はそれらの100のように作成する必要がありますので、それらを1つずつ作成する方法で時間がかかるでしょう。 – Casey

関連する問題