Несколько видеоклипов все идут в одном месте;Что я делаю неправильно? - PullRequest
0 голосов
/ 07 марта 2011

Итак, я пытаюсь выстрелить несколько пуль из моего тела, и все это работает, за исключением того, что у меня есть странная проблема - только одна пуля появляется и обновляется, чтобы установить положение для новых.У меня есть способный игрок, который должен стрелять, и я проверяю этот код, перемещая игрока и стреляя.Я делаю это шаг за шагом при создании этого.

Результат отслеживания bulletContainer правильно учитывается в том смысле, что он говорит мне, что мувиклипы добавляются на сцену;Я просто знаю, что это сводится к какой-то логике, которую я забыл.

Вот мой код (Пуля сама по себе является классом)

ОБНОВЛЕНИЕ * Все в этом коде работает нормально, за исключением того, что я говорил ранее, некоторые коды кажутся избыточными, потому что я прибег к другим подходам.

Класс 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;
                }
    }

}

Класс Bullet:

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

    }

}

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Хорошо ... если я могу так сказать, этот код выглядит совсем не так.Либо чего-то не хватает в коде, либо этот код никогда не заставит пули лететь.

Во-первых, вы можете напрямую установить x и y новой пули (замените все после «ориентировать эту пулю из тела игрока»this):

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
}

В этом примере ваша пуля летит вправо.Если вам нужно, чтобы он летел в другом направлении, просто закомментируйте строку с комментарием «двигаться вправо» и раскомментируйте одну из других строк.

Это, конечно, очень простой пример, но он должен помочь вам начать.

Надеюсь, это поможет, и что мой ответ не является неправильным ответом на вопрос.

0 голосов
/ 09 марта 2011

Ну, я закончил писать весь код с нуля в третий раз и столкнулся с подобной проблемой, и просто для ссылки на кого-то еще, кто сталкивается с проблемой, которая является случайной, так как эта, как я обнаружил, эта проблема была, вероятно, связана с преобразованием ошибка где-то, что не обязательно нарушает какие-либо правила компиляции. Просто я звонил в видеоклип, а не в сам класс.

0 голосов
/ 07 марта 2011

Насколько я знаю, у вас может быть только одна копия объекта MovieClip, добавленная к конкретному дочернему элементу.Наилучшим подходом является использование ByteArray для источника клипа, создание нового MovieClip и передача ByteArray в качестве источника.Это как-то связано с дочерним / родительским отношением, поскольку DisplayObject может иметь только одного родителя (и способ также отсоединить объект от сцены).

...