0

私は ActionScript 3 に非常に慣れていませんが、小さな「戦車」のようなシューティング ゲームを徐々に構築してきました。今は弾丸射撃を追加するところです。これを行うために、新しい AS3 クラスを作成し、などをインポートしましたが、ゲームを実行するとエラーが発生します:

未定義の可能性があるメソッドの呼び出しturretShot

なぜこれが起こるのかを知るのを手伝ってください。このエラーは私のコンパイラ エラーに 2 回表示され、その行は非常に似ています。影響を受けるコードの部分は次のとおりです。

shotTurret.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 actionscript にインポートしました。

import resources.*;

私のクラスファイルはゲームのディレクトリの「リソース」フォルダにあります。

さて、これらのエラーをスローしているコードの 2 つのセクション...それらと関係があるのか​​ 、クラスだけなのかはわかりませんが、次のとおりです。

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

どんな助けでも大歓迎です。

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

このクラスの構文を修正したので、他の質問のコメント セクションで意味を確認できます。すべての変数の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 に答える
0

Dave Hart が述べたように、多くのエラーがありますが、質問している特定のエラーは、クラスを FLA にインポートしていないためです。

import resources.turretShot;
于 2012-10-19T18:06:24.783 に答える