1

私は 2D シューティング ゲームを作成しており、さまざまな攻撃が特定の敵の種類に対してさまざまな効果を持つようにしようとしています。弾丸と敵を 2 つの配列に配置してから、弾丸と敵に対して hitTestObject を実行する for ループを使用します。これはすべて機能しますが、Bullet クラス内に文字列として型を返す public static 関数と、文字列を受け取り、スイッチを使用して敵が受けるダメージを決定する Enemy クラス内の public static 関数があります。プログラムを実行すると、エラー #1069: プロパティ getType が obj.QuickBullet に見つかりませんでした。既定値はありません。

敵のコード。

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);
                }
            }

        }
4

2 に答える 2

2

注: あなたのエラーは、 にプロパティがないことを示しgetType()ていますが、 のQuickBulletコードのみを提供しましたPowerBullet

static名前空間が に適用されましたgetType()。これは、クラスのインスタンスではなく、クラス自体を介してのみこのメソッドを呼び出すことができることを意味します。

PowerBullet.getType();

を削除するstaticと、期待どおりに各インスタンスでそのメソッドにアクセスできるようになります。

追記: and のようにstatic論理的に見えないいくつかのクラスメンバーに使用しているようです。その目的をよりよく理解するために、静的名前空間をよく読むことをお勧めします。healthisHit()

于 2013-03-07T21:11:59.453 に答える
2

staticこのコードから削除

public static function getType():String{
    return TYPE;
}
于 2013-03-07T21:10:43.570 に答える