【问题标题】:hitTestObject in a saprate classhotTest 对象在一个单独的类中
【发布时间】:2013-10-25 17:13:17
【问题描述】:

我正在制作一个简单的游戏。这是我面临的问题,但首先我会告诉你我的班级结构。 (我使用的是 flash cs5.5)

Enemy.as :这个类与一个MovieClip(在库中)链接,具有简单的敌人移动和方向的代码。

Hero.as :与库中的影片剪辑链接。英雄简单动作代码

EnemyManager.as :每 20 秒创造一个新敌人。

HeroManager.as :创建英雄(仅一次,其他功能稍后添加)。

HittingManager.as:检查合谋(这里有问题

现在我的问题在HittingManager.as 类中,因为我想在这个类中添加 HitTestObject 功能。我将发布 3 个重要课程的代码。 (EnemyManager.asHeroManager.asHittingManager.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

【问题讨论】:

    标签: actionscript-3 actionscript hittest


    【解决方案1】:

    下面的修订使您的代码可以使用尽可能少的更改,但它绝不是理想的解决方案。 您可能应该重构您的代码,以便敌人管理器不需要对 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
    

    在你的主文档类中,你应该有类似的东西:

    var hittingManager:HittingManager =  new HittingManager();
    EnemyManager.hManager = hittingManager;
    
    var enemyManager:EnemyManager = new EnemyManager();
    var heroManager:HeroManager = new HeroManager();
    
    addChild(heroManager);
    addChild(enemyManager);
    addChild(hittingManager);
    

    【讨论】:

    • 请解释一下'for each(varenemy:Enemy in _enemies)' 我对 'each' 和 'in' 关键字有点陌生。谢谢,
    • 请解释一下'对于每个(var 敌人:_enemies 中的敌人)我有点不熟悉 'each' 和 'in' 关键字。谢谢,
    • 也告诉我应该在哪里访问 registerEnemy/registerHero 函数
    • 对于延迟回复,我深表歉意,我整个周末都不在电脑旁。我希望澄清有所帮助。
    • 朋友,我还有疑惑,你能回答吗?所以我解释了我的问题。
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2018-04-09
    • 2015-11-17
    • 2018-07-10
    • 2012-04-08
    • 2016-01-16
    相关资源
    最近更新 更多