0

いつENTER_FRAME止まる?
1. removeEventListener(Event.ENTER_FRAME,abc);
2. エラーが発生するか、フラッシュがクラッシュ
します。 3. クラスのインスタンスがステージ
4 から削除されます。

ストーリー:
ゲーム用の AS ドキュメントがいくつかあります。そのうちの 1 つに、ENTER_FRAME追加する敵が含まれています。
通常は問題なく動作しますが、時々敵を召喚しなくなります。何も変更していません。もう一度テストするために Ctrl+enter を押しました。
私はtraceチェックに慣れていて、ENTER_FRAME停留所を見つけました。
それ以外の場合は、traceの別の AS ファイルに入れてENTER_FRAME、実行を続けます。それが機能しているかどうかをテストするための levelmanage クラスの
別のクラスで、両方とも停止します。エラーも発生せず、キーを介してオブジェクトを移動できます。 levelmange クラスはどのオブジェクトにも接続しません。ステージ上の何かが削除されても、停止するべきではありません。 何が問題なのですか? ENTER_FRAMEaddEventListener(Event.ENTER_FRAME, process);

以下のアズコードは動作を停止したものです。

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.*;
    public class levelmanage extends MovieClip
    {
        var testing:int=0
        private var sttage = ninelifes.main;
        public var framerate = ninelifes.main.stage.frameRate;
        public var levelprocess:Number = 0;
        public var levelprocesss:Number = 0;
        private var level:int;
        public var randomn:Number;
        public function levelmanage(levell:int)
        {
            level = levell;
            addEventListener(Event.ENTER_FRAME, process);
        }
        function process(e:Event)
        {
            testing+=1
            if(testing>200){
                testing=0
                trace("working")//it don't trace "working"sometimes which means enterframe doesn't going
            }
            if (levelprocess>levelprocesss)trace(levelprocess);
            levelprocesss = levelprocess;
            if (levelprocess>=100 && enemy.enemylist.length==0)
            {
                finish();
                return();
            }
            if (levelprocess<=100 && enemy.enemylist.length<6)
            {
                switch (level)
                {
                    case 1 :
                        arrange("cir",0.5);
                        arrange("oblong",1);
                        break;
                }
            }
            }
        public function arrange(enemyname:String,frequency:Number)
        {
            randomn = Math.random();
            if (randomn<1/frequency/framerate)
            {
                var theclass:Class = Class(getDefinitionByName(enemyname));
                var abcd:*=new theclass();
                sttage.addChild(abcd);
                trace("enemyadded")
                switch (enemyname)
                {
                    case "cir" :
                        levelprocess +=  5;
                        break;
                    case "oblong" :
                        levelprocess +=  8;
                        break;
                }
            }
        }
        private function finish()
        {
            levelprocess=0
            trace("finish!");
            removeEventListener(Event.ENTER_FRAME,process);//not this one's fault,"finish" does not appear.
            sttage.restart();
        }
    }
}
4

2 に答える 2

1

最終的に「levelprocess==100」および「enemy.enemylist.length==0」状態に達する可能性があります。これにより、レベルが終了し、より多くの敵が出現する可能性が生じます。これは明らかに異常な状態です。不運ではありますが、これがエラーの原因である可能性があります。これを簡単に修正するには、「return;」を挿入します。finish() を呼び出した直後。また、「levelmanage」オブジェクトが何らかの形でステージから削除され、フレーム開始イベントの受信を停止する可能性もあります。これは、1 つのオブジェクトが 2 つの「sttage.restart()」呼び出しをスローすることによってトリガーされる可能性があります。「プロセス」関数でいつでもこの条件が真であるかどうかを確認し、この動作との相関関係を確認してください。そして、そのような状態が発生する可能性を必ず排除してください。

于 2012-09-02T17:12:17.520 に答える
0
if(testing>200){
                testing=0
                trace("working")//it don't trace "working"sometimes which means enterframe doesn't going
            }

あなたのコメントの控除は正しくありません。これは EnterFrame が起動していない testing <= 200、 .

関数の先頭にトレースを配置してみてくださいprocess

他の場所にない場合はremoveEventListener、EnterFrame が実際に停止している可能性は低いです。投稿した例から確認するのは難しいですが、EnterFrame イベント自体の問題ではなく、ロジックのどこかに問題があると思います。

于 2012-09-03T08:37:19.643 に答える