0

私は簡単なゲームを作っています。これが私が直面している問題ですが、最初にクラス構造を説明します。(フラッシュcs5.5を使用しています)

Enemy.as: このクラスは、簡単な敵の動きと方向のコードを持つ、(ライブラリ内の) MovieClip とリンクされています。

Hero.as: ライブラリ内の MovieClip とリンクされています。Code of Hero シンプルな動き

EnemyManager.as:20秒ごとに新しい敵を作成します。

HeroManager.as:ヒーローを作成します(一度だけ、他の機能は後で追加されます)。

HittingManager.as: 共謀のチェック(ここで問題)

このクラスに HitTestObject 機能を追加したいので、今私の問題はHittingManager.asクラスにあります。3 つの重要なクラスのコードを投稿します。( EnemyManager.as, HeroManager.as, HittingManager.as )

package  
{    
import flash.display.MovieClip;
import flash.events.Event;

public class HeroManager extends MovieClip
{
    private var hManager:HittingManager = new HittingManager();
    public static var hero:Hero = new Hero();

    public function HeroManager() 
    {
        addEventListener(Event.ADDED_TO_STAGE, added);
    }

    private function added(event:Event):void
    {
        trace("hero manager added");

    }

    }//class

}//package

これが EnemyManager.as クラスのコードです

package 
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.sampler.Sample;
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.sampler.NewObjectSample;

public class EnemyManager extends MovieClip
{

    private var hManager:HittingManager = new HittingManager();
    private var timer:Timer = new Timer(2000);
    public static var hitting:Boolean = false;
    public static var enemy:Enemy;

    public function EnemyManager()
    {           
        addEventListener(Event.ADDED_TO_STAGE, added);          
    }
    public function addEnemy(newEnemy:Enemy):void
    {
        addChild(newEnemy);
        hManager.registerEnemy(newEnemy);
    }

    private function added(event:Event):void
    {
        addEventListener(Event.ENTER_FRAME, update);
        trace("added enemy manger");
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        timer.start();
    }
    private function onTimer(event:TimerEvent):void
    {           
         enemy = new Enemy();            

         this.addEnemy(enemy);
    }
    private function update(event:Event):void
    {

    }

    }

}

そして、ここで Hittest.as クラス(私は多くのテクニックを試しましたが、すべて無駄でした)なので、ステートメントが空の場合は去ります

package 
{
import flash.display.MovieClip;
import flash.events.Event;

public class HittingManager extends MovieClip
{
    private var eManager:EnemyManager;

    private var hEnemy:Enemy = new Enemy();
    private var _enemies:Array;
    private var _hero:Hero;
    public function HittingManager()
    {
        //trace("Hitting Manager working");
        _enemies = [];
        addEventListener(Event.ADDED_TO_STAGE, added);
    }
    public  function registerEnemy(newEnemy:Enemy):void
    {   
        _enemies.push(newEnemy);

    }
    public  function registerHero():void
    {
        //trace("heroRegisterd");
        _hero = HeroManager.hero;
        addChild(_hero);


    }

    private  function added(event:Event):void
    {
        if(!_hero)
        {
            this.registerHero();
        }
        trace("Hitting manger added");
        addEventListener(Event.ENTER_FRAME, update);
    }

    private function update(event:Event):void
    {


        if(_hero)
        {           
            for each( newEnemy:Enemy in _enemies)
            {
                if(_hero.hitTestObject(newEnemy) )
                {
                    trace("Hitting")
                }
            }
        }

    }
    }//class

}//package
4

1 に答える 1

0

以下のリビジョンでは、できるだけ少ない変更でコードが機能するようになりますが、決して理想的なソリューションではありません。敵のマネージャーが HittingManager への public static 参照を必要としないように、おそらくコードをリファクタリングする必要があります。

package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class HeroManager extends MovieClip
    {
        public static var hero:Hero = new Hero();

        public function HeroManager()
        {
            addEventListener(Event.ADDED_TO_STAGE, added);
        }

        private function added(event:Event):void
        {
            trace("hero manager added");

        }

    } //class

} //package

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.sampler.Sample;
    import flash.display.Sprite;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.sampler.NewObjectSample;

    public class EnemyManager extends MovieClip
    {

        public static var hManager:HittingManager;
        private var timer:Timer = new Timer(2000);
        public static var hitting:Boolean = false;
        public static var enemy:Enemy;

        public function EnemyManager()
        {
            addEventListener(Event.ADDED_TO_STAGE, added);
        }

        public function addEnemy(newEnemy:Enemy):void
        {
            addChild(newEnemy);
            hManager.registerEnemy(newEnemy);
        }

        private function added(event:Event):void
        {
            addEventListener(Event.ENTER_FRAME, update);
            trace("added enemy manger");
            timer.addEventListener(TimerEvent.TIMER, onTimer);
            timer.start();
        }

        private function onTimer(event:TimerEvent):void
        {
            enemy = new Enemy();

            this.addEnemy(enemy);
        }

        private function update(event:Event):void
        {

        }

    }

}


package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class HittingManager extends MovieClip
    {
        private var _enemies:Array;
        private var _hero:Hero;

        public function HittingManager()
        {
            //trace("Hitting Manager working");
            _enemies = [];
            addEventListener(Event.ADDED_TO_STAGE, added);
        }

        public function registerEnemy(newEnemy:Enemy):void
        {
            _enemies.push(newEnemy);

        }

        public function registerHero():void
        {
            //trace("heroRegisterd");
            _hero = HeroManager.hero;
            addChild(_hero);

        }

        private function added(event:Event):void
        {
            if (!_hero)
            {
                this.registerHero();
            }
            trace("Hitting manger added");
            addEventListener(Event.ENTER_FRAME, update);
        }

        private function update(event:Event):void
        {

            if (_hero)
            {
                for each (var newEnemy:Enemy in _enemies)
                {
                    if (_hero.hitTestObject(newEnemy))
                    {
                        trace("Hitting")
                    }
                }
            }

        }
    } //class

} //package

メイン ドキュメント クラスには、次のようなものが必要です。

var hittingManager:HittingManager =  new HittingManager();
EnemyManager.hManager = hittingManager;

var enemyManager:EnemyManager = new EnemyManager();
var heroManager:HeroManager = new HeroManager();

addChild(heroManager);
addChild(enemyManager);
addChild(hittingManager);
于 2013-10-25T17:36:51.180 に答える