2012-01-03 5 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

지금 당장 바보 같지만 어떻게 그 방법의 인스턴스를 만들 수 있습니까? 아마 그렇게 쉽지만, 나는 그것을 찾을 수 없다. –

+1

@RobbeVanWinckel 메서드의 인스턴스를 만들 수 없습니다. 문제는 takeDamage()가 Ship 클래스 자체에 속하는 메서드라는 것입니다 (Ship 유형의 객체가 아닙니다!). 나머지 코드를 살펴보면 takeDamage() 및 상태 변수에서 "정적"키워드를 제거하기 만하면됩니다.이 키워드는 플레이어 (인스턴스)에 속한 것처럼 보입니다. – weltraumpirat

+0

@weltraumpirat 문제는 ​​다른 클래스에서이 메서드를 사용한다는 것입니다. static이라는 단어를 제거하면 '오류 # 1119 : 정적 유형 Class가있는 참조를 통해 maxHealth가 아닌 정의되지 않은 속성에 액세스 할 수 있습니다.' 어떻게 해결할 수 있습니까? –

0

연초를위한 멋진 간단한 하나!

'takeDamage'함수를 정적 메서드로 선언했습니다. 즉, Ship 클래스의 특정 인스턴스에 속하지 않으며 클래스 자체에 속합니다. 정적 메서드와 속성, 당신은 OOP를 처음 사용하는 경우 약간 혼란 스러울 수 있지만 쉽게 간단한 예를 통해 설명 :

클래스 회원 재산권

이 예에서 우리 선박에 대한 새로운 클래스 정의를 선언 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의 모든 인스턴스에서 공유됩니다. 예를 들면 : 모두 StaticShips 10에서 이동 방법

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 

공지 사항 - 우리가 마지막으로 '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); 
주어진 클래스의 모든 경우 (예에 대한 동작을 정의 할 때

// 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 

정적 방법이 유용하다 :

대신, 우리는 이제 단지 StaticMethodShip 클래스에 setSpeed ​​() 메소드, 즉를 호출 할 수 있습니다 : 모든 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'라는 새 정적 속성을 도입 할 수 있습니다. 일반적으로 static 속성은 모든 CAPS에 작성되어 멤버 속성과 구분됩니다. kill() 메서드를 정적으로 만듭니다.

희망이 도움과 행운을 빕니다! Jonny.

+0

그렇게함으로써 오류를 없앴습니다. 이제 코드를 실행하지 않는 문제가 있습니다. 그걸 해결하는 방법에 대한 아이디어가 있습니까? –

관련 문제