Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

[РЕШЕНО] Разобраться с переменными разных методов

Discussion in 'Разработка плагинов для новичков' started by GodlikE, May 11, 2014.

  1. Автор темы
    GodlikE

    GodlikE Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    GodlikE
    Всем привет=) Кому не трудно, помогите мне расставить все точки над И по поводу переменных, взятых из разных методов. Допустим у меня есть вот такой код:
    Code:
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
            if(cmd.getName().equalsIgnoreCase("joingreen"))
            {
                Player player = (Player) sender;
                player.setScoreboard(score);
                team.addPlayer(player);
                player.sendMessage("Вы присоединились к зеленой комманде");
                player.getLocation().setX(locx);
               
            }
           
            if(cmd.getName().equalsIgnoreCase("setspawngreen"))
            {
                Player player = (Player) sender;
                double locx = player.getLocation().getX();
                double locy = player.getLocation().getY();
                double locz = player.getLocation().getZ();
    Я беру из второго условия координаты X, Y и Z игрока и заталкиваю их в переменные locx, locy и locz. Потом пытаюсь подставить их в первое условие, но Эклипс видит в этом ошибку, как будто такой переменной, как locx не существует. Подскажите, что я делаю не так?=)
     
  2. Хостинг MineCraft
    <
  3. ptnk

    ptnk Старожил Пользователь

    Trophy Points:
    173
    Иди читай учебник по java, а в особенности про область видимости переменных, там ты найдёшь исчерпывающий ответ.
     
    kirill2011s and Den_Abr like this.
  4. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Trophy Points:
    173
    Code:
      if(sender instanceof Player){
              Player player = (Player) sender;
              double locx;
              double locy;
              double locz;
    
            if(cmd.getName().equalsIgnoreCase("joingreen"))
            {
                player.setScoreboard(score);
                team.addPlayer(player);
                player.sendMessage("Вы присоединились к зеленой комманде");
                player.getLocation().setX(locx);
            }
        
            if(cmd.getName().equalsIgnoreCase("setspawngreen"))
            {
                 locx = player.getLocation().getX();
                 locy= player.getLocation().getY();
                 locz = player.getLocation().getZ();
                 //Твой код короч...
             }
    }
    Где-то так
     
    MegaFlary and GodlikE like this.
  5. Автор темы
    GodlikE

    GodlikE Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    GodlikE
    [DOUBLEPOST=1399799529,1399799492][/DOUBLEPOST]
    Спасибо=)[DOUBLEPOST=1399800192][/DOUBLEPOST]
    Сделал так, как ты сказал, но Эклипс все равно видит ошибку=)
    Code:
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
            if(sender instanceof Player){
                  Player player = (Player) sender;
                  double locx;
                  double locy;
                  double locz;
    
                  if(cmd.getName().equalsIgnoreCase("setspawngreen"))
                  {
                    
                      locx = player.getLocation().getX();
                      locy = player.getLocation().getY();
                      locz = player.getLocation().getZ();
                  }
                
            if(cmd.getName().equalsIgnoreCase("joingreen"))
            {
              
                player.setScoreboard(score);
                team.addPlayer(player);
                player.sendMessage("Вы присоединились к зеленой комманде");
                player.getLocation().setX(locx);          
            }
        }
            return false;
        }
    Строка с ошибкой: player.getLocation().setX(locx);
     
  6. Gentalion

    Gentalion Активный участник Пользователь

    Trophy Points:
    93
    Имя в Minecraft:
    Gentalion
    Не легче ли телепортировать игрока?
     
    makssof likes this.
  7. kirill2011s

    kirill2011s Старожил Пользователь

    Trophy Points:
    103
    Такие вопросы здесь не задаются... Здесь нужно задавать вопросы по Bukkit API и подобным вещам, но не про синтаксис и структуру Java.
     
    D_ART likes this.
  8. Ission

    Ission Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    lokivava
    А всё по тому, что у Вас так работать не будет. Если вы хотите, чтобы по одной команде устанавливались locx/y/z, а по другой ими пользоваться, то Вы должны учитывать один нюанс: переменная существует начиная с точки её объявления и только в ближайших к ней фигурных скобках т.е:
    {
    boolean a1;//начало существования a1
    {
    boolean a2;//начало существования a2
    {
    //трататата
    }
    }//за этими скобками a2 не существует
    }//за этими скобками a1 не существует
    При этом если вернуться каким-либо хитрым способом в скобку, где была переменная, её уже там не будет. Вернее её значения т.к. это будет уже другая переменная с таким же названием.
    Надеюсь расписал достаточно понятно. В Вашем случае переменные нужно объявлять внутри класса, а не метода т.к. все переменные метода при его завершении удаляются.
     
    GodlikE likes this.
  9. ptnk

    ptnk Старожил Пользователь

    Trophy Points:
    173
    Вот опять, вместо того, чтобы человек пошёл и прочитал немного обучающей литературы - вы его подкармливаете кусочками, огрызками - в уме у него мало чего прибавиться, да и сам анализировать и думать он явно не научиться.
    Ведь про видимость переменных - это несколько страничек.

    + Ко всему здесь явное не понимание базовых основ, явно нет понимания, как код выполняется и почему эклипс ругается. Если уж никак нельзя понять от чего же тут ошибка:
    Code:
      double locx;
                 player.getLocation().setX(locx); 
    А ведь ошибка вполне информативная и отображает всю суть, нужно ведь её просто осмыслить и запомнить.
     
    Last edited: May 11, 2014
    Gentalion likes this.
  10. Ission

    Ission Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    lokivava
    Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка. Тогда появится понимаение многих интересных вещей. Я отчасти согласен с Вашим мнением, но так же я понимаю, что если человек задал вполне конкретный вопрос, то ждёт на него вполне конкретный ответ, а не отсылку к "почитай книжку". Да даже если так, то почему бы не написать какую книжку почитать? Вот я ни разу ничего из литературы кроме справочников по языкам не читал, потому порекомендовать книжку не могу.
     
    Iggi and Gentalion like this.
  11. Gentalion

    Gentalion Активный участник Пользователь

    Trophy Points:
    93
    Имя в Minecraft:
    Gentalion

    1. Прочтите http://wiki.bukkit.org/Plugin_Tutorial
    2. Прочтите http://jd.bukkit.org/rb/apidocs/
    После выполнения этих трёх несложных шагов вы сможете делать плагины для Bukkit. Профит.
     
    kirill2011s likes this.
  12. kris13

    kris13 Активный участник Пользователь

    Trophy Points:
    78
    Простите, но что вы рекомендуете С или С++, обращаю ваше внимание, что это разные языки, и уж изучать С++ без компиляторных подсказок настоящий мазохизм. Второе в каком объеме и зачем? Проводить аналогии? Так чем хуже по нормальному изучить джаву, а потом если есть необходимость С и\или С++.
     
  13. ptnk

    ptnk Старожил Пользователь

    Trophy Points:
    173
    А для чего эта тема?
    http://www.rubukkit.org/threads/Помощь-в-изучении-языка-java.17535/

    Кто книги не читал, тот очень много в своих знаниях имеет дыр, которые легко находятся.

    В данном случае вы берёте и кормите человека из ложечки, а я беру и указывают название темы, которую нужно почитать в любом из источников (интернет, Шилд, Философия java) - везде этот момент упоминается и даже объясняется, при чём более качественно и подробно нежели те 20 строчек, которые попытались этот момент объяснить.
     
    Last edited: May 11, 2014
  14. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    ТС от этого с ума сойдет :D у него с Java не очень клеится, а тут...

    Приведу немного пояснений:

    player.getLocation()
    Эта функция получает текущую позицию игрока. В этом объекте хранятся x, y, z, мир, поворот и наклон.
    Эта позиция отражает только текущее состояние. Если мы изменим x,y,z или что-то еще - игрок не переместится.
    Чтобы переместить игрока, нужно использовать метод player.teleport(location)
    Code:
    Location loc = player.getLocation(); // получить текущую позицию игрока
    loc.setY( loc.getY() + 10.0 ); // переместить эту позицию вверх
    player.teleport(loc); // телепортировать игроку в эту позицию
    Покажите, откуда взяли такой пример:
    if(cmd.getName().equalsIgnoreCase("joingreen")) ...
    Лучшей практикой считается регистрировать по одному CommandExecutor'у на каждую команду. Тогда не нужно будет сравнивать имена команд.
    Если принцип работы CommandExecutor'ов одинаковый, то все равно создайте для каждой команды свой. А отличительные параметры можно передать через конструктор:
    getCommand("joinred").setExecutor(new myExecutor("red"));
    getCommand("joingreen").setExecutor(new myExecutor("green"));
     
  15. Ission

    Ission Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    lokivava
    А что больше по духу подходит. Компиляторные подсказки я не исключал, я имел ввиду, что без подсказок IDE. В объёме достаточном для понимания основных принципов программирования, а так же контроля за памятью, я считаю это важным. Java на первый взгляд достаточно лёгкий и простой язык, многие так и не снимают эти очки, после чего появляются различные монструозные конструкции, которые возникать вообще не должны. Например тот же gc, если вообще всё на него скидывать можно остаться без памяти. Тот, кто может познать C/C++, тот может познать Java, а наоборот бывает в сотни раз реже.
    Довайте представим ситуацию: нам нужно поменять например выключатель света в комнате с двумя проводами. У нас есть несколько путей решения этой проблемы: заплатить электрику, подумать головой и заменить самим, закончить курсы на электрика и всё-таки поменять самим. Если Вы не планируете как-либо связывать в дальнейшим с этим жизнь, то Вы не выберите второй вариант, да и денег на нулевой вариант Вам я думаю будет жалко и Вы спокойно воспользуетесь первым вариантом. Так о чём это я? А я о том, что если нужно реализовать маленькую плюшечку, которая будет реализована и вы о ней забудете, достаточно чрезвычайно поверхностных знаний и не нужно углу****ься.
     
    DPOH-VAR and Gentalion like this.
  16. ptnk

    ptnk Старожил Пользователь

    Trophy Points:
    173
    Если человек начал что-то программировать - это значит, что он готов изучить хотя бы базы программирования, точно так же, как и с выключателем света - нужно знать основы, чтобы не было короткого замыкания, что мощности хватило, провод не перегорел. Здесь я считаю "видимость переменных" азами, а не углублением. Если это для вас углубление знаний, то мне здесь делать нечего и мне очень грустно.

    Мне тут интересно, что же там за такие "монструозные конструкции"? Можно пример привести?
     
    Last edited: May 11, 2014
  17. kris13

    kris13 Активный участник Пользователь

    Trophy Points:
    78
    Ну вы давите на самое знаменитое место java, и как многие говорят "в java нет возможности контроля памяти". Если вы хотите минималистичные по памяти программы и у вас все очень плохо с памятью конечно, С или С++ с их контролем выделяемой памяти далеко впереди. Но конкретно тут на этом форуме люди не пишут плагинов для микроволновок или роутеров, а для серверов. Им не нужно задумываться над тем, что координаты можно хорошо хранить массивом примитивов, они могут создать класс Point и следовать ООП. Автор же данной темы совершил ошибку уровня азов понимая, что же вообще он пишет, и если сказать что он изучил Java, то изучив так же C или C++ проблема ни как не решится.
    P.S. я не говорю, что язык C или С++ плохой и не нужный. JNI никто не отменял, кроме того я сам изучил С++ раньше чем Java, а перед С++ кстати был Pascal тоже очень хороший язык с строгим компилятором, который не позволит написать много ереси.
     
    GodlikE likes this.
  18. Ission

    Ission Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    lokivava
    Тоесть Вы при замене выключателя т.к. он не подходит под интерьер меняете проводку? К тому же электрик тоже не заменит выключатель, если Вы его до этого не купите. Я привёл не правильную аналогию. Вы всё так же не можете понять мою точку зрения, тем не менее я желаю завершить полемику или перейти в другую ветку форума, более подходящую для этого.
     
    fromgate likes this.
  19. Автор темы
    GodlikE

    GodlikE Старожил Пользователь

    Trophy Points:
    103
    Имя в Minecraft:
    GodlikE
    Вот этому чуваку отдельное спасибо за то, что он реально разъяснил, а не послал читать учебники и т.п=)
    И этому парню тоже большое спасибо, за то, что разъяснил про видимость переменных=) Я это и раньше знал, просто не вспомнил и вовремя не применил здесь=)
     
    fromgate and serega6531 like this.

Share This Page