加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – AS3 – hitTestObject碰撞未正确注册

发布时间:2020-12-15 07:33:23 所属栏目:百科 来源:网络整理
导读:几天前我遇到了hitTestObject碰撞检测问题,这个问题已经在你们的帮助下修复了( How can I solve my hitTestObject Collision Null Object Ref Error)(谢谢). 我现在的问题是这样的: 当我的“enemy.hit”与“player.hit”接触时,它会记录为热门 – 这很好.
几天前我遇到了hitTestObject碰撞检测问题,这个问题已经在你们的帮助下修复了( How can I solve my hitTestObject Collision Null Object Ref Error)(谢谢).

我现在的问题是这样的:

当我的“enemy.hit”与“player.hit”接触时,它会记录为热门 – 这很好.

当我的“building.collide”与“player.hit”接触时,它会注册为热门 – 这很好.

然而,当我的“building.collide”与我的“enemy.hit”接触时,它没有注册,但有时它会注册,即使屏幕上唯一的敌人离它很多像素 – 就像建筑物或敌人“hitBox”不是直接在图形上的某个地方(在这种情况下是MovieClip).

我不明白这是怎么回事.
我的敌人类有一个hit.hitTestObject(player.hit)可以正常工作.
我的构建类有一个collide.hitTestObject(player.hit)也可以正常工作.
因此,它应该推断我的构建类collide.hitTestObject(enemy.hit)也应该正常工作 – 但事实并非如此.
有任何想法吗?

我的代码由10个左右的.as文件组成.我不完全确定这些是导致问题的原因.我不想粗鲁,并发布了1000行我的业余代码供您挖掘 – 尽管如此,我会在需要的时候.

绿色部分是hitBoxes(这是特定MovieClip中的一个层)

我希望这个复杂的描述很容易理解.
谢谢你的期待.

我想我知道发生了什么,但我不知道如何纠正它.
我使用ObjectPlacer类来放置建筑物,植物群,动物群等,我相信当我打电话时 –
var targetCowboy:Cowboy = new Cowboy(stageRef);
var enemyJoe:EnemyJoe = new EnemyJoe(stageRef,targetCowboy);
var Buildings03Left:BuildingsLeft03 = new BuildingsLeft03(stage,-720,targetCowboy,enemyJoe);
????????????stageRef.addChildAt((Buildings03Left),2);
????????????build01Place = false;

这实际上创建了Cowboy和EnemyJoe的多个实例,这就是令人困惑的闪存.如何在不使用“new”的情况下引用Cowboy和EnemyJoe?(例如var targetCowboy:Cowboy = new Cowboy(stageRef);)

ObjectPlacer代码:

package com.gamecherry.gunslinger
    {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;

public class  ObjectPlacer extends MovieClip
{

    private var Build01Timer:Timer;
    private var Build02Timer:Timer;
    private var CactiSet01Timer:Timer;

    private var build01Place:Boolean = false;// if true - addChild starts at first frame
    private var build02Place:Boolean = false;
    private var cactiSet01Place:Boolean = false;
    private var stageRef:Stage;


    public function ObjectPlacer(stageRef:Stage)
    {
        this.stageRef = stageRef;


    var Build01Timer = new Timer(1000,1);
    var Build02Timer = new Timer(25000,1);
    var CactiSet01Timer = new Timer(0,1);


    Build01Timer.addEventListener(TimerEvent.TIMER,build01TimerHandler,false,true);
    Build02Timer.addEventListener(TimerEvent.TIMER,build02TimerHandler,true);
    CactiSet01Timer.addEventListener(TimerEvent.TIMER,cactiSet01TimerHandler,true);

        addEventListener(Event.ENTER_FRAME,loop,true);

        Build01Timer.start();
        Build02Timer.start();
        CactiSet01Timer.start();
    }


    public function loop(e:Event): void
    {
        BuildSet01();
        BuildSet02();
        CactiSet01();

    }   

    private function BuildSet01(): void
    {

        if (build01Place)
        {
        var Buildings01Right:BuildingsLeft = new BuildingsLeft(stage,720,-624);   
        Buildings01Right.scaleX = -1;
        stageRef.addChildAt((Buildings01Right),2);

        var targetCowboy:Cowboy = new Cowboy(stageRef);
        var enemyJoe:EnemyJoe = new EnemyJoe(stageRef,targetCowboy);
        var Buildings03Left:BuildingsLeft03 = new BuildingsLeft03(stage,enemyJoe);              
        stageRef.addChildAt((Buildings03Left),2);
        build01Place = false;


        }

    }

    private function BuildSet02(): void
    {

        if (build02Place)
        {

        var Buildings04Left:BuildingsLeft04 = new BuildingsLeft04(stage,-800);
        stageRef.addChildAt((Buildings04Left),2);
        build02Place = false;
        }
    }

    private function CactiSet01(): void
    {
        if (cactiSet01Place)
        {
            var cactus01:GScactus01 = new GScactus01(stage,300);
            stageRef.addChildAt((cactus01),2);
            var cactus01b:GScactus01 = new GScactus01(stage,190,50);
            stageRef.addChildAt((cactus01b),2);
            var cactus01c:GScactus01 = new GScactus01(stage,660,-40);
            stageRef.addChildAt((cactus01c),2);
            cactus01c.scaleX = -1;
            var cactus01d:GScactus01 = new GScactus01(stage,710,340);
            stageRef.addChildAt((cactus01d),2);
            cactus01d.scaleX = -1;
            var cactus02:GScactus02 = new GScactus02(stage,420,-50);
            stageRef.addChildAt((cactus02),2);
            var cactus02b:GScactus02 = new GScactus02(stage,600,180);
            stageRef.addChildAt((cactus02b),2);
            var cactus02c:GScactus02 = new GScactus02(stage,300,240);
            stageRef.addChildAt((cactus02c),2);
            var cactus03:GScactus03 = new GScactus03(stage,540,100);
            stageRef.addChildAt((cactus03),2);
            var cactus03b:GScactus03 = new GScactus03(stage,30,5);
            stageRef.addChildAt((cactus03b),2);
            cactus03b.scaleX = -1;
            var cactus03c:GScactus03 = new GScactus03(stage,520,420);
            stageRef.addChildAt((cactus03c),2);

            cactiSet01Place = false;
        }
    }



    private function build01TimerHandler(e: TimerEvent) : void
    {
        build01Place = true;
    }
    private function build02TimerHandler(e: TimerEvent) : void
    {
        build02Place = true;
    }


    private function cactiSet01TimerHandler(e: TimerEvent) : void
    {
        cactiSet01Place = true;
    }











    private function removeSelf() : void
    {
        removeEventListener(Event.ENTER_FRAME,loop);

        if (stageRef.contains(this))
        stageRef.removeChild(this); 
    }   

}

}

解决方法

需要注意的一件事是hitTestObject执行 AABB (axis-aligned bounding box) collision,这意味着它适合您对象周围的矩形,并使用它来测试碰撞.你的建筑似乎有复杂的凹形 – hitTestObject不会考虑这些,它只是在建筑物上方放置一个巨大的矩形并用它进行测试.另请注意,如果碰撞是一个包含其中所有建筑区域的单个MovieClip,则矩形将包裹在整个区域上,而不是为各个建筑物分别设置区域.您必须将碰撞区域分成单独的矩形并单独测试它们.这可能是您看到一些误报和不良行为的原因.

当shapeFlag参数设置为true时,hitTestPoint将考虑对象的形状并进行像素完美碰撞,但这只会测试单个点.要测试更大的形状,您可以尝试迭代地执行多个hitTestPoint调用.如果这还不够,请研究更复杂的碰撞方法.查看来自N的创作者的this set of tutorials.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读