0

だから私は自分の体から複数の弾丸を発射しようとしていますが、1つの弾丸だけが表示され、新しい弾丸の位置を設定するために更新されるという奇妙な問題があることを除いて、すべて機能します. 撃つはずの移動可能なプレーヤーがあり、プレーヤーを移動して撃ってこのコードをテストします。私はこれを作成する際に一歩一歩進んでいます。

bulletContainer をトレースした結果は、ムービークリップがステージに追加されていることを示すという点で正しくカウントされます。私が忘れているある種の論理に帰着することを私は知っています。

これが私のコードです(Bullet自体はクラスです)

更新* このコードのすべてが正常に機能しますが、以前に述べたように、別のアプローチに頼ったために一部のコードが冗長になっているようです。

BulletGod クラス:

public class bulletGod extends MovieClip{
    //Register Variables
        //~Global
            var globalPath                      = "http://127.0.0.1/fleshvirusv3/serverside/"

        //~MovieCLips
            var newBullet:bulletClass           = new bulletClass();

        //~Boolean
            var loadingBulletInProgress:Number  = 0;
            var shootingWeapon:Number           = 0;

        //~Timers
            var fireBulletsInterval     = setInterval(fireBullets, 1);
            var bulletFireEvent;

        //~Arrays
            var bulletArray:Array               = new Array();
            var bulletType:Array                = new Array();
            var bulletContainer:Array           = new Array();

        //~Networking
            var netBulletRequest:URLRequest     = new URLRequest(globalPath+"bullets.php");
            var netBulletVariables:URLVariables = new URLVariables();
            var netBulletLoader:URLLoader       = new URLLoader();          

        //~Bullet Image Loader
            var mLoader:Loader                  = new Loader();
            var mRequest:URLRequest             = new URLRequest();

                public function bulletGod() {
                    //Load every bullet for every gun

                    //Compile data to be requested
                         netBulletVariables.act             = "loadBullets"
                         netBulletRequest.method            = URLRequestMethod.POST
                         netBulletRequest.data              = netBulletVariables;
                         netBulletLoader.dataFormat         = URLLoaderDataFormat.VARIABLES;

                         netBulletLoader.addEventListener(Event.COMPLETE, getBulletImages);
                         netBulletLoader.load(netBulletRequest);

                }

                private function getBulletImages(bulletImageData:Event){
                    //Request every bullet URL image

                    //Set vars
                    var bulletData = bulletImageData.target.data;

                    //Load images
                    for(var i:Number = 0; i < bulletData.numBullets; i++){
                        bulletArray.push(bulletData["id"+i.toString()]);
                        bulletType.push(bulletData["bullet"+i.toString()]);
                        //trace(bulletData["id"+i]+"-"+bulletData["bullet"+i]);
                    }

                    //All the arrays have been set start firing the image loader/replacer
                    var imageLoaderInterval = setInterval(imageReplacer, 10);

                }

                private function imageReplacer(){
                    //Check to see which image needs replacing
                    if(!loadingBulletInProgress){
                        //Begin loading the next image
                            //Search for the next "String" in the bulletType:Array, and replace it with an image
                            for(var i:Number = 0; i < bulletType.length; i++){
                                if(getQualifiedClassName(bulletType[i]) == "String"){
                                    //Load this image
                                        mRequest = new URLRequest(globalPath+"ammo/"+bulletType[i]);
                                        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImage);
                                        mLoader.load(mRequest);

                                        //Stop imageReplacer() while we load image
                                        loadingBulletInProgress = 1;

                                        //Stop this for() loop while we load image
                                        i = 999;
                                }
                            }
                    }
                }

                private function loadImage(BlackHole:Event){
                    //Image has loaded; find which array slot it needs to go into

                    for(var i:Number = 0; i <= bulletType.length; i++){
                        if(getQualifiedClassName(bulletType[i]) == "String"){
                            //We found which array type it belongs to; now replace the text/url location with the actual image data
                            var tmpNewBullet:MovieClip = new MovieClip;
                                tmpNewBullet.addChild(mLoader);

                            //Add image to array
                                bulletType[i] = tmpNewBullet;

                            //Restart loadingBullets if there are more left
                                loadingBulletInProgress = 0;

                            //Stop for() loop
                            i = 999;
                        }
                    }
                }
