Пуля отлично стреляет в трех направлениях, но не влево

#actionscript-3 #flash

#actionscript-3 #вспышка

Вопрос:

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

Проблема заключается в том, чтобы поиграть с пулевой стрельбой. Я не очень разбираюсь в тригонометрии, поэтому при нажатии клавиши я просто использую свойство .rotate для поворота проигрывателя. Я передаю целое число .rotate в свой класс bullet и использую его, чтобы указать, в каком направлении должна двигаться пуля. Он отлично работает для движений вверх, вниз и вправо, но когда персонаж смотрит влево, пуля создается, но не имеет никакой скорости, и, хоть убей, я не могу понять, где ошибка в коде.

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

Большое вам спасибо, ребята.

Основной класс

 package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.text.TextField;


    public class Main extends MovieClip
    {
        var player:Player;
        var inventory:Inventory;
        var invArray:Array = new Array();
        var key:_Key;
        var vx:int;
        var maxSpeed:int;
        var key_Up:Boolean;
        var key_Down:Boolean;
        var key_Left:Boolean;
        var key_Right:Boolean;
        var maxKey:int;
        var keyCount:TextField;
        var keysUp:int;
        var door:Door;
        var doorOpen:Boolean;
        var wall1:Wall;
        var wall2:Wall;
        var wallCollide:Boolean;
        var bulletTime:int;
        var bulletLimit:int;
        var bulletShoot:Boolean;
        static var playerRotation:int;


        public function Main()
        {
            init();
        }

        public function init():void
        {
            stage.addEventListener(Event.ENTER_FRAME, gameLoop);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

            initPlayer();
            initVariables();
            initInventory();
            initItems();


        }

        public function gameLoop(e:Event):void
        {
            movePlayer();
            collisionDetection();
            bullet();
        }

        public function keyDownHandler(e:KeyboardEvent):void
        {
            switch (e.keyCode)
            {
                case 37 :
                    key_Left = true;
                    break;

                case 38 :
                    key_Up = true;
                    break;

                case 39 :
                    key_Right = true;
                    break;

                case 40 :
                    key_Down = true;
                    break;

                case 32:
                    if(bulletShoot)
                    {
                        bulletShoot = false;
                        var newBullet:Bullet = new Bullet(player.rotation);
                        newBullet.x = player.x;
                        newBullet.y = player.y;
                        addChild(newBullet);

                    }
            }
        }

        public function keyUpHandler(e:KeyboardEvent):void
        {
            switch (e.keyCode)
            {
                case 37 :
                    key_Left = false;
                    break;

                case 38 :
                    key_Up = false;
                    break;

                case 39 :
                    key_Right = false;
                    break;

                case 40 :
                    key_Down = false;
                    break;
            }

        }

        public function movePlayer():void
        {
            if (key_Left amp;amp; !key_Right)
            {
                player.x -=  maxSpeed;
                player.rotation = 270;
            }

            if (key_Right amp;amp; !key_Left)
            {
                player.x  =  maxSpeed;
                player.rotation = 90;
            }

            if (key_Up amp;amp; !key_Down)
            {
                player.y -=  maxSpeed;
                player.rotation = 0;
            }

            if (key_Down amp;amp; !key_Up)
            {
                player.y  =  maxSpeed;
                player.rotation = 180;

            }

            /*if ( key_Left amp;amp; key_Up amp;amp; !key_Right amp;amp; !key_Down )
            {
                player.rotation = 315;
            }
            if ( key_Right amp;amp; key_Up amp;amp; !key_Left amp;amp; !key_Down )
            {
                player.rotation = 45;
            }
            if ( key_Left amp;amp; key_Down amp;amp; !key_Right amp;amp; !key_Up )
            {
                player.rotation = 225;
            }
            if ( key_Right amp;amp; key_Down amp;amp; !key_Left amp;amp; !key_Up )
            {
                player.rotation = 135;
            }*/

        }

        public function initPlayer():void
        {
            player = new Player();
            player.x = stage.stageWidth * .5;
            player.y = stage.stageHeight * .5;
            stage.addChild(player);

        }

        public function initVariables():void
        {
            vx = 0;
            maxSpeed = 4;
            key_Up = false;
            key_Down = false;
            key_Left = false;
            key_Right = false;
            maxKey = 3;
            keysUp = 0;
            doorOpen = false;
            wallCollide = false;
            bulletTime = 0;
            bulletLimit = 12;
            bulletShoot = true ;
        }

        public function collisionDetection():void
        {

            for (var i:int=0; i < invArray.length; i  )
            {
                key = invArray[i];
                if (player.hitTestObject(key))
                {
                    stage.removeChild(key);
                    invArray.splice(i, 1);
                    keysUp  ;
                    //trace(keysUp);
                    i--;
                    keyCount.text = String(keysUp);
                    break;
                }

            }

            if (player.hitTestPoint(door.x,door.y   25,true) amp;amp; (keysUp > 0) amp;amp; ! doorOpen)
            {
                door.gotoAndStop(2);
                keysUp--;
                invArray.pop();
                trace(keysUp);
                keyCount.text = String(keysUp);
                doorOpen = true;
            }

            if (player.hitTestObject(door) amp;amp; (keysUp == 0) amp;amp; ! doorOpen)
            {
                wallCollide = true;
            }

            if (player.hitTestObject(wall1))
            {

                wallCollide = true;
            }

            if (player.hitTestObject(wall2))
            {
                wallCollide = true;
            }

            if (wallCollide == true)
            {
                player.y  =  4;
                wallCollide = false;
            }


        }

        public function initInventory():void
        {
            inventory = new Inventory();
            inventory.x = stage.stageWidth * .15;
            inventory.y = stage.stageHeight * .90;
            stage.addChild(inventory);

            keyCount = new TextField();
            stage.addChild(keyCount);
            keyCount.x = inventory.x - 8;
            keyCount.y = inventory.y   3;
            keyCount.text = String(keysUp);
            //keyCount.border = true;
            keyCount.width = 20;
            keyCount.height = 20;

        }

        public function initItems():void
        {

            while (invArray.length < maxKey)
            {
                key = new _Key  ;
                key.x = Math.random() * 550;
                key.y = Math.random() * 300;
                stage.addChild(key);
                invArray.push(key);

            }

            door = new Door();
            door.x = 250;
            door.y = 25;

            wall1 = new Wall();
            stage.addChild(wall1);
            wall1.x = door.x - 175;
            wall1.y = door.y;

            wall2 = new Wall();
            stage.addChild(wall2);
            wall2.x = door.x   175;
            wall2.y = door.y;

            stage.addChild(door);
        }

        public function bullet():void
        {
            if (bulletTime < bulletLimit)
            {
                bulletTime  ;
            } else
            {
                bulletShoot = true;
                bulletTime = 0;
            }
        }
    }
}
  

