【问题标题】:Action Script 3.0 HitTestObject Not Working?动作脚本 3.0 HitTestObject 不工作?
【发布时间】:2015-02-03 17:37:10
【问题描述】:

帮帮我..我正在为我的学校项目制作 rpg,NPC01 类中的代码 hitTestObject 不起作用。

这是我的代码:

Game.as

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

    public class Game extends MovieClip{
       var map:Map = new Map();
       var player:Player = new Player();
       var npc:NPC = new NPC();

       public function Game(){
         addChild(map);
         addChild(npc);
         addChild(player);
         this.addEventListener(Event.ENTER_FRAME,loop);
       }
       private function loop():void {
         npc.x = map.x;
         npc.y = map.y;
       }
     }
   }

NPC.as

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

      public class NPC extends MovieClip {

        var npc01:NPC01 = new NPC01();

        public function NPC() {
            // constructor code

            addChild(npc01);            

            npc01.x = 20;
            npc01.y = 0;
        }
    }
}

NPC01.as

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

    public class NPC01 extends MovieClip {      

        var player:Player = new  Player();

        public function NPC01() {
            // constructor code
            this.addEventListener(Event.ENTER_FRAME, loop);
        }
        private function loop(e:Event):void
        {
            if(player.hitTestObject(npc)) {  //npc is a movieclip  inside NPC01
              trace("HIT!!");   
              }
        }

我没有收到错误消息。只是,每当播放器影片剪辑点击 npc 影片剪辑时,输出就不会出现..

我也尝试使用以下方法追踪他们的位置:

trace( player.getBounds(stage) );
trace( npc.getBounds(stage) );

结果:

(x=343, y=218, w=26, h=45)
(x=334, y=218, w=32, h=51)

他们似乎正在碰撞。

但是当我在函数循环下的 Game.as 中编写 hitTestObject 代码时,当玩家点击 npc 时,跟踪输出显示出来。

我可以随意移动角色“玩家”。

对不起,我的英语不好。

我也在 NPC01.as 中尝试了这些循环功能:

if (npc.hitTestObject(player)) {
  trace("Hit01");
}
if (npc.hitTestObject(player)) {
    trace("Hit02");
}
if (npc.hitTestPoint(player.x, player.y, true)) {
    trace("Hit03");
}
if (player.hitTestPoint(npc.x, npc.y, true)) {
    trace("Hit04");
} 

但只有“Hit03”在响应..

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    问题是您创建了两个不同的播放器对象,而您只需要一个

    这应该更适合您的目的:

    package {
    import flash.display.MovieClip;
    import flash.events.Event;
    
    public class Game extends MovieClip{
       var map:Map = new Map();
       var player:Player = new Player();
       var npc:NPC = new NPC(player);
    
       public function Game(){
         addChild(map);
         addChild(npc);
         addChild(player);
         this.addEventListener(Event.ENTER_FRAME,loop);
       }
       private function loop():void {
         npc.x = map.x;
         npc.y = map.y;
       }
     }
    

    }

    package  {
      import flash.display.MovieClip;
      import flash.events.Event;
    
      public class NPC extends MovieClip {
    
        var player:Player;
        var npc01:NPC01;
    
        public function NPC(player:Player) {
            // constructor code
            this.player = player;
            npc01 = new NPC01(player);
            addChild(npc01);            
    
            npc01.x = 20;
            npc01.y = 0;
        }
    }
    

    }

    package  {
    import flash.display.MovieClip;
    import flash.events.Event;
    
    public class NPC01 extends MovieClip {      
    
        var player:Player;
    
        public function NPC01(player:Player) {
            // constructor code
            this.player = player;
            this.addEventListener(Event.ENTER_FRAME, loop);
        }
        private function loop(e:Event):void
        {
            if(player.hitTestObject(npc)) {  //npc is a movieclip  inside NPC01
              trace("HIT!!");   
              }
        }
    

    【讨论】:

    • 您好,先生。但是如果我需要检查另一层的碰撞呢?比方说,我在 Game.as 中添加了一个孩子,我也要从 Npc01.as 中测试那个孩子?
    • 嗯,这是您设计的主要问题,正如 HankScorpio 已经指出的那样。检查 hitTestObject “应该”在你的 Player 和你的 NPC 类之外完成。否则,您需要将所有可能的玩家的引用菊花链到所有可能的 NPC,反之亦然。
    • 啊,再次感谢您。我想我需要更改我的代码,有什么建议吗?
    【解决方案2】:

    这是您拥有的 DisplayObject:

    • (游戏):游戏
      • 地图:地图
      • 玩家:玩家
      • NPC:NPC
        • npc01:NPC01
          • 玩家:玩家
          • npc:电影剪辑

    请注意,您已经创建了两个玩家(一个在游戏中,一个在 NPC01 中)。你确定你测试的是正确的吗?

    我猜你可能只想要一个。试试这个。

    package {
    import flash.display.MovieClip;
    import flash.events.Event;
    
    public class Game extends MovieClip{
        var map:Map = new Map();
        var player:Player = new Player();
        var npc:NPC = new NPC();
    
    public function Game(){
        addChild(map);
        addChild(npc);
        addChild(player);
        this.addEventListener(Event.ENTER_FRAME,loop);
    }
    private function loop():void {
        npc.x = map.x;
        npc.y = map.y;
    
        if(player.hitTestObject(npc)) {
            trace("HIT!!");   
        }
    }
    

    }

    然后从 NPC01 中移除玩家:

    package {
    import flash.display.MovieClip;
    import flash.events.Event;
    
    public class NPC01 extends MovieClip {    
        public function NPC01() {
        }
    }
    

    【讨论】:

    • 感谢您的回复.. 我已经尝试过了,它可以工作,但我需要在 NPC01 中使用 hittestobject 函数,因为我会在 npc 移动时使用它来检测玩家和物体的碰撞。 . 是的,我在 npc 中创建了播放器来检查 hitTestObject 并且没有显示错误。
    • NPC 根本不需要任何对 Player 的引用。每个 NPC/Player 等都应该是自主的,并且能够自行查看和测试等(因为这是人类所做的),这感觉很直观,但是随着代码的增长,这种方法更难以维护。创建一个类来管理每个玩家和 NPC。您可能希望将对它们中的每一个的引用存储在该新类中的数组(或 Vector,以获得更好的性能)中。然后,在每个 ENTER_FRAME 事件中,调用管理器上的一个方法,该方法循环遍历所有 NPC 并将它们与 Player 进行命中测试。
    猜你喜欢
    • 2015-06-19
    • 2012-11-30
    • 2013-06-22
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多