Научи меня, чтобы получить переменную через класс - PullRequest
0 голосов
/ 12 октября 2018

Спасибо, что посмотрели мой пост.Я делаю игру.Я работаю во вражеском классе.Я хочу, чтобы враг следовал за игроком, если расстояние достаточно близко.И у меня есть проблема здесь.Я не могу получить playerx и игривость.Это мой класс: Main.as

package
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;

    public class Main extends MovieClip
    {
        public var player:Player;


        public function Main():void
        {
            player = new Player
            player.x=400;
            player.y=300;
            stage.addChild(player);
        }
    }
}

врага.as

package  {

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


    public class enemy extends MovieClip {

        public var enemyhp:Number=100;

        public function enemy() {
            // constructor code
            addEventListener(Event.ENTER_FRAME, enemyLoop);
        }
        function enemyLoop(e:Event):void
        {
            trace(Player.playerx);
            trace(Player.playery);
        }
    }

}

Player.as

package  {

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

    public class Player extends MovieClip {

        public var playerx:Number;
        public var playery:Number;

        public function Player() {
            // constructor code
            addEventListener(Event.ENTER_FRAME, returnxy);
        }
        function returnxy(e:Event):void
        {
            playerx=x;
            playery=y;
        }
    }

}

и это моя ошибка: D: \Testtestest \ врага. Строка 18 1119: доступ к неопределенному свойству playerx через ссылку со статическим типом Class.D: \ Testtestest \ врага.as, строка 19 1119: Доступ к неопределенным свойствам игрового процесса через ссылку со статическим типом Class.

Извините, потому что мой английский не очень хороший.Я - вьетнамец, и я новичок в кодировании. Я хочу программировать с помощью Class, как профессионал.Большое вам спасибо.<3 </p>

1 Ответ

0 голосов
/ 12 октября 2018

Вы пытаетесь использовать свойства игрока playerx & playery, как будто они являются статическими свойствами (то есть принадлежат классу, а не экземпляру).Вам нужно получить ссылку на экземпляр вашего плеера или сделать свойства статичными.
Есть несколько способов сделать это, вот один из способов, который быстрый, но не обязательно самый чистый:

В своем классе Player создайте статическую переменную для хранения экземпляра синглтона вашего проигрывателя:

public static var me:Player;

Затем в конструкторе класса проигрывателя (то есть метода с именем Player) назначьте thisна me var:

me = this;

Теперь у вас есть статическая ссылка на ваш экземпляр проигрывателя, и вы можете получить доступ к его общедоступным свойствам и методам в любом месте вашего приложения, выполнив Player.me, например Player.me.x

Что это делает, каждый раз, когда вы создаете новый экземпляр Player, он присваивает этот экземпляр классу me var класса Player.Предположительно, у вас есть только один экземпляр Player в любой момент времени.

Теперь статические методы и переменные следует использовать с осторожностью, поскольку они сохраняются в течение всего жизненного цикла вашего приложения.Некоторые разработчики стараются использовать как можно меньше static (или только для констант и настроек), и я, как правило, согласен с ними, что добавление некоторых статических свойств в экранный объект не так уж и плохо, если вы убираете после себядолжным образом.(например, null ссылка me, если вы больше не нуждаетесь в плеере в памяти)

Конечно, есть много других способов получить ваш экземпляр Player, например, сделать MovieClip(root).player (не фанат этого синтаксиса, но он работает) или вводит его в вашего врага от общего родителя с помощью (new Enemy(player)) или имеет класс, который управляет всеми врагами и игроком вместе.Если бы у вас было время, я бы искал некоторые лучшие практики для шаблонов программирования игр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...