当前位置: 首页 > 知识库问答 >
问题:

如何在actionscript3中检查对象与类之间,或类与另一个类之间的命中测试?

周辉
2023-03-14

这一切都在actionscript 3.0中,并且是flash cs5中的代码。5.我在做一个推拉游戏,玩家推一个方块。级别最终将非常大,每个类都有许多实例,因此在舞台上用实例名称命名每个符号是不切实际的。我有这个引擎。正如我写的文件,但我不明白为什么它不起作用。这是整个类,但我试图使用的是hitTestClass函数;包裹{

import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;

public class Engine extends MovieClip
{
    private static var _instance:MovieClip;

    public function Engine()
    {
        stop();
        _instance = this;
    }

    public static function add(object:Object):void
    {
        if (object!=DisplayObject) return;
        _instance.addChild(object as DisplayObject);
    }

    public static function remove(object:Object):void
    {
        if (object is Array) {
            removeList(object as Array);
            return;
        }
        if (!(object is DisplayObject) || object.parent!=_instance) return;
        _instance.removeChild(object as DisplayObject);
    }

    public static function removeList(objects:Array):void
    {
        while (objects.length>0) remove(objects.pop());
        //trace(objects.length);

    }

    public static function getByName(name:String):Object {
        if (_instance) {
            for (var i:int = 0; i < _instance.numChildren; i++) 
            {
                if (_instance.getChildAt(i).name==name) {
                    return _instance.getChildAt(i);
                }
            }
        }
        return null;
    }

    public static function getAllByName(name:String):Array {
        var list:Array = new Array();
        if (_instance) {
            for (var i:int = 0; i < _instance.numChildren; i++) 
            {
                if (_instance.getChildAt(i).name==name) {
                    list.push(_instance.getChildAt(i));
                }
            }
        }
        return list;
    }

    public static function getByClass(className:Class):Object {
        if (_instance) {
            for (var i:int = 0; i < _instance.numChildren; i++) 
            {
                if (_instance.getChildAt(i) is className) {
                    return _instance.getChildAt(i);
                }
            }
        }
        return null;
    }

    public static function getAllByClass(className:Class):Array {
        var list:Array = new Array();
        if (_instance) {
            for (var i:int = 0; i < _instance.numChildren; i++) 
            {
                if (_instance.getChildAt(i) is className) {
                    list.push(_instance.getChildAt(i));
                }
            }
        }
        return list;
    }

    public static function hitTestName(object:DisplayObject, name:String):Object
    {
        var list:Array = getAllByName(name);
        return hitTestList(object, list);
    }

    public static function hitTestClass(object:DisplayObject, className:Class):Object
    {
        var list:Array = getAllByClass(className);
        return hitTestList(object, list);
    }

    public static function hitTestList(object:DisplayObject, list:Array):Object
    {
        var hits:Array = new Array();
        for (var i:int=0; i<list.length; i++) {
            if (object != list[i] && object.hitTestObject(list[i])) {
                hits.push(list[i]);
            }
        }
        return hits;
    }       

}

}

