Импорт внешних классов - PullRequest
       30

Импорт внешних классов

0 голосов
/ 20 августа 2011

В настоящее время я работаю над игрой на платформе Flash и стараюсь, чтобы каждый уровень имел свой собственный класс, который определяет функцию hitTest (каждый класс связан с мувиклипом уровня), который позволил бы ходить по уровню. Всякий раз, когда я пытаюсь импортировать подкласс в класс Document, появляются ошибки, и это сводит меня с ума (Ошибка 1120: доступ к неопределенному свойству)!

Буду признателен за любую помощь!

Класс документа (Class_Main.as):

package 
{
    import flash.events.*;
    import flash.display.*;
    import flash.geom.Point;
    import Level1;
    import Level2;

    public class Class_Main extends MovieClip
    {
        public var leftKeyDown:Boolean = false;
        public var rightKeyDown:Boolean = false;
        public var upKeyDown:Boolean = false;
        public var downKeyDown:Boolean = false;
        public var onGround:Boolean = true;
        public var xSpeed:Number = 0;
        public var ySpeed:Number = 0;
        public var mainSpeed:Number = 3.75;
        public var frictionPower:Number = 0.9;
        public var jumpPower:Number = 15;
        public var gravityPower:Number = 0.7;
        public var terminalVelocity:Number = 75;
        public var Level_1:Level1 = new Level1();
        public var Level_2:Level2 = new Level2();

        public function Class_Main()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
            // constructor code
        }
        public function init(event:Event)
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
            stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);
            stage.addEventListener(Event.ENTER_FRAME,hitTest);
            stage.addEventListener(Event.ENTER_FRAME,vCamMovement);
            stage.addEventListener(Event.ENTER_FRAME,Main);
        }
        public function Main(event:Event):void
        {
            moveCharacter();
            dynamicMovement();
        }
        public function checkKeysDown(event:KeyboardEvent):void
        {
            if (event.keyCode == 37)
            {
                leftKeyDown = true;
            }
            if (event.keyCode == 38)
            {
                upKeyDown = true;
            }
            if (event.keyCode == 39)
            {
                rightKeyDown = true;
            }
            if (event.keyCode == 40)
            {
                downKeyDown = true;
            }
        }
        public function checkKeysUp(event:KeyboardEvent):void
        {
            if (event.keyCode == 37)
            {
                leftKeyDown = false;
            }
            if (event.keyCode == 38)
            {
                upKeyDown = false;
            }
            if (event.keyCode == 39)
            {
                rightKeyDown = false;
            }
            if (event.keyCode == 40)
            {
                downKeyDown = false;
            }
        }
        public function moveCharacter():void
        {
            if (leftKeyDown)
            {
                mcMain.scaleX = -1;
                xSpeed -=  mainSpeed;
            }
            if (rightKeyDown)
            {
                mcMain.scaleX = 1;
                xSpeed +=  mainSpeed;
            }
            if (leftKeyDown && onGround || rightKeyDown && onGround)
            {
                mcMain.gotoAndStop(2);
            }
            if (upKeyDown)
            {
                ySpeed -=  jumpPower;
            }
            if (upKeyDown && leftKeyDown)
            {
                ySpeed -=  0;
                xSpeed -=  10;
            }
            if (upKeyDown && rightKeyDown)
            {
                ySpeed -=  0;
                xSpeed +=  10;
            }
            if (xSpeed > 3 && ! onGround || xSpeed < -3 && ! onGround)
            {
                if (mcMain.currentFrame == 2)
                {
                    mcMain.gotoAndStop(5);
                }
            }
            if (ySpeed < -0.5 && ! onGround)
            {
                mcMain.gotoAndStop(4);
            }
            else if (ySpeed > 0.5 && ! onGround)
            {
                mcMain.gotoAndStop(5);
            }
            if (mcMain.currentFrame == 5 && onGround)
            {
                mcMain.gotoAndStop(1);
            }
            if (mcMain.currentFrame == 2)
            {
                if (! leftKeyDown && ! rightKeyDown)
                {
                    mcMain.gotoAndStop(3);
                }
            }
            if (mcMain.currentFrame == 3)
            {
                if (mcMain.skidAnimation.currentFrame == mcMain.skidAnimation.totalFrames)
                {
                    mcMain.gotoAndStop(1);
                }
            }
            //if (! leftKeyDown && ! rightKeyDown && ! upKeyDown)
            //{
            //mcMain.gotoAndStop(1);
            //}
        }
        public function dynamicMovement():void
        {
            mcMain.x +=  xSpeed;
            xSpeed *=  frictionPower;
            if (xSpeed > 7)
            {
                xSpeed = 7;
            }
            if (xSpeed < -7)
            {
                xSpeed = -7;
            }
            mcMain.y +=  ySpeed;
            ySpeed +=  gravityPower;
            if (ySpeed > terminalVelocity)
            {
                ySpeed = terminalVelocity;
            }
        }
        public function hitTest(event:Event)
        {
            spawnArea.visible = false;
            mcMain.mcMainHitArea.visible = false;
            Level_1.wallCollision.visible = false;
            Level_1.deathArea.visible = false;
            Level_1.goalArea.goalHitArea.visible = false;

            while (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y,true))
            {
                mcMain.y--;
            }
            if (! Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 1,true))
            {
                //upKeyDown = false;
                if (! Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 5,true))
                {
                    upKeyDown = false;
                    onGround = false;
                }
            }
            if (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 1,true))
            {
                ySpeed = 0;
                if (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 5,true))
                {
                    onGround = true;
                }
            }
            if (Level_1.wallCollision.hitTestPoint(mcMain.x - 9,mcMain.y - 25,true))
            {
                mcMain.x + 9;
                mcMain.y + 11;
                upKeyDown = false;
                leftKeyDown = false;
            }
            if (Level_1.wallCollision.hitTestPoint(mcMain.x + 9,mcMain.y - 25,true))
            {
                mcMain.x - 9;
                mcMain.y - 11;
                upKeyDown = false;
                rightKeyDown = false;
            }
            if (Level_1.wallCollision.hitTestPoint(mcMain.x - 9,mcMain.y - 11,true))
            {
                xSpeed = 0;
                leftKeyDown = false;
            }
            if (Level_1.wallCollision.hitTestPoint(mcMain.x + 9,mcMain.y - 11,true))
            {
                xSpeed = 0;
                rightKeyDown = false;
            }
            if (Level_1.deathArea.hitTestPoint(mcMain.x,mcMain.y + 1,true))
            {
                mcMain.x = spawnArea.x;
                mcMain.y = spawnArea.y;
            }
            if (mcMain.hitTestObject(Level_1.goalArea.goalHitArea))
            {
                if (stage.contains(Level_1))
                {
                    this.removeChild(Level_1);
                }
                addChild(Level_2);
                Level_2.x = -400;
                Level_2.y = -700;
            }
        }
        public function vCamMovement(event:Event):void
        {
            /*for (var i:int = 0; i < this.numChildren - 1; i++)
            {
            this.getChildAt(i).x -=  xSpeed;
            //levelObjects.getChildAt(i).y -=  ySpeed;
            }*/
            Level_1.x +=  stage.stageWidth * 0.5 - mcMain.x;
            Level_1.y +=  stage.stageHeight * 0.5 - mcMain.y;
            Level_2.x +=  stage.stageWidth * 0.5 - mcMain.x;
            Level_2.y +=  stage.stageHeight * 0.5 - mcMain.y;
            spawnArea.x +=  stage.stageWidth * 0.5 - mcMain.x;
            spawnArea.y +=  stage.stageHeight * 0.5 - mcMain.y;
            mcMain.x = stage.stageWidth * 0.5;
            mcMain.y = stage.stageHeight * 0.5;
        }

    }

}

