Pregunta

i am making a simple game. here is the problem i am facing, but first i will tell you my class structure. (i am using flash cs5.5)

Enemy.as : this class is linked with a MovieClip(in library), having code of simple enemy movment and directions.

Hero.as : Linked with a MovieClip in library. Code of Hero simple Movment

EnemyManager.as : Creates new enemy Every 20 Second.

HeroManager.as : Creates Hero(Only Once, other functionality will be added later).

HittingManager.as : checks for collusions(Problem Here)

Now My Problem is in HittingManager.as class because i want to add HitTestObject Functionalty in this class. i will post code of 3 important classes. (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

Here is the code of EnemyManager.as class

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
    {

    }

    }

}

And here Hittest.as class (i have tried many techniqes but all in vain ) so i am leaving if statment empty

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
¿Fue útil?

Solución

The revision below gets your code working with as few changes as possible, however it is in no way an ideal solution. You should probably refactor your code so that the enemy manager doesn't need a public static reference to the HittingManager

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

In your main document class, you should have something like:

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

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

addChild(heroManager);
addChild(enemyManager);
addChild(hittingManager);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top