0

私は actionscript が初めてです。

私の文書クラスは、

package
{
    //list of our imports these are classes we need in order to
    //run our application.
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;

    public class engine extends MovieClip
    {

        // moved ourShip to a class variable.
        private var Circle:circle = new circle()
        //our constructor function. This runs when an object of
        //the class is created
        public function engine()
        {
            addFrameScript(0, frame1);
            addFrameScript(1, frame2);
        }
        // frame 1 layer 1 --------------------------------------------------
        public function frame1()
        {
        stop();
        }
        //-------------------------------------------------------------------
        // frame 2 layer 1 --------------------------------------------------
        public function frame2()
        {
        Circle.x = stage.stageWidth / 2;
        Circle.y = stage.stageHeight / 2;
        addChild(Circle);
        }
        //-------------------------------------------------------------------
    }
}

最初に2つのフレームを作成しましたが、移動したいボタンと他の円が含まれていますが、移動せず、2番目のフレームの真ん中にとどまります

私のボタンクラスは

package
{
//imports
import flash.events.MouseEvent;
import flash.display.SimpleButton;
import flash.display.MovieClip;
//-------
public class start extends SimpleButton
 {
   public function start()
   {
   addEventListener(MouseEvent.CLICK, onTopClick);
   addEventListener(MouseEvent.MOUSE_OVER, onBottomOver);
   }

   function onTopClick(e:MouseEvent):void
   {
     MovieClip(root).gotoAndStop(2)
   }

   function onBottomOver(e:MouseEvent):void
   {
       }
 }
}

そして私の現在のサークルムービークリップは

package
{
    //imports
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.events.KeyboardEvent; 

  public class circle extends MovieClip
  {
    private var speed:Number = 0.5;
    private var vx:Number = 0;
    private var vy:Number = 0;
    private var friction:Number = 0.93;
    private var maxspeed:Number = 8;
    public function circle()
    {
        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    }
    public function loop(e:Event) : void
    {
        addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
        x+=vx;
        y+=vy
    }
    function keyHit(event:KeyboardEvent):void {
        switch (event.keyCode) {
            case Keyboard.RIGHT :
            vx+=speed;
            break;
            case Keyboard.LEFT :
            vx-=speed;
            break;
            case Keyboard.UP :
            vy-=speed;
            break;
            case Keyboard.DOWN :
            vy+=speed;
            break;
            }

            }
  }
}

皆さんに読んでもらうためにたくさん投稿して申し訳ありませんが、誰かが私を助けてくれる唯一のウェブサイトはstackoverflowです!

4

1 に答える 1

1

あなたはいくつかの重大な誤りを犯しました。まず、addFrameScript()コードをフレームに配置する適切な方法ではありません。Flash のエディタを使用してタイムラインにコードを配置してください。(IIRCでは、追加するすべてのコードを機能させるために、2つのうち1つの呼び出しを行う必要があります)そして、MCがコードを含むフレームである場合、MCのフレームに追加したコードはフレームごとに実行されcurrentFrameます. Circleしたがって、フレームごとにステージの中央に配置する関数「frame2()」を追加しています。代わりに、設計時に 2 番目のフレームまたはコンストラクターに配置する (プロパティにリンクする) 必要があります。または、フレームを使用するSprite代わりにMovieClip、1 つの単一フレームを使用して、追加および削除するコンテナー スプライトを使用できます。それらを自由に、または行動で。

もう 1 つの大きな間違いは、enterframe リスナー内にイベント リスナーを追加することです。これらは蓄積され、互いに上書きされないため、複数の関数を特定のイベントのリスナーとして指定したり、1 つの関数を複数回指定したりすることができます。後者が発生するため、フレームごとにリスニングkeyHit関数の別のインスタンスがリスナーとして追加されます。リスナーを割り当てる適切な方法は、コンストラクター、または手動でトリガーされたイベント (たとえば、MouseEvent.CLICK) をリッスンする関数のいずれかですが、各関数で複数回リッスンし、それらの関数でのみリッスンすることについて予防策を講じる必要があります。今すぐ必要です。

編集:わかりました。あなたのコードは:

        addFrameScript(0, frame1);
        addFrameScript(1, frame2);

より正しい方法は次のとおりです。

addFrameScript(0,frame1,1,frame2);

その理由は、 への呼び出しによって、すべてのタイムライン コードがここで指定したものにaddFrameScript 置き換えられるからです。この関数は、おそらくステージと AS3 環境への影響のため、文書化されていません。addFrameScript()これまでのドキュメントに最も近いのは、このリンクです。

次へ: コードは次のとおりです。

public function circle()
{
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
public function loop(e:Event) : void
{
    addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
    x+=vx;
    y+=vy
}

正しい書き方は以下の通りです。

public function circle()
{
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE,init);
}
private function init(e:Event=null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE,init);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
}
public function loop(e:Event) : void
{
    x+=vx;
    y+=vy
}

リスナーが永続的であるか、オブジェクトを作成したらすぐにアクティブにしたい場合は、コンストラクターでリスナーを割り当てる必要があります。リスナーは別のケースです。リスナーを機能させるには、オブジェクトを作成する時点では使用できないKeyboardEventため、に割り当てる必要があるため、中間レイヤーが必要です-オブジェクトが呼び出されるときにのみ呼び出される関数ステージに追加されます。この時点で は null ではなくなり、そこでイベント リスナーを割り当てることができます。サークルを最終的に非表示にしたい場合は、削除処理コードのある時点でステージに割り当てたリスナーを削除する必要があることに注意してください。stageinit()stage

次へ: あなたのコード:

    public function frame2()
    {
    Circle.x = stage.stageWidth / 2;
    Circle.y = stage.stageHeight / 2;
    addChild(Circle);
    }

正しいコードは次のとおりです。

public function frame2():void 
{
    if (Circle.parent) return; // we have added Circle to stage already!
    Circle.x = stage.stageWidth / 2;
    Circle.y = stage.stageHeight / 2;
    addChild(Circle);
}

ほら、MCが2番目のフレームで停止するたびにこれを呼び出しているため、常にCircleの座標をステージの中心にリセットするため、移動するかどうかを確認できません(移動しないようにキーボードリスナーを割り当てているため、移動しません)ステージ)。

間違いは他にもあるかもしれませんが、これらを修正すると、MC が少しカチカチ音をたてるようになります。

于 2013-10-04T16:34:32.310 に答える