AS3 - “调用可能未定义的方法”

时间:2012-10-19 15:35:01

标签: actionscript-3

我是ActionScript 3的新手,但我一直在逐渐建立一个小型的“坦克”式射击游戏,现在我正在加入我的子弹射击,为此我做了一个新的AS3类并导入它等,但是当我运行游戏时,我收到错误:

  

调用可能未定义的方法turretShot

请帮助我找出发生这种情况的原因。此错误在我的编译器错误中显示两次,并且它的行非常相似,这是受影响的代码部分:

shootTurret.as(班级档案)

package resources
{
    import flash.display.*;
    import flash.events.*;

    public class turretShot extends MovieClip
    {
        var enemy_mc:MovieClip;
        public function turretShot(enemy_mc:MovieClip)
        {
            var xSpeed:Number;
            var ySpeed:Number;
            var angle:Number;
            public var shotSpeed:Number;
            speed = 30;
            var gravity:Number = 1;
            var thisShot:MovieClip;
            var platform1_mc:MovieClip;
            var platform2_mc:MovieClip;
            var thisParent: *;
            enemy_mc = enemy;
            this.addEventListener(Event.ADDED, initialize);
        }
        function initialize(event:Event):void
        {
            this.addEventListener(Event.ENTER_FRAME, moveShot);
            thisParent = event.currentTarget.parent;
            platform1_mc = thisParent.platform1_mc;
            platform2_mc = thisParent.platform2_mc;
            thisShot = MovieClip(this.parent.getChildByName(this.name));
            angle = this.rotation / 180 * Math.PI;
            xSpeed = Math.cos(angle) * speed;
            ySpeed = Math.sin(angle) * speed;
        }   
        function moveShot(event:Event):void
    }
}

我已经在我的游戏.FLA动作中导入了这个必要的框架:

import resources.*;

因为我的班级文件位于游戏目录的“resources”文件夹中。

现在,抛出这些错误的代码的两个部分......不确定它是与它们有关还是只与类有关,但它们是:

(第4行)

var shot_mc:MovieClip;
if (keyPressed == Keyboard.SPACE && spaceKeyDown == false)
{
    shot_mc = new turretShot(enemy_mc);
    shot_mc.x = user_mc.x + user_mc.turret_mc.x;
    shot_mc.y = user_mc.y + user_mc.turret_mc.y;
    shot_mc.rotation = user_mc.turret_mc.rotation;
    addChild(shot_mc);
    spaceKeyDown = true;
}

和(第一行):

var shot_mc:MovieClip = new turretShot(user_mc);
shot_mc.x = enemy_mc.x + enemy_mc.enemyTurret_mc.x;
shot_mc.y = enemy_mc.y + enemy_mc.enemyTurret_mc.y;
shot_mc.rotation = enemyTargetRotation;
shot_mc.speed = Math.random() * 15 + 15;
addChild(shot_mc);

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您的turretShot类中有几个错误,编译器可能也会报告这些错误。修复它们,此消息应该消失。

您在构造函数中定义的变量应该与var enemy_mc:MovieClip;一起在其外部定义。根据您的代码逻辑,使publicprivateprotected成为一个很好的反应。

我还看到行enemy_mc = enemy;引用了一个不存在的enemy变量。您可能意味着您的构造函数为public function turretShot(enemy:MovieClip)

我没有接受的代码中可能存在其他错误。

答案 1 :(得分:0)

就像Dave Hart所说,你有很多错误但是你要问的具体错误是因为你没有将课程导入你的FLA。

import resources.turretShot;

答案 2 :(得分:0)

我更正了这个类的语法,因此你可以在评论部分看到我对其他问题的意思。我提供了所有变量public范围和方法private范围,但您可以随意更改它以满足您的需求。

您应该注意,您发布的代码存在许多语法错误,并且您在尝试编写完整游戏之前应该对ActionScript3和OOP充满信心。请在AS3和课程上学习本教程(或任何其他):kirupa tutorial on Classes in ActionScript 3

另外,类名通常用 UpperCamelCase 编写。这是大多数ActionScript3(和Java等)程序员遵循的惯例,如果您坚持使用它,您的代码将更易读,因此下次应该更容易帮助您;)

package resources
{
    import flash.display.*;
    import flash.events.*;

    public class TurretShot extends MovieClip
    {
        public var enemy_mc:MovieClip;
        public var xSpeed:Number;
        public var ySpeed:Number;
        public var angle:Number;
        public var shotSpeed:Number;
        public var speed:Number = 30;
        public var gravity:Number = 1;
        public var thisShot:MovieClip;
        public var platform1_mc:MovieClip;
        public var platform2_mc:MovieClip;
        public var thisParent: *;

        public function TurretShot(enemyParam:MovieClip)
        {

            enemy_mc = enemyParam;
            this.addEventListener(Event.ADDED, initialize);
        }

        private function initialize(event:Event):void
        {
            this.addEventListener(Event.ENTER_FRAME, moveShot);
            thisParent = event.currentTarget.parent;
            platform1_mc = thisParent.platform1_mc;
            platform2_mc = thisParent.platform2_mc;
            thisShot = MovieClip(this.parent.getChildByName(this.name));
            angle = this.rotation / 180 * Math.PI;
            xSpeed = Math.cos(angle) * speed;
            ySpeed = Math.sin(angle) * speed;
        }

        private function moveShot(event:Event):void
        {
           //do stuff every frame
           trace("enter frame");
        }


    }
}

希望这有帮助!