Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 我的角色赢了';t Move:(多个.as文件AS3)_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 我的角色赢了';t Move:(多个.as文件AS3)

Actionscript 3 我的角色赢了';t Move:(多个.as文件AS3),actionscript-3,flash,Actionscript 3,Flash,我有几个.as文件。它们是:MainClass.as、FrontEnd.as、Levels.as和Hero.as。我的问题(据我所知)在我的Hero.as文件中。让我描述一下我是如何在thusfar中设置它们的,因为我有点担心在AS3中有更好的方法 MainClass.as生成前端变量(菜单,即主菜单)并调用它(addChild)。 前端。还有我的菜单。按钮等等。。。 Levels.as现在只需在主菜单上按下“开始新游戏”按钮时调用level 1。我花了很长时间才弄清楚如何使用不同的.as fi

我有几个.as文件。它们是:MainClass.as、FrontEnd.as、Levels.as和Hero.as。我的问题(据我所知)在我的Hero.as文件中。让我描述一下我是如何在thusfar中设置它们的,因为我有点担心在AS3中有更好的方法

MainClass.as生成前端变量(菜单,即主菜单)并调用它(addChild)。 前端。还有我的菜单。按钮等等。。。 Levels.as现在只需在主菜单上按下“开始新游戏”按钮时调用level 1。我花了很长时间才弄清楚如何使用不同的.as file.Hero.as中的函数。我将添加我的代码。我发布整个内容,因为我不知道我的问题出在哪里

public class Hero extends MovieClip
{

    public var roger:player = new player();
    private var animationState:String = "down";
    public var facing:String = "down";
    private var isLeft:Boolean = false;
    private var isRight:Boolean = false;
    private var isUp:Boolean = false;
    private var isDown:Boolean = false;
    public var currentPlayer:MovieClip = roger;

    public function Hero()
    {
        addEventListener(Event.ENTER_FRAME, loop);
        addEventListener(Event.ADDED_TO_STAGE, onStage);
        trace(currentPlayer);
    }
    public function onStage( event:Event ):void
    {
        removeEventListener( Event.ADDED_TO_STAGE, onStage );
    }
    public function addCurrentPlayer():void
    {
        roger.x = stage.stageWidth * .5;
        roger.y = stage.stageHeight * .5;
        addChild(roger);
        currentPlayer = roger;
        setBoundaries();
    }       
    public function keyDownHandler(event:KeyboardEvent)
    {      
        if (event.keyCode == 39)//right press 
        {
            isRight = true;
        }    
        if (event.keyCode == 37)//left pressed 
        {
            isLeft = true;
        }   
        if (event.keyCode == 38)//up pressed 
        {
            isUp = true;
        }     
        if (event.keyCode == 40)//down pressed 
        {
            isDown = true;
        }
    }
    public function keyUpHandler(event:KeyboardEvent)
    {  
        if (event.keyCode == 39)//right released 
        {
            isRight = false;
        }   
        if (event.keyCode == 37)//left released 
        {
            isLeft = false;
        }  
        if (event.keyCode == 38)//up released 
        {
            isUp = false;
        }  
        if (event.keyCode == 40)//down released
        {
            isDown = false;
        }
    }
    public function loop(Event):void
    {
        if (currentPlayer == null)
        {
            addCurrentPlayer();//make sure at least roger is on the screen
        }           
        currentPlayer.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        currentPlayer.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
        //----------------------------------0
        //Animation States
        //----------------------------------0
        if (isDown == true)
        {
            currentPlayer.y +=  5;
            animationState = "walk_down";
            facing = "down";
            currentPlayer.gotoAndStop(animationState);
        }
        else if (isUp == true)
        {
            currentPlayer.y -=  5;
            animationState = "walk_up";
            facing = "up";
            currentPlayer.gotoAndStop(animationState);
        }
        else if (isRight == true)
        {
            currentPlayer.x +=  5;
            animationState = "walk_right";
            facing = "right";
            currentPlayer.gotoAndStop(animationState);
        }
        else if (isLeft == true)
        {
            currentPlayer.x -=  5;
            animationState = "walk_left";
            facing = "left";
            currentPlayer.gotoAndStop(animationState);
        }
        //----------------------------------0;
        //IDLE STATES
        //----------------------------------0
        else if (isDown == false)
        {
            currentPlayer.gotoAndStop(facing);
        }
        else if (isUp == false)
        {
            currentPlayer.gotoAndStop(facing);
        }
        else if (isRight == false)
        {
            currentPlayer.gotoAndStop(facing);
        }
        else if (isLeft == false)
        {
            currentPlayer.gotoAndStop(facing);
        }
    }
    public function setBoundaries():void
    {
        var halfHeight:int = currentPlayer.height * .5;
        var halfWidth:int = currentPlayer.width * .5;

        if(currentPlayer.y <= 1)
        {
            currentPlayer.y += halfHeight;
        }
        else if(currentPlayer.y > stage.stageHeight)
        {
            currentPlayer.y -= halfHeight;
        }
        else if(currentPlayer.x <= 1)
        {
            currentPlayer.x += halfWidth;
        }
        else if(currentPlayer.x > stage.stageWidth)
        {
            currentPlayer.x -= halfWidth;
        }
    }
}
}


