0

我对 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.*;

因为我的类文件位于游戏目录的“资源”文件夹中。

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

(第四行)

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);

任何帮助,将不胜感激。

4

3 回答 3

1

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

您在构造函数内定义的变量应在其外部定义,以及var enemy_mc:MovieClip;. 根据您的代码逻辑public制作它们private也是一种很好的反射。protected

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

我没有捡到的代码中可能还有其他错误。

于 2012-10-19T15:51:14.403 回答
0

就像戴夫哈特所说的那样,您有很多错误,但是您要问的具体错误是因为您没有将课程导入您的 FLA。

import resources.turretShot;
于 2012-10-19T18:06:24.783 回答
0

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

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

附带说明一下,类名通常用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");
        }


    }
}

希望这可以帮助!

于 2012-10-21T18:11:25.690 回答