Уровень 2 (Level2.as):

package 
{

    import flash.display.MovieClip;
    import flash.events.*;
    import Class_Main;
    import Level2Walls;

    public class Level2 extends MovieClip
    {
        public var classMain:Class_Main = new Class_Main  ;
        public var level2Walls:Level2Walls = new Level2Walls  ;

        public function Level2()
        {
            stage.addEventListener(Event.ENTER_FRAME,hitTest_2);
            // constructor code
        }
        public function hitTest_2(event:Event)
        {
            while (level2Walls.hitTestPoint(mcMain.x,mcMain.y,true))
            {
                mcMain.y--;
            }
            if (! level2Walls.hitTestPoint(mcMain.x,mcMain.y + 1,true))
            {
                //upKeyDown = false;
                if (! level2Walls.hitTestPoint(mcMain.x,mcMain.y + 5,true))
                {
                    upKeyDown = false;
                    onGround = false;
                }
            }
            if (level2Walls.hitTestPoint(mcMain.x,mcMain.y + 1,true))
            {
                ySpeed = 0;
                if (level2Walls.hitTestPoint(mcMain.x,mcMain.y + 5,true))
                {
                    onGround = true;
                }
            }
            if (level2Walls.hitTestPoint(mcMain.x - 9,mcMain.y - 25,true))
            {
                mcMain.x + 9;
                mcMain.y + 11;
                upKeyDown = false;
                leftKeyDown = false;
            }
            if (level2Walls.hitTestPoint(mcMain.x + 9,mcMain.y - 25,true))
            {
                mcMain.x - 9;
                mcMain.y - 11;
                upKeyDown = false;
                rightKeyDown = false;
            }
            if (level2Walls.hitTestPoint(mcMain.x - 9,mcMain.y - 11,true))
            {
                xSpeed = 0;
                leftKeyDown = false;
            }
            if (level2Walls.hitTestPoint(mcMain.x + 9,mcMain.y - 11,true))
            {
                xSpeed = 0;
                rightKeyDown = false;
            }
        }

    }

}