如果我从var currentPlayer:MovieClip=roger中删除=roger;它会给我#1009 null对象,即使我在addCurrentPlayer()中告诉它将currentPlayer更改为roger。在级别1上,所有内容都会显示,但我无法移动我的角色。我知道在我制作他的动画时,它起了作用,我会将他呼叫到主菜单。所有内容都对他起了作用。现在有什么问题吗?

首先,您的代码有很多问题:
在您的Hero类中,“onStage”事件处理程序除了删除触发它的事件侦听器之外,实际上不做任何事情。虽然删除事件侦听器是一种良好的做法,但事件处理程序应该还有其他用途。如果没有,您可以删除它,而不必为添加的\u to \u STAGE事件而烦恼。
类似地,在Levels类“onStage”事件处理程序中,您试图删除该事件,但命名了错误的处理程序。我假设您希望删除该事件处理程序,然后运行“gotoLevelOne”方法。如果是这样,只需将Event.ADDED__阶段侦听器调用“gotoLevelOne”,然后删除该事件侦听器即可:

public function Levels() 
    {
        addEventListener(Event.ADDED_TO_STAGE, gotoLevelOne);
    }

    public function gotoLevelOne():void
    {
        removeEventListener(Event.ADDED_TO_STAGE, gotoLevelOne);
        // class continues....
好的,关于你的问题:
在调用addCurrentPlayer(设置位置)之前,您将从Hero类外部引用currentPlayer,因此将得到空错误。
如果您临时将currentPlayer定义为一个私有变量,编译器应该在您首先从Hero类外部引用currentPlayer的位置为您提供一个行号(错误类似于“X类正在尝试访问Y类的私有(或不存在)属性”)。 然后,在调用addCurrentPlayer之前,您可以找出访问currentPlayer的原因。您可能还需要考虑currentPlayer是否需要公开(如果需要,那么“addCurrentPlayer”的作用是什么?该函数有效地充当currentPlayer的设置器)

编辑:
目前,您正在为游戏循环的每一帧添加新的“向下键”和“向上键”事件侦听器。这是不必要的。在游戏初始化时(可能在英雄的舞台处理程序中)添加这两个侦听器一次,并依靠它们触发相应的处理程序。
您需要将向下键和向上键侦听器添加到“舞台”,而不是currentPlayer,因此:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

在您的英雄实例被添加到后台之后,您需要添加侦听器,这样它就可以访问“后台”。这就是为什么在英雄的后台处理程序中添加侦听器是有意义的。

trace(currentPlayer);显示类,使其正确,trace(currentPlayer.name);将返回实例名称。在您的代码中,roger是一个类属性。如果您的播放机未移动,您是否尝试在keyDownHandler中跟踪,并且以帧速率多次执行
循环
,是否确实要注册那么多次事件?
currentPlayer.addEventListener(KeyboardEvent.KEY\u DOWN,keyDownHandler);
应该只调用一次,也要确保在不再需要时取消注册。我会在addCurrentPlayer中注册,然后在removeCurrentPlayer(或类似方法)中删除它。舞台上的事件处理程序就在那里,以防我需要它。我以前需要它,以确保我的菜单被添加到舞台上,并将它们设置到中间,但在那之后继续。我想我会保留它以防万一。仍然对参数和事件处理程序感到困惑@。@但如果你不想,你不必解释。我会找本书的很快我会的。我现在就让它调用gotoLevelOne(),直到我觉得我不再需要它为止。addCurrentPlayer()用于将玩家添加到屏幕中央。我不希望每次都让他在中间。更重要的是确保他工作。唯一一次在Hero之外调用玩家。就像在我的gotoLevelOne()中一样功能。因为当我进入一级时,我希望玩家被放置在一个特定的位置。这在我的头脑中是有意义的。我实例化了Hero()就在那里。也许我只需要给角色打一次电话,然后使用入口或门来处理他在另一个关卡/屏幕上的位置。我不明白为什么它会将罗杰添加到X100Y100,但他不会移动……你现在正在将这些值设置为100,而不是添加100。要添加100,请使用hero.currentPlayer.x+=100;我知道如何移动我的角色ter…这就是为什么我有上键和下键处理程序。我希望他被添加到x100 y100的舞台上,这确实发生了。但是我的键处理程序不工作。这就是问题。他在x100 y100出现在屏幕上,但我不能移动他。我不希望他自己移动。
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);