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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем GodlikE, 11 май 2014.

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

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Всем привет=) Кому не трудно, помогите мне расставить все точки над И по поводу переменных, взятых из разных методов. Допустим у меня есть вот такой код:
    Код:
    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 Старожил Пользователь

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

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

    Баллы:
    173
    Код:
      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 и GodlikE нравится это.
  5. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    [DOUBLEPOST=1399799529,1399799492][/DOUBLEPOST]
    Спасибо=)[DOUBLEPOST=1399800192][/DOUBLEPOST]
    Сделал так, как ты сказал, но Эклипс все равно видит ошибку=)
    Код:
    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 Активный участник Пользователь

    Баллы:
    93
    Имя в Minecraft:
    Gentalion
    Не легче ли телепортировать игрока?
     
    makssof нравится это.
  7. kirill2011s

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

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

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

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

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

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

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

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

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

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

    Баллы:
    93
    Имя в Minecraft:
    Gentalion

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

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

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

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

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

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

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

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

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

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

    player.getLocation()
    Эта функция получает текущую позицию игрока. В этом объекте хранятся x, y, z, мир, поворот и наклон.
    Эта позиция отражает только текущее состояние. Если мы изменим x,y,z или что-то еще - игрок не переместится.
    Чтобы переместить игрока, нужно использовать метод player.teleport(location)
    Код:
    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 Старожил Девелопер Пользователь

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

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

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

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

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

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

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

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

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

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

Поделиться этой страницей