«загрузка» не является функцией - PullRequest
1 голос
/ 09 декабря 2010

У меня раздражающая проблема. Я немного погуглил и не могу найти хороших ответов, поэтому надеюсь найти здесь помощь.

Я получаю эту ошибку, которая кажется довольно распространенной:

TypeError: Error #1006: update är inte en funktion.  // = update is not a function (english)
at se.qmd.spaceInvaders::ShipHandler/onEnterFrame()

Обновление определенно является функцией, поэтому я действительно не могу понять, в чем проблема.

Моя настройка. Я использую Flashdevelop. У меня есть класс Main , который установлен как класс документа в моем файле fla . У меня есть структура пакета с моим главным классом в папке src , а мои подклассы в se.qmd.spaceInvaders и se.qmd.starLight . Я также использую TweenMax и сохраняю его в «нормальной» структуре пакета из папки src.

В классе Main я добавляю на сцену экземпляр класса LeGun , который также является «экспортированным» мувиклипом в файле fla, экземпляром класса StarHandler и экземпляром класса ShipHandler. У меня также есть слушатель клавиатуры, который с помощью функции enterframe перемещает мой экземпляр класса LeGun. Хорошо, без проблем. StarHandler работает должным образом, а ShipHandler работает должным образом, пока я не вызову 1 или 2 метода в классе Ship , который также является «экспортированным» мувиклипом в файле fla. Класс Ship - это, конечно, класс, содержащий Ship, который обрабатывается ShipHandler.

Ниже приведены мои классы ShipHandler и Ship, и я надеюсь, что это не увеличит длину поста. ShipHandler.as:

package se.qmd.spaceInvaders {

import flash.display.MovieClip;
import se.qmd.spaceInvaders.Ship;
import flash.display.Stage;
import flash.events.Event;

public class ShipHandler extends MovieClip {

    private var _shipArray:Array = [];
    private const NUM_START_SHIPS:int = 25;
    private var s:Stage = null;

    private var _directionX:Number = 1;
    private var _directionY:Number = 1;
    private var _velocityX:Number;
    private var _velocityY:Number;

    private const YBORDER_TOP:int = 50;
    private const YBORDER_BOTTOM:int = 525;

    public function ShipHandler(o:Stage) {

        s = o; // tar emot stage från main
        createObjects();

        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }   

    private function createObjects():void {

        for (var i:int = 0; i < NUM_START_SHIPS; i++) {

            var aShip:Ship = new Ship();
            aShip.x = Math.random() * (s.stageWidth - aShip.width) + aShip.width / 2;
            aShip.y = Math.random() * (s.stageHeight - aShip.height -135) + aShip.height / 2 + 55;
            this.addChild(aShip);
            _shipArray.push(aShip);
            aShip.startMove(Math.random(), Math.random());
        }           
    }   

    private function onEnterFrame(e:Event):void {

        for (var i:int = 0; i < _shipArray.length; i++) {

            var aShip:Ship = _shipArray[i] as Ship;
            aShip.update();
        }   
    }
}
}

Ship.as:

package se.qmd.spaceInvaders {

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

public class Ship extends MovieClip {

    private var _directionX:Number = 1;
    private var _directionY:Number = 1;
    private var _velocityX:Number;
    private var _velocityY:Number;

    private const YBORDER_TOP:int = 50;
    private const YBORDER_BOTTOM:int = 525;

    public function Ship() {

        //s = o; // tar emot stage  
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(e:Event):void {

        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        this.width = 50;
        this.height = 18;           
    }

    public function update():void {

        // x led vänster kant
        if(this.x <= this.width / 2) {

            this.x = this.width / 2;
            _directionX *= -1;
        }

        // x led höger kant
        if(this.x >= 800 - this.width / 2) {

            this.x = 800 - this.width/2;
            _directionX *= -1;
        }

        // y led top kant
        if(this.y <= YBORDER_TOP + this.height/2) {

            this.y = YBORDER_TOP + this.height / 2;
            _directionY *= -1;
        }

        // y led botten kant
        if(this.y >= YBORDER_BOTTOM - this.height/2) {

            this.y = YBORDER_BOTTOM - this.height / 2;
            _directionY *= -1;
        }

        this.x += _velocityX * _directionX;
        this.y += _velocityY * _directionY;
    }

    public function startMove(directionX:Number, directionY:Number):void {

        trace(directionX, directionY);
        _velocityX = 10;
        _velocityY = 10;

        if (directionX < 0.5) {

            _directionX = -1;
        }

        if (directionY < 0.5) {

            _directionY = -1;
        }
    }

    public function changeDirection():void {

        _directionX *= -1;
        _directionY *= -1;
    }   
}
}

Как только я вызываю методы startMove или update из ShipHandler, я получаю сообщение об ошибке, которое я написал выше. Буду признателен за любую помощь, как мне кажется, я должен делать что-то в корне неправильно ...

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Мне кажется, что Ship - это просто MovieClip (это динамический класс, и поэтому компилятор не жалуется, когда вы пытаетесь получить доступ к методу, который не существует во время компиляции.) MovieClips don 'у него нет метода update(), поэтому, когда вы пытаетесь вызвать его, он не может быть найден в экземпляре Ship.

Действительно ли MovieClip в вашем FLA-файле экспортируется как se.qmd.spaceInvaders.Ship (а не простоShip)?Если это просто Ship, это объясняет, почему ваш письменный класс не назначен классом графики вашего корабля, оставляя его просто простым мувиклипом, который объяснит эту ошибку.

0 голосов
/ 09 декабря 2010

Я попробовал ваш оригинальный код, и он отлично работает для меня. Мне не нужно было ничего менять.

Компилируете ли вы из Flash IDE? В этом случае попробуйте очистить кэш с помощью Control> Удалить файлы ASO , например:

alt text


Попробуйте вместо этого сыграть корабль так:

private function onEnterFrame(e:Event):void {

    for (var i:int = 0; i < _shipArray.length; i++) {

            var aShip:Ship = Ship(_shipArray[i]);
            if(aShip)
                aShip.update();
            else
                throw Error("ship is null at position " + i)
    }   
}

Или используйте Vector вместо Array:

var _shipArray : Vector.<Ship> = new Vector.<Ship>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...