Ответы [ 2 ]

1 голос
/ 21 августа 2011

Вот пара вещей, которые могут вызывать у вас проблемы:

  • Level2 не должен создавать экземпляр Class_Main.Никогда не должно быть более одного экземпляра класса документа, и он создается автоматически при запуске swf.

  • В конструкторе Level2 ссылка на stage будет нулевой.Вы не можете получить ссылку на stage, пока объект не будет добавлен в список отображения, что невозможно сделать, пока конструктор уже не запущен.

  • Я не вижувезде, где ваши объекты, созданные в вашем конструкторе, Level_1 и Level_2, добавляются в stage.Если эти элементы являются символами, которые вы уже добавили на сцене в Flash IDE, вам не нужно создавать их новые экземпляры в конструкторе.

  • Вам не нужнодобавить операторы импорта, если объекты находятся в одном пакете.

Я не знаю, что любая из этих вещей очистит ваши ошибки, но, по крайней мере, должна приблизить вас1021 *

0 голосов
/ 21 августа 2011

Вам нужно передать ссылку на ваш основной класс в классы Уровня, а не пытаться создать новый экземпляр.Самый простой способ сделать это - передать ссылку через конструктор класса уровня, и поэтому вам не следует создавать экземпляры классов уровня, пока вы на самом деле не находитесь в конструкторе класса Main:

public class Class_Main extends MovieClip
{
    public var leftKeyDown:Boolean = false;
    public var rightKeyDown:Boolean = false;
    public var upKeyDown:Boolean = false;
    public var downKeyDown:Boolean = false;
    public var onGround:Boolean = true;
    public var xSpeed:Number = 0;
    public var ySpeed:Number = 0;
    public var mainSpeed:Number = 3.75;
    public var frictionPower:Number = 0.9;
    public var jumpPower:Number = 15;
    public var gravityPower:Number = 0.7;
    public var terminalVelocity:Number = 75;
    public var Level_1:Level1;
    public var Level_2:Level2;

    public function Class_Main()
    {
        addEventListener(Event.ADDED_TO_STAGE,init);
        Level_1 = new Level1(this);
        Level_2 = new Level2(this);
        // constructor code
    }

изатем:

public class Level2 extends MovieClip
{
    public var classMain:Class_Main;
    public var level2Walls:Level2Walls = new Level2Walls;

    public function Level2($ref:Class_Main)
    {
        classMain = $ref;
        stage.addEventListener(Event.ENTER_FRAME,hitTest_2);
        // constructor code
    }

И, наконец, в своей функции Hittest, используйте classMain для ссылки на класс вашего документа, а не mcMain.

Кроме того, просто примечание относительно именЭкземпляры уровня Level - для первой буквы экземпляра или свойства следует использовать строчную букву, то есть level_2 вместо Level_2.Это не повлияет на вашу способность запускать вашу программу, но это соглашение AS3, и поэтому это хорошая привычка.

...