//###############################################################################################################################################
            private function fireBullets(){
                //If player is holding down mouse; Fire weapon at rate of fire.
                if(shootingWeapon >= 1){
                    if(bulletFireEvent == null){
                        //Start shooting bullets
                        bulletFireEvent = setInterval(allowShooting, 500);
                    }
                }

                if(shootingWeapon == 0){
                    //The user is not shooting so stop all bullets from firing
                    if(bulletFireEvent != null){
                        //Strop firing bullets
                        clearInterval(bulletFireEvent);
                        bulletFireEvent = null
                    }
                }
            }

            private function allowShooting(){
                //This function actually adds the bullets on screen

                //Search for correct bullet/ammo image to attach
                    var bulletId:Number = 0;
                    for(var i:Number = 0; i < bulletArray.length; i++){
                        if(bulletArray[i] == shootingWeapon){
                            //Bullet found
                            bulletId = i;

                            //End For() loop
                            i = 999;
                        }
                    }

                //Create new bullet
                        //Create Tmp Bullet
                        var tmpBulletId:MovieClip = new MovieClip
                            tmpBulletId.addChild(newBullet);
                            tmpBulletId.addChild(bulletType[bulletId]);
                        //Add To Stage
                            addChild(tmpBulletId)
                            bulletContainer.push(tmpBulletId);  //Add to array of bullets

                //Orientate this bullet from players body
                        var bulletTmpId:Number = bulletContainer.length
                            bulletTmpId--;
                            bulletContainer[bulletTmpId].x = Object(root).localSurvivor.x
                            bulletContainer[bulletTmpId].y = Object(root).localSurvivor.y

                            //addChild(bulletContainer[bulletTmpId]);   
            }


            //_______________EXTERNAL EVENTS_______________________
                public function fireBullet(weaponId:Number){
                    shootingWeapon = weaponId;
                }

                public function stopFireBullets(){
                    shootingWeapon = 0;
                }
    }

}

弾丸クラス:

package  com{
        import flash.display.*
        import flash.utils.*
        import flash.net.*
        import flash.events.*
    public class bulletClass extends MovieClip {
            public var damage:Number = 0;

        public function bulletClass() {
            //SOME MOVEMENT CODE HERE
        }

        public function addAvatar(Obj:MovieClip){
            this.addChild(Obj);
        }

    }

}
4

3 に答える 3

1

ええと...そう言えば、このコードはかなり間違っているように見えます。コードに何かが欠けているか、このコードでは弾丸が飛ばないかのどちらかです。

まず、新しい弾丸の x と y を直接設定できます (「この弾丸をプレイヤーの体から向ける」の後のすべてを次のように置き換えます)。

tmpBulletId.x = Object(root).localSurvivor.x;
tmpBulletId.y = Object(root).localSurvivor.y;

おそらくこれはすでに役に立ちますが、そこにあるコードはすでに同じことをしているはずです。

ただし、これらの弾丸を任意の方向に飛ばすには、次のようにイベント リスナーも追加する必要があります。

tmpBulletId.addEventListener(Event.ENTER_FRAME, moveBullet);

function moveBullet(e:Event) {
    var movedBullet:MovieClip = MovieClip(e.currentTarget);
    if (movedBullet.x < 0 || movedBullet.x > movedBullet.stage.width || 
        movedBullet.y < 0 || movedBullet.y > movedBullet.stage.height) {

        // remove move listener, because the bullet moved out of stage
        movedBullet.removeEventListener(Event.ENTER_FRAME);
    }
    // remove the comment (the //) from the line that you need
    MovieClip(e.currentTarget).x += 1; // move right
    // MovieClip(e.currentTarget).y -= 1; // move up
    // MovieClip(e.currentTarget).x -= 1; // move left
    // MovieClip(e.currentTarget).y += 1; // move down
}

この例では、弾丸を右に飛ばします。別の方向に飛ぶ必要がある場合は、「右に移動」コメントのある行をコメントアウトし、他の行の 1 つをコメント解除します。

もちろん、これは非常に単純な例ですが、開始する必要があります。

これが役に立ち、私の答えが質問に対する間違った答えではないことを願っています。

于 2011-03-07T14:15:47.307 に答える
0

私が経験した限りでは、特定の子に追加できる MovieClip オブジェクトのコピーは 1 つだけです。最良の方法は、クリップ ソースに ByteArray を使用し、新しい MovieClip をインスタンス化して、ByteArray をソースとして渡すことです。DisplayObject は親を 1 つしか持つことができないため、子/親の関係と関係があります (また、オブジェクトをシーンから切り離す方法もあります)。

于 2011-03-07T13:55:21.487 に答える
0

さて、私は 3 回目のコード全体をゼロから書くことになり、同様の問題に遭遇しました。これはランダムな問題に遭遇した他の誰かへの参照のためだけです。必ずしもコンパイル規則に違反しているわけではありません。それ自体のクラスではなく、ムービークリップを呼び出していたというだけです。

于 2011-03-09T06:52:04.013 に答える