2013-03-07 38 views
1

我正在制作一个2d射手,并试图让不同的攻击对某些敌人类型有不同的效果。我把我的子弹和敌人放到两个数组中,然后使用for循环,它对子弹和敌人执行hitTestObject。这一切都有效,但是我在Bullet类中有一个公共静态函数,它将类型返回为String类型,而Enemy类中的公共静态函数需要一个String,然后使用一个开关来清除敌人接收到的伤害。当我运行我的程序时,我不断收到错误#1069:在obj.QuickBullet上找不到属性getType,并且没有默认值。从数组中的MovieClip访问函数 - AS3

敌人的代码。

package char { 

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

public class Enemy1 extends MovieClip { 

    private var _type:String; 
    private static var _health:Number; 
    private var _vx:Number; 
    private var _vy:Number; 
    private var _stage:Stage; 

    private static var _instance:Enemy1; 

    public function Enemy1() { 
     init(); 
    } 

    private function init():void { 
     //Vars 
     _vx = -10; 
     _vy = Math.random()*10; 
     _health = 1; 
     _stage = Main.getStage(); 
     _instance = this; 

     //Listeners 
     addEventListener(Event.ADDED_TO_STAGE, onAdded); 
     addEventListener(Event.ENTER_FRAME, enemyLoop); 
     addEventListener(Event.REMOVED_FROM_STAGE, onRemoved); 

     //Add Enemy 
     Main.getInstance().addChild(this); 
    } 

    //When Added 
    private function onAdded(event:Event):void{ 
     //Set position 
     this.x = _stage.stageWidth; 
     this.y = Math.random() * _stage.stageHeight; 
     //trace("Enemy created"); 

     dispatchEvent(new Event("enemyCreated", true)); 
    } 

    //Loop 
    private function enemyLoop(event:Event):void { 
     //Move 
     x += _vx; 
     y += _vy; 

     //Boundaries 
     if (this.y <= 0 + this.height/2){ 
      this.y = this.height/2; 
      _vy *= -1; 
     } 
     if (this.y >= _stage.stageHeight - this.width/2){ 
      this.y = _stage.stageHeight - this.width/2; 
      _vy *= -1; 
     } 

     //Health cheack 
     if (_health <= 0){ 
      if (this.parent) { 
       this.parent.removeChild(this); 
      } 
      trace(this + " is dead."); 
     } 
     //Leaves screen 
     if (this.x <= -this.width){ 
      Main.getInstance().removeChild(this); 
     } 
    } 

    public static function isHit(type:String):void{ 
     switch(type){ 
      case "power" : 
       _health -= 1; 
       break; 
      case "quick" : 
       _health -= 1; 
       break; 
      case "strong" : 
       _health -= 1; 
       break; 
      default: 
        _health -= 1; 
      } 
     } 

     public static function getEnemy1():Enemy1{ 
      return _instance; 
     } 

     //When Removed 
     private function onRemoved(event:Event):void { 
      removeEventListener(Event.ADDED_TO_STAGE, onAdded); 
      removeEventListener(Event.ENTER_FRAME, enemyLoop); 
      removeEventListener(Event.REMOVED_FROM_STAGE, onRemoved); 
      //trace("enemy removed"); 
     } 
    } 

} 

Bullet的代码。

package obj { 

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


public class PowerBullet extends MovieClip { 
    //const 
    private static const TYPE:String = "power"; 

    //Varibles 
    private var _vx:Number; 
    private var _vy:Number; 
    private var _startX:Number; 
    private var _startY:Number; 
    private var _stage:Stage; 

    public function PowerBullet(startX:Number, startY:Number) { 
     _startX = startX; 
     _startY = startY; 

     addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     Main.getInstance().addChild(this); 
    } 

    //When created 
    private function onAddedToStage(event:Event):void{ 
     //Initialize vars 
     this.x = _startX; 
     this.y = _startY; 
     _vx = 20; 
     _vy = 0; 
     _stage = Main.getStage(); 

     dispatchEvent(new Event("bulletCreated", true)); 

     //Event Handlers 
     addEventListener(Event.ENTER_FRAME, bulletLoop); 
     addEventListener(Event.REMOVED_FROM_STAGE, onRemoved); 
    } 

    //Bullet loop 
    private function bulletLoop(event:Event):void { 
     //Move bullet 
     x += _vx; 
     y += _vy; 

     if (this.x - this.width > _stage.stageWidth) 
     { 
      parent.removeChild(this); 
     } 
    } 

    public static function getType():String{ 
     return TYPE; 
    } 

    //When Removed 
    private function onRemoved(event:Event):void { 
     removeEventListener(Event.ENTER_FRAME, bulletLoop); 
     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     removeEventListener(Event.REMOVED_FROM_STAGE, onRemoved); 
    } 
} 

} 

我正在使用的for循环。

for (var i:int = 0; i < _enemies.length; i++){ 
for(var j:int = 0; j < _bullets.length; j++){ 
    if(_bullets[j].hitTestObject(_enemies[i])){ 
     if (_bullets[j].parent) { 
          _bullets[j].parent.removeChild(_bullets[j]); 
        } 

        _enemies[i].isHit(_bullets[j].getType()); 

        _enemies.splice(i, 1); 
        _bullets.splice(j, 1); 

        i--; 
        j--; 

        Main.setScore(10); 
       } 
      } 

     } 

回答

2

注意:你的错误是说有上QuickBullet没有财产getType()但你只为PowerBullet提供的代码。

您有static名称空间应用于getType()。这意味着你只能通过类本身而不是类的实例调用此方法:

PowerBullet.getType(); 

如果删除static,你就可以访问每个实例方法像预期。

附加说明:它看起来像几个班级成员使用static,它似乎不像healthisHit()逻辑。我建议你阅读静态名称空间以更好地理解它的用途。

2

从这个代码删除static

public static function getType():String{ 
    return TYPE; 
} 
+0

非常感谢你,我一定会阅读静态名称空间。 – Cxsquared 2013-03-08 00:05:45