声明来自其他类的符号的移动

时间:2013-09-16 09:42:33

标签: actionscript-3 function class

这是我第一次在这里发帖:)

我在我的项目中创建了三个类(游戏开始),我对AS3很新。

首先我创建了一个名为player的类,其中包含ball_A的运动。 然后我创建了一个叫做敌人的类,它将包含ball_B的运动。

在我的主课程中,我创建了对玩家和敌人类的引用,并尝试根据我的玩家类分配ball_A.x和ball_A.y坐标,并为敌人类别分配。

这是我的主要课程。

package  
{
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;

public class Main extends MovieClip
{
    public var playerClass:player;
    public var enemyClass:enemy;



    public function Main()
    {
        playerClass = new player();
        enemyClass = new enemy();
        addChild(playerClass);
        addChild(enemyClass);

        ball_A.x = playerClass.ball_A_x;
        ball_A.y = playerClass.ball_A_y;

        ball_B.x = enemyClass.ball_B_x;
        ball_B.y = enemyClass.ball_B_y;



    }//Public function

}// Class

}// Package

这是我的玩家类:

    package  {
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;


public class player extends MovieClip
{

    var leftIsPressed:Boolean = false;
    var rightIsPressed:Boolean = false;
    var upIsPressed:Boolean = false;
    var downIsPressed:Boolean = false;
    var spaceIsPressed:Boolean = false;
    var rightCtrlIsPressed:Boolean = false;
    var speed:Number = 15;
    var vx:Number = 0;
    var vy:Number = 0;
    var ball_A_x:int = 0;
    var ball_A_y:int = 0;




    public function player() 
    {
        this.addEventListener(Event.ADDED_TO_STAGE, initialize);
    }

        private function initialize(e:Event):void 
        {
            //EventListeners
            this.removeEventListener(Event.ADDED_TO_STAGE, initialize);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

        }




        //Functions

        function keyDownHandler(e:KeyboardEvent):void 
        {
            switch(e.keyCode) 
            {
                case Keyboard.LEFT : leftIsPressed = true; break;
                case Keyboard.RIGHT : rightIsPressed = true; break;
                case Keyboard.UP : upIsPressed = true; break;
                case Keyboard.DOWN : downIsPressed = true; break;
                case e.keyCode = 163 : rightCtrlIsPressed = true; break;

            }

        }

        function keyUpHandler(e:KeyboardEvent):void 
        {
            switch(e.keyCode)
            {
                case Keyboard.LEFT : leftIsPressed = false; break;
                case Keyboard.RIGHT : rightIsPressed = false; break;
                case Keyboard.UP : upIsPressed = false; break;
                case Keyboard.DOWN : downIsPressed = false; break;
                case e.keyCode = 163 :  rightCtrlIsPressed = false; break;
            }

        }

        function enterFrameHandler(e:Event):void 
        {
            vx = -int(leftIsPressed)*speed + int(rightIsPressed)*speed;
            vy = -int(upIsPressed)*speed + int(downIsPressed)*speed;

                ball_A_x += vx;
                ball_A_y += vy;

                if(ball_A_x >= 530)
                {
                    ball_A_x = 0;
                }
                else if(ball_A_x <= 0)
                {
                    ball_A_x = 530;
                }
                if(ball_A_y >= 370)
                {
                    ball_A_y = -28;
                }
                else if(ball_A_y <= -28)
                {
                    ball_A_y = 370;
                }

        }


    //}//Public function


}//Class
}//Package

我想让连接到我的主类的.fla中的两个符号具有玩家类和敌人类的功能。 (由于代码基本相同,没有显示敌人)

但是当我尝试使用此代码时,我收到此错误:TypeError:错误#1009:无法访问空对象引用的属性或方法。     在球员()     在Main()

我认为这是因为我的eventListeners没有返回任何内容,因为它们是无效的。如何在不必在一个类中编写所有移动命令的情况下解决这个问题?

很抱歉,如果我的英语不是很好,或者我输入此代码有什么问题。这是我第一次在这里发帖,所以我很乐意接受任何评论

1 个答案:

答案 0 :(得分:0)

我认为问题在于,在播放器添加到舞台之前,您在Player中指的是“舞台”。事实上,玩家永远不会被添加到舞台上,因此,玩家永远无法进入舞台。 在Main中,将你的玩家和敌人添加到舞台上:

addChild(playerClass);
addChild(enemyClass);

并在您的Player和Enemy类的构造函数中添加:

this.addEventListener(Event.ADDED_TO_STAGE, initialize);

private function initialize(e:Event):void {
this.removeEventListener(Event.ADDED_TO_STAGE, initialize);
... other event listeners here, now that Player is on stage
}