2012-01-03 100 views
0

这个让我疯狂了几个小时。我尝试调用kill();(函数takeDamage()),该函数在同一个类中,但它不会找到它。AS3 - 错误#1180:调用可能未定义的方法kill。

package classes.ship 
{ 
imports ... 

public class Ship extends MovieClip 
{ 
    var speed:Number; 
    var shootLimiter:Number; 
    public static var health:Number; 
    public static var maxHealth:Number; 

    public function initialize() 
    { 
     var stageReff:Stage = this.stage as Stage; 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, reportKeyUp); 
     stage.addEventListener("enterFrame", move); 
    } 

    //code 

    public static function takeDamage(d):void 
    { 
     health -= d; 

     if(health <= 0) 
     { 
      health = 0; 
      kill(); 
     } 

     Main.healthMeter.bar.scaleX = health/maxHealth; 
    } 

    public function kill():void 
    { 
     var boom = new Explosion(); 
     stage.addChild(boom); 
     boom.x = this.x; 
     boom.y = this.y; 
     this.visible = false; 
     //Main.gameOver(); 
    } 

    //code 
} 
} 

var stageReff:Stage = this.stage as Stage;

在此先感谢。

回答

2

kill()是一个实例方法,但takeDamage是一个静态类方法。您不能从静态类方法调用实例方法。当你有一个实例引用来调用它时,你只能调用实例方法。

+0

我现在觉得很愚蠢,但我该如何做一个方法的实例?这可能很容易,但我找不到它。 – 2012-01-03 21:38:52

+1

@RobbeVanWinckel你不能创建一个方法的实例。问题是takeDamage()是属于类Ship的一种方法(不是Ship类型的对象)。从其他代码判断,你可能只想从takeDamage()和health变量中删除“static”关键字 - 它们似乎属于一个玩家(实例)。 – weltraumpirat 2012-01-03 21:45:08

+0

@weltraumpirat问题是我在另一个类中使用该方法,如果我删除单词static,则会给出错误#1119:通过静态类型Class的引用访问可能未定义的属性maxHealth。那我该如何解决呢? – 2012-01-03 21:54:10

0

不错,简单的一个在今年年初!

您已将函数'takeDamage'声明为静态方法 - 这意味着它不属于类Ship的特定实例,而是它属于类本身。静态方法和属性可以是一个有点混乱,如果你是新的面向对象,而是通过一个简单的例子是很容易解释:

类成员属性

在这个例子中,我们声明一个新的类定义为船舶我们可以通过setSpeed()来定义船舶实例的速度。

public class Ship { 
    private var speed : Number; 

    public function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

现在我们将创建一对夫妇的船只,并设置其速度:

var scoutShip : Ship = new Ship(); 
scoutShip.setSpeed(500); // Scout's are fast! 

var cargoShip : Ship = new Ship(); 
cargoShip.setSpeed(10); // Cargo ships are sloooow. 

trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 500 
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10 

正如你可以从上面看到,船舶,我们创建的每个实例可以拥有自己的速度 - 这是面向对象编程的基础(船舶是对象,速度就是数据)。

静态属性

现在,我们将创建另一个类,这段时间称为StaticShip它采用了静态的属性,而不是,请注意使用静态关键字:

public class StaticShip { 
    private static var speed : Number; 

    public function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

因为速度属性是静态的,它在StaticShip的所有实例中共享;例如:

var scoutShip : StaticShip = new StaticShip(); 
scoutShip.setSpeed(500); // So the scout should move at 500 

var cargoShip : StaticShip = new StaticShip(); 
cargoShip.setSpeed(10); // ... and the Cargo move at 10, as before 

trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 10 
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10 

注意如何既StaticShips 10移动 - 这是因为我们设置了“cargoShip”比如去年的速度 - 在StaticShip的“速度”属性声明静态它跨越共享该类的所有实例。

现在,就像您可以在类中具有静态属性一样,您也可以具有静态函数。通常,当你调用一个类的方法(例如:setSpeed())时,你需要在一个实例上调用该方法(即:scoutShip.setSpeed(500);),然而,静态方法允许你与给定类的其他静态成员进行交互,这里是另一个例如:

静态方法示例现在

public class StaticMethodShip { 
    private static var speed : Number; 

    // Note that setSpeed is now declared as static 
    public static function setSpeed(value : Number) : void { 
     this.speed = value; 
    } 

    public function getSpeed() : Number { 
     return this.speed; 
    } 
} 

,我们仍然可以像以前一样创建StaticMethodShip的新实例,但是因为我们现在已经宣布“setSpeed”为静态的,我们不能调用setSpeed上一个实例:

var scoutShip : StaticMethodShip = new StaticMethodShip(); 

// This call will trigger Error #1180 - Call to a possibly undefined Method because 
// setSpeed was declared as static. 
scoutShip.setSpeed(500); 

相反,我们现在只能调用在StaticMethodShip类setSpeed()方法,即:当你要定义给定类的所有情况下(即行为

// Set the speed of all StaticMethodShip instances. 
StaticMethodShip.setSpeed(250); // all StaticMethodShips travel at 250. 

// Proof! 
var shipOne : StaticMethodShip = new StaticMethodShip(); 
var shipTwo : StaticMethodShip = new StaticMethodShip(); 

trace("ShipOne Speed: " + shipOne.getSpeed()); // 250 
trace("ShipTwo Speed: " + shipTwo.getSpeed()); // 250 

静态方法是有用的:所有StaticMethodShips以指定速度移动,全部淡出Tweens持续0.25秒等等);但他们也共同使用的设计模式,如Static Factory Method

现在,你看到你的错误的原因 - 成员级别方法能够调用静态方法,即:

public class StaticExampleOne { 
    public static function getName() : String { 
     return "Robbe"; 
    } 

    public function traceName() : void { 
     // traces 'Robbe'. 
     trace(getName()); 
    } 
} 

在使用( new StaticExampleOne().traceName())这工作得很好 - 成员方法可以访问静态方法没有问题,但是这并不工作周围的其他方法:

public class StaticExampleTwo { 
    private var name : String = "Robbe"; 

    public function getName() : void { 
     return this.name; 
    } 

    public static function traceName() : void { 
     // Throws Error #1180. 
     trace(getName()); 
    } 
} 

这是因为静态方法没有范围(即:他们不知道是哪个插件因为它们只能引用其他静态成员),因此无法访问类成员(方法和属性)。

为了解决您的问题,您可以向船舶引入一个名为'STAGE'的静态属性(通常静态属性用全部大写写入,以区分它们与成员属性),然后使您的方法保持静态。

希望这会有所帮助,祝你好运! 乔尼。

+0

这样做,摆脱了错误。现在是它不会执行代码的问题。任何想法如何解决? – 2012-01-03 22:36:16

相关问题