我最近在编程时遇到了死胡同,我终于实现了所有破坏的代码,因为我不知道如何与另一个类的实例进行交互。以下是我要做的事情的要点:
if(this.hitTestObject(targetClip)){
trace("hit!");
}
问题是,如果我解决画布上的单个实例,我会“访问未定义的属性targetClip”,即使文档类可以很好地与它交互。如果我定位targetClip的类文件,我会得到“类型Class的值的隐式强制到不相关的类型flash.display:DisplayObject”。这也不仅仅是hitTest的一个问题,我对其他动作有这个问题,所以有一些我无法理解的基本语法。请告诉我我缺少的东西。
答案 0 :(得分:1)
我不是100%的问题,但我会假设您要求的是在“ClassB”的所有实例上从“ClassA”的任何一个实例调用hitTestObject的方法吗?所以像Bullet对象检查它是否击中任何Player对象。
如果确实是这个问题,那么所有类的实例(我都知道)都没有“全局列表”。但是,这并不能阻止您通过使用类实例的静态向量来自己完成。请注意,因为这需要比正常情况更多的清理代码。以下是使用项目符号和玩家的简单示例。
class Bullet extends Sprite //or w/e it is your objects extend
{
public Bullet()
{
}
public function checkCollisionsWithPlayers() : void
{
for(var i : int = 0; i < Player.AllPlayers.length; ++i)
{
var player : Player = Player.AllPlayers[i];
if(this.hitTestObject(player))
{
trace("hit!");
}
}
}
}
class Player extends Sprite
{
static public const AllPlayers : Vector.<Player> = new Vector.<Player>();
public Player()
{
AllPlayers.push(this);
}
//remove unused Players from the AllPlayers list
public function free() : void
{
var index : int = AllPlayers.indexOf(this);
if(index >= 0)
{
AllPlayers.splice(index, 1);
}
}
}
这允许您拥有所有已创建的玩家的列表。在子弹的任何实例上调用checkCollisionsWithPlayers函数将检查所有当前实例化的Player对象的命中。
但是,如果你不再使用free()函数来调用free()函数,那么这会造成内存泄漏(因为Vector会在不允许垃圾收集器的实例上保留引用)清理记忆,更不用说它可能会给死去的玩家带来虚假命中)。如果你使用像这样的模式来正确清理列表,请小心,因为它很容易出错。
答案 1 :(得分:0)
你需要记住,不同的课程彼此之间并不了解。要从另一个类(B类)访问变量(例如,在A类中),您需要在B类中创建一个'getter'方法:
getVariable(){return variable;}
并从A类调用该方法,静态(B.getVariable())或动态(B bbb = new B(); bbb.getVariable();)
接近明确指示的类,以便访问其他类中保存的信息