Класс пули

 package  {

import flash.display.MovieClip;
import flash.events.Event;


public class Bullet extends MovieClip {

    public var _root:Object;
    public var speed:int = 10;
    public var bulletRotation:int;


    public function Bullet(pRotation:int) {

        addEventListener(Event.ADDED, beginClass);
        addEventListener(Event.ENTER_FRAME, eFrame);
        bulletRotation = pRotation;
    }

    private function beginClass(e:Event):void
    {
        _root = MovieClip(root);
    }

    private function eFrame(e:Event):void
    {
        if (bulletRotation == 0)
        {
            this.y -= speed;
        }

        else if (bulletRotation == 90)
        {
            this.x  = speed;
        }

        else if(bulletRotation == 270)
        {
            this.x -= speed;
        }

        else if(bulletRotation == 180)
        {
            this.y  = speed;
        }

        if(this.y < -1 * this.height)
        {
            removeEventListener(Event.ENTER_FRAME, eFrame);
            _root.removeChild(this);
        }

        if(this.x < -1 * this.width)
        {
            removeEventListener(Event.ENTER_FRAME, eFrame);
            _root.removeChild(this);
        }

    }

}
  

}

Комментарии:

1. Для решения подобных проблем я настоятельно рекомендую вам поставить точку останова на строке, в которой вы добавляете маркер в сцену, и изучить переменные.

Ответ №1:

В классе Bullet измените 270 на -90 в строке 38:

 else if(bulletRotation == -90)
{
     this.x -= speed;
}
  

Комментарии:

1. Большое вам спасибо за ответ, я не выдержал, посмотрел несколько тригонометрических задач и решил их таким образом, но здорово иметь такое понимание на будущее, спасибо, ребята!!