在整个游戏中,我使用每个“块”类中的更新函数,这里是它们检查命中测试的地方。下面是wallBlock类中的一个示例,它确保字符不能穿过wallBlock。函数能够检查代码(){

        if ((this).x-_root.mcChar.x<63.5 && (this).x-_root.mcChar.x>-63.5)
        {
            //trace("booty");
            //ableToCheckXSides=false;
            if((this).y-_root.mcChar.y >=-63 && (this).y-_root.mcChar.y<0 && ableToCheckXSides==false)
                   {
                    //ableToCheckXSides=false;   
                    //_root.mcChar.x=_root.mcChar.x;

                    if(hitTestObject(_root.mcChar)==true)
                        {
                            _root.mcChar.y=(this).y+63.5;

                        }



                     //if char is moving down and hits the top side of tile

                   }
                 else if((this).y-_root.mcChar.y<=63 && (this).y-_root.mcChar.y>0 && ableToCheckXSides==false)
                   {
                    //ableToCheckXSides=false;
                    //_root.mcChar.x=_root.mcChar.x;
                    if(hitTestObject(_root.mcChar)==true)
                        {
                            _root.mcChar.y=(this).y-63.5;

                        }



                     //if char is moving up and hits the bottom side of tile

                   }

        }


        if ((this).y-_root.mcChar.y<63.5 && (this).y-_root.mcChar.y>-63.5)
        {
            //trace("YYYYYY");

            ableToCheckXSides=true;
            if((this).x-_root.mcChar.x >=-63 && (this).x-_root.mcChar.x<0)
                   {
                    //trace("inside function");
                    //ableToCheckYSides=false;
                    if(hitTestObject(_root.mcChar)==true)
                        {
                            _root.mcChar.x=(this).x+63.5;
                        }


                     //if char is moving left and hits the right side of tile

                   }
                   else if((this).x-_root.mcChar.x<=63 && (this).x-_root.mcChar.x>0)
                   {
                    //ableToCheckYSides=false;
                    if(hitTestObject(_root.mcChar)==true)
                        {
                            _root.mcChar.x=(this).x-63.5;

                        }


                     //if char is moving right and hits the left side of tile   
                   }
        }
        else 
        {
            ableToCheckXSides=false;
        }

这就是问题所在,在每一帧都会出现的“更新”函数中,我尝试使用hitTestClass函数查看板条箱块是否碰到墙板,但它永远不会返回真值。如果我改变如果(hits.length)

var hits = Engine.hitTestClass(this, crateBlock);
        if (hits.length>0) 
        {
            Engine.remove(hits);
            trace("hitting crate");
        }

共有1个答案

王才英
2023-03-14

你不应该使用HitTestObject,你应该使用CollisionTestKit,这是一个可以在Google code上找到的库:

https://code.google.com/p/collisiondetectionkit/

HitTestObject本身工作不太好。这个库可以让你做更复杂的事情。

 类似资料:
  • 问题内容: 我正在玩Java的反射API,并尝试处理一些字段。现在,我要确定字段的类型。字符串很简单,只需执行即可。其他非派生类也是如此。但是,如何检查派生类?例如作为的子类。我无法找到任何或方法。我是否需要遍历所有人并自己找到超人? 问题答案: 您需要此方法: 一般情况下,(以上)应替换为并应替换为 从JavaDoc: 确定此对象表示的类或接口是否与指定参数表示的类或接口相同或超类或超接口。如果

  • 本文向大家介绍测试与检查之间的区别,包括了测试与检查之间的区别的使用技巧和注意事项,需要的朋友参考一下 通常,我们可以说“测试”和“检查”都用于评估产品,以判断产品是否符合要求,是否表现出预期。这两个过程都在产品交付之前执行,以确保交付正确和真实的产品。 现在两者的处理基础之间可能存在一些重要差异,如下所示。 以下是“测试”和“检查”之间的重要区别。 序号 键 测验 检查 1 定义 测试可以定义为

  • 问题内容: 我是Kotlin的新手,最近将一个简单文件从Java转换为Kotlin。我想知道为什么Android转换器将我的java类更改为Kotlin对象。 Java: 转换的Kotlin: 为什么不呢? 任何帮助将不胜感激谢谢。 问题答案: Kotlin对象就像一个无法实例化的类,因此必须按名称进行调用。(本身是静态类) android转换器看到您的类仅包含静态方法,因此将其转换为Kotlin

  • 本文向大家介绍简单谈谈Java类与类之间的关系,包括了简单谈谈Java类与类之间的关系的使用技巧和注意事项,需要的朋友参考一下 类与类之间最常见的关系主要有三种:依赖(uses-a)、聚合(has-a)和继承(is-a)。 下面以在线书店订单系统为例,来详细的讲述这三种关系的概念。 在线书店订单系统的主要功能是:注册用户可以登录到网上书店选购图书,在线填写订单,并支付购书款。书店确认已经收到购书款

  • 当子类继承超类时,子类与超类中定义的具有不同可访问性的字段之间是什么关系,哪个字段属于子类,哪个字段不属于子类。谁能解释一下下面的例子: 当我在Eclipse中调试它时,我观察了堆栈中的变量Child,我发现子实例有四个字段,两个由它的类定义,两个由它的父类定义,我非常困惑.当我创建子实例IMP时是否创建了父实例,我认为它只进入父类的构造函数,但我不能解释为什么子类不重写这两个字段,或者至少,我认

  • 我似乎对一个简单的时间跟踪器有一个问题。它的设置方式是用户可以跟踪与项目相关的命中时间或自由输入某些内容。这意味着时间表对象总是有一个用户,但并不总是有一个项目。当我在连接到用户的数据库中创建一个时间表对象,但然后将一个与用户没有关联的项目连接到同一个时间跟踪对象时,可能会出现不一致。 解决这个问题的最佳方法是什么。我听说过定向联想,但我不知道它是如何解决问题的