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

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

Иди читай учебник по java, а в особенности про область видимости переменных, там ты найдёшь исчерпывающий ответ.
 
Код:
  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();
             //Твой код короч...
         }
}
Где-то так
 

Код:
  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();
             //Твой код короч...
         }
}
Где-то так
Спасибо=)
Код:
  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();
             //Твой код короч...
         }
}
Где-то так
Сделал так, как ты сказал, но Эклипс все равно видит ошибку=)
Код:
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);
 


Спасибо=)

Сделал так, как ты сказал, но Эклипс все равно видит ошибку=)
Код:
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);
Не легче ли телепортировать игрока?
 
Такие вопросы здесь не задаются... Здесь нужно задавать вопросы по Bukkit API и подобным вещам, но не про синтаксис и структуру Java.
 
А всё по тому, что у Вас так работать не будет. Если вы хотите, чтобы по одной команде устанавливались locx/y/z, а по другой ими пользоваться, то Вы должны учитывать один нюанс: переменная существует начиная с точки её объявления и только в ближайших к ней фигурных скобках т.е:
{
boolean a1;//начало существования a1
{
boolean a2;//начало существования a2
{
//трататата
}
}//за этими скобками a2 не существует
}//за этими скобками a1 не существует
При этом если вернуться каким-либо хитрым способом в скобку, где была переменная, её уже там не будет. Вернее её значения т.к. это будет уже другая переменная с таким же названием.
Надеюсь расписал достаточно понятно. В Вашем случае переменные нужно объявлять внутри класса, а не метода т.к. все переменные метода при его завершении удаляются.
 
А всё по тому, что у Вас так работать не будет. Если вы хотите, чтобы по одной команде устанавливались locx/y/z, а по другой ими пользоваться, то
...
При этом если вернуться каким-либо хитрым способом в скобку, где была переменная, её уже там не будет. Вернее её значения т.к. это будет уже другая переменная с таким же названием.
Надеюсь расписал достаточно понятно. В Вашем случае переменные нужно объявлять внутри класса, а не метода т.к. все переменные метода при его завершении удаляются.
Вот опять, вместо того, чтобы человек пошёл и прочитал немного обучающей литературы - вы его подкармливаете кусочками, огрызками - в уме у него мало чего прибавиться, да и сам анализировать и думать он явно не научиться.
Ведь про видимость переменных - это несколько страничек.

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

+ Ко всему здесь явное не понимание базовых основ, явно нет понимания, как код выполняется и почему эклипс ругается. Если уж никак нельзя понять от чего же тут ошибка:
Код:
  double locx;
             player.getLocation().setX(locx);
А ведь ошибка вполне информативная и отображает всю суть, нужно ведь её просто осмыслить и запомнить.
Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка. Тогда появится понимаение многих интересных вещей. Я отчасти согласен с Вашим мнением, но так же я понимаю, что если человек задал вполне конкретный вопрос, то ждёт на него вполне конкретный ответ, а не отсылку к "почитай книжку". Да даже если так, то почему бы не написать какую книжку почитать? Вот я ни разу ничего из литературы кроме справочников по языкам не читал, потому порекомендовать книжку не могу.
 
  1. Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка.


  2. Прочтите http://wiki.bukkit.org/Plugin_Tutorial
  3. Прочтите http://jd.bukkit.org/rb/apidocs/
После выполнения этих трёх несложных шагов вы сможете делать плагины для Bukkit. Профит.
 
Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка.
Простите, но что вы рекомендуете С или С++, обращаю ваше внимание, что это разные языки, и уж изучать С++ без компиляторных подсказок настоящий мазохизм. Второе в каком объеме и зачем? Проводить аналогии? Так чем хуже по нормальному изучить джаву, а потом если есть необходимость С и\или С++.
 
Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка. Тогда появится понимаение многих интересных вещей. Я отчасти согласен с Вашим мнением, но так же я понимаю, что если человек задал вполне конкретный вопрос, то ждёт на него вполне конкретный ответ, а не отсылку к "почитай книжку". Да даже если так, то почему бы не написать какую книжку почитать? Вот я ни разу ничего из литературы кроме справочников по языкам не читал, потому порекомендовать книжку не могу.

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

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

В данном случае вы берёте и кормите человека из ложечки, а я беру и указывают название темы, которую нужно почитать в любом из источников (интернет, Шилд, Философия java) - везде этот момент упоминается и даже объясняется, при чём более качественно и подробно нежели те 20 строчек, которые попытались этот момент объяснить.
 
Последнее редактирование:
Для начала я бы рекомендовал изучить C/C++ с корманным компилятором без конкретных подсказок где ошибка.
ТС от этого с ума сойдет :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"));
 
Простите, но что вы рекомендуете С или С++, обращаю ваше внимание, что это разные языки, и уж изучать С++ без компиляторных подсказок настоящий мазохизм. Второе в каком объеме и зачем? Проводить аналогии? Так чем хуже по нормальному изучить джаву, а потом если есть необходимость С и\или С++.
А что больше по духу подходит. Компиляторные подсказки я не исключал, я имел ввиду, что без подсказок IDE. В объёме достаточном для понимания основных принципов программирования, а так же контроля за памятью, я считаю это важным. Java на первый взгляд достаточно лёгкий и простой язык, многие так и не снимают эти очки, после чего появляются различные монструозные конструкции, которые возникать вообще не должны. Например тот же gc, если вообще всё на него скидывать можно остаться без памяти. Тот, кто может познать C/C++, тот может познать Java, а наоборот бывает в сотни раз реже.
А для чего эта тема?
http://www.rubukkit.org/threads/Помощь-в-изучении-языка-java.17535/
Кто книги не читал, тот очень много в своих знаниях имеет дыр, которые легко находятся.
В данном случае вы берёте и кормите человека из ложечки, а я беру и указывают название темы, которую нужно почитать в любом из источников (интернет, Шилд, Философия java) - везде этот момент упоминается и даже объясняется, при чём более качественно и подробно нежели те 20 строчек, которые попытались этот момент объяснить.
Довайте представим ситуацию: нам нужно поменять например выключатель света в комнате с двумя проводами. У нас есть несколько путей решения этой проблемы: заплатить электрику, подумать головой и заменить самим, закончить курсы на электрика и всё-таки поменять самим. Если Вы не планируете как-либо связывать в дальнейшим с этим жизнь, то Вы не выберите второй вариант, да и денег на нулевой вариант Вам я думаю будет жалко и Вы спокойно воспользуетесь первым вариантом. Так о чём это я? А я о том, что если нужно реализовать маленькую плюшечку, которая будет реализована и вы о ней забудете, достаточно чрезвычайно поверхностных знаний и не нужно углу****ься.
 
Если человек начал что-то программировать - это значит, что он готов изучить хотя бы базы программирования, точно так же, как и с выключателем света - нужно знать основы, чтобы не было короткого замыкания, что мощности хватило, провод не перегорел. Здесь я считаю "видимость переменных" азами, а не углублением. Если это для вас углубление знаний, то мне здесь делать нечего и мне очень грустно.

Мне тут интересно, что же там за такие "монструозные конструкции"? Можно пример привести?
 
Последнее редактирование:
Java на первый взгляд достаточно лёгкий и простой язык, многие так и не снимают эти очки, после чего появляются различные монструозные конструкции, которые возникать вообще не должны. Например тот же gc, если вообще всё на него скидывать можно остаться без памяти.
Ну вы давите на самое знаменитое место java, и как многие говорят "в java нет возможности контроля памяти". Если вы хотите минималистичные по памяти программы и у вас все очень плохо с памятью конечно, С или С++ с их контролем выделяемой памяти далеко впереди. Но конкретно тут на этом форуме люди не пишут плагинов для микроволновок или роутеров, а для серверов. Им не нужно задумываться над тем, что координаты можно хорошо хранить массивом примитивов, они могут создать класс Point и следовать ООП. Автор же данной темы совершил ошибку уровня азов понимая, что же вообще он пишет, и если сказать что он изучил Java, то изучив так же C или C++ проблема ни как не решится.
P.S. я не говорю, что язык C или С++ плохой и не нужный. JNI никто не отменял, кроме того я сам изучил С++ раньше чем Java, а перед С++ кстати был Pascal тоже очень хороший язык с строгим компилятором, который не позволит написать много ереси.
 
Если человек начал что-то программировать - это значит, что он готов изучить хотя бы базы программирования, точно так же, как и с выключателем света - нужно знать основы, чтобы не было короткого замыкания, что мощности хватило, провод не перегорел. Здесь я считаю "видимость переменных" азами, а не углублением. Если это для вас углубление знаний, то мне здесь делать нечего и мне очень грустно.
Тоесть Вы при замене выключателя т.к. он не подходит под интерьер меняете проводку? К тому же электрик тоже не заменит выключатель, если Вы его до этого не купите. Я привёл не правильную аналогию. Вы всё так же не можете понять мою точку зрения, тем не менее я желаю завершить полемику или перейти в другую ветку форума, более подходящую для этого.
 
ТС от этого с ума сойдет :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"));
Вот этому чуваку отдельное спасибо за то, что он реально разъяснил, а не послал читать учебники и т.п=)
А всё по тому, что у Вас так работать не будет. Если вы хотите, чтобы по одной команде устанавливались locx/y/z, а по другой ими пользоваться, то Вы должны учитывать один нюанс: переменная существует начиная с точки её объявления и только в ближайших к ней фигурных скобках т.е:
{
boolean a1;//начало существования a1
{
boolean a2;//начало существования a2
{
//трататата
}
}//за этими скобками a2 не существует
}//за этими скобками a1 не существует
При этом если вернуться каким-либо хитрым способом в скобку, где была переменная, её уже там не будет. Вернее её значения т.к. это будет уже другая переменная с таким же названием.
Надеюсь расписал достаточно понятно. В Вашем случае переменные нужно объявлять внутри класса, а не метода т.к. все переменные метода при его завершении удаляются.
И этому парню тоже большое спасибо, за то, что разъяснил про видимость переменных=) Я это и раньше знал, просто не вспомнил и вовремя не применил здесь=)
 
Назад
Верх