首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3 - hitTestObject冲突未正确注册

AS3 - hitTestObject冲突未正确注册
EN

Stack Overflow用户
提问于 2011-08-08 06:27:47
回答 2查看 3.7K关注 0票数 1

几天前我的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行业余代码,让你去挖掘-though,如果需要的话,我会的。

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

我希望这个令人费解的描述足够容易理解。感谢您的关注。

我想我知道发生了什么,但我不知道如何纠正它。我使用ObjectPlacer类来放置建筑物、植物、动物等,并且我相信当我调用- var targetCowboy:Cowboy = new Cowboy(stageRef); var enemyJoe:EnemyJoe = new EnemyJoe(stageRef, targetCowboy); var Buildings03Left:BuildingsLeft03 = new BuildingsLeft03(stage, 0, -720, targetCowboy, enemyJoe);

代码语言:javascript
复制
         `stageRef.addChildAt((Buildings03Left), 2);             build01Place = false;` 

这实际上是创建了牛仔和EnemyJoe的多个实例,这就是令人困惑的flash。如何在不使用“EnemyJoe”的情况下引用牛仔和新牛仔?(例如,var target牛仔:牛仔=新牛仔(StageRef);)

ObjectPlacer代码:

代码语言:javascript
复制
    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, 0, true);
    Build02Timer.addEventListener(TimerEvent.TIMER, build02TimerHandler, false, 0, true);
    CactiSet01Timer.addEventListener(TimerEvent.TIMER, cactiSet01TimerHandler, false, 0, true);

        addEventListener(Event.ENTER_FRAME, loop, false, 0, 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, 0, -720, targetCowboy, enemyJoe);              
        stageRef.addChildAt((Buildings03Left), 2);
        build01Place = false;


        }

    }

    private function BuildSet02(): void
    {

        if (build02Place)
        {

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

    private function CactiSet01(): void
    {
        if (cactiSet01Place)
        {
            var cactus01:GScactus01 = new GScactus01(stage, 0, 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); 
    }   

}

}

EN

回答 2

Stack Overflow用户

发布于 2011-08-08 07:40:42

要小心的一件事是,hitTestObject执行AABB (axis-aligned bounding box) collision,这意味着它在对象周围拟合一个矩形,并使用该矩形来测试碰撞。你的建筑看起来有复杂的凹面形状-- hitTestObject不会考虑这些,它只是在建筑上画一个巨大的矩形,并用它来测试。还要注意的是,如果collide是一个包含所有建筑区域的单个MovieClip,那么矩形将覆盖整个区域,而不是为各个建筑单独分配区域。你必须将你的碰撞区域分割成不同的矩形,然后分别对它们进行测试。这可能是您看到一些误报和不良行为的原因。

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-08 15:17:57

我早就放弃了用于碰撞检测的内置闪存函数,转而使用我自己的系统,它使用AABB的分离轴定理,或者使用像Box2D这样的东西来为我处理物理问题。

我从来没有成功使用过hitTestPoint或hitTestObject,但您可能会发现bitmapData.hitTest可以为您工作(从未使用过它),或者您可以使用基于矩形的网格系统,这就是我所做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6976222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档