Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Нужное velocity

serega6531

Старожил
Девелопер
Пользователь
Баллы
173
Как задать игроку velocity, чтобы он подлетел на нужное мне количество блоков? Если подбирать, то при нормальном подлёте на одно количество блоков, он подлетает мало на другое. Вот мой код сейчас:

Код:
           if(b.getType() == Material.WOOL && b.getData() == 14){
                Location blocation = b.getLocation();
                if(blocation.add(0,1,0).getBlock().getType() == Material.FENCE){
                    int power = 0;
                    while(true){
                        blocation = blocation.add(0, 1, 0);
                        if(blocation.getBlock().getType() == Material.FENCE){
                            power++;
                        } else {
                            break;
                        }
                    }
                    e.getPlayer().setVelocity(new Vector(0, 0.21 * power, 0));
                }
            }
 
Последнее редактирование:
Не забывайте, что на игрока действует ускорение свободного падения. Устанавливая velocity вы задаете начальную скорость, которая уменьшается каждый тик на 0.08 блока. Соответственное есть Вы задаете velocity = 1, то игрок начинает взлетать со скоростью 1 блок в секунду. Но в через секунду он будет на на 20-м блоке, а ниже и пролетит всего... 6 блоков.

Формулы смотрим тут: http://minecraft.gamepedia.com/Transportation

P.S. Мои рассуждения - теоретические. Я не замерял скорость не проверял насколько, что-то меняется и как далеко можно пролететь задав велосити (когда было надо просто подбирал требуемо значение). Так что могу и ошибаться.
 
Последнее редактирование:
Не забывайте, что на игрока действует ускорение свободного падения. Устанавливая velocity вы задаете начальную скорость, которая уменьшается каждый тик на 0.08 блока. Соответственное есть Вы задаете velocity = 1, то игрок начинает взлетать со скоростью 1 блок в секунду. Но в через секунду он будет на на 20-м блоке, а ниже и пролетит всего... 6 блоков.

Формулы смотрим тут: http://minecraft.gamepedia.com/Transportation

P.S. Мои рассуждения - теоретические. Я не замерял скорость не проверял насколько, что-то меняется и как далеко можно пролететь задав велосити (когда было надо просто подбирал требуемо значение). Так что могу и ошибаться.
Что-то я ничего не понял. Как по этим формулам узнать нужное ускорение?
когда было надо просто подбирал требуемо значение
Просто мне надо, чтобы velocity высчитывалось само.
 
serega6531, я в школе давно учился, но там точно были задачи на тему "из пункта А в пункт Б..." ну и плюс немного физики добавляется.

Составляете два уравнения, оформляете в виде функции и velocity высчивается "само" ;)
 
serega6531, я в школе давно учился, но там точно были задачи на тему "из пункта А в пункт Б..." ну и плюс немного физики добавляется.

Составляете два уравнения, оформляете в виде функции и velocity высчивается "само" ;)
Так какие формулы надо использовать и как?
serega6531, я в школе давно учился, но там точно были задачи на тему "из пункта А в пункт Б..." ну и плюс немного физики добавляется.

Составляете два уравнения, оформляете в виде функции и velocity высчивается "само" ;)
??
 
Вот смотрите, как я это вижу.
Есть расстояние: D, в условиях "невесомости" игрок достигает это расстояние за определенное время при заданном ускорении.

Допустим, нужно пролететь 40 блоков, время берем - 1 секунда, т.е. 20 тиков.

Тогда значение велосити будет равно 40/20=2.

Теперь смотрим на формулу:
d(t) = 3.92 × (99 - 49.50×(0.98t+1) - t)

Мы знаем время - 20 тиков. Если у нас игрок, просто падает за это время он пролетит: 3,92*(99-49,5*(0,98^20+1)-20)=-13,90 блоков.

Т.е. реально игрок окажется не на 40-м блоке, а на 40-14=26.

Как добиться того, чтобы игрок именно долетел до 40-го блока?

У меня мозги начинают скрипеть как несмазанная телега - так давно их не касались какие-либо вычисления сложнее сложения и вычитания ;)

Но я вижу два варианта: составить уравнение с двумя неизвестными время и начальная скорость и плясать от этого.
Второй вариант - считать, что мы хотим долетать до заданной точки за 20 тиков (или десять или сколько Вам нужно).

И составить уравнение по нахождение начального ускорению.

Допустим для нашего примера всё просто. Мы хотим достичь высоты 40 блоков за 1 секунду, при этом знаем, что за секунду игрок "падает" на 14 блоков.

Упрощенно, можно считать так: (40+14)/20=3.2.

По моему так.

И я опять же оговорюсь, я сто лет не решал подобных задач уравнений и пытаюсь рассуждать логически. Если Вам нужно точнее, подними учебники, формулы и т.п.
Я помню нужно было нарисовать окружность (в PlayEffect) так пол интернета перерыл, пока составил алгоритм. А всё потому, что забыл всё чему учили в школе и универе ;)
 
Вот смотрите, как я это вижу.
Есть расстояние: D, в условиях "невесомости" игрок достигает это расстояние за определенное время при заданном ускорении.

Допустим, нужно пролететь 40 блоков, время берем - 1 секунда, т.е. 20 тиков.

Тогда значение велосити будет равно 40/20=2.

Теперь смотрим на формулу:
d(t) = 3.92 × (99 - 49.50×(0.98t+1) - t)

Мы знаем время - 20 тиков. Если у нас игрок, просто падает за это время он пролетит: 3,92*(99-49,5*(0,98^20+1)-20)=-13,90 блоков.

Т.е. реально игрок окажется не на 40-м блоке, а на 40-14=26.

Как добиться того, чтобы игрок именно долетел до 40-го блока?

У меня мозги начинают скрипеть как несмазанная телега - так давно их не касались какие-либо вычисления сложнее сложения и вычитания ;)

Но я вижу два варианта: составить уравнение с двумя неизвестными время и начальная скорость и плясать от этого.
Второй вариант - считать, что мы хотим долетать до заданной точки за 20 тиков (или десять или сколько Вам нужно).

И составить уравнение по нахождение начального ускорению.

Допустим для нашего примера всё просто. Мы хотим достичь высоты 40 блоков за 1 секунду, при этом знаем, что за секунду игрок "падает" на 14 блоков.

Упрощенно, можно считать так: (40+14)/20=3.2.

По моему так.

И я опять же оговорюсь, я сто лет не решал подобных задач уравнений и пытаюсь рассуждать логически. Если Вам нужно точнее, подними учебники, формулы и т.п.
Я помню нужно было нарисовать окружность (в PlayEffect) так пол интернета перерыл, пока составил алгоритм. А всё потому, что забыл всё чему учили в школе и универе ;)
Спасибо, попробую.
Но что, если я сам не знаю время, за которое мне нужно пролететь эти блоки?
 
serega6531, тогда решай систему уравнений с двумя неизвестными, у которых кстати может быть несколько решений :)
 
serega6531, тогда решай систему уравнений с двумя неизвестными, у которых кстати может быть несколько решений :)
А вот так можно:

Код:
    private double getNewVelocity(int power){
        final int blocksInSec = 3;
        final int timeForFly = (power / blocksInSec) * 20;
        final int blocksInTime = (int) (3.92 * (99 - 49.50 * (0.98* timeForFly + 1) - timeForFly));
        return (power + blocksInTime)/timeForFly;
    }
?
blocksInSec - сколько пролететь блоков в секунду
power - количество блоков
 
А вот так можно:

Код:
    private double getNewVelocity(int power){
        final int blocksInSec = 3;
        final int timeForFly = (power / blocksInSec) * 20;
        final int blocksInTime = (int) (3.92 * (99 - 49.50 * (0.98* timeForFly + 1) - timeForFly));
        return (power + blocksInTime)/timeForFly;
    }
?
blocksInSec - сколько пролететь блоков в секунду
power - количество блоков
Сделал. Velocity 180 - многовато.
А в каком порядке в уравнении действия?
 
Попробуй:
Vector v = e.getPlayer().getLocation().getDirection();
e.getPlayer().setVelocity(v.add(new Vector(0,0.8,0)));
То что красным - то и изменяй.
 
В чём проблема? =)
У меня всё работает.

Вы читаете сначала?

Задача стоит именно в вычислении параметра для того чтобы игрок пролетел необходимое количество блоков.


А вот так можно:

Код:
    private double getNewVelocity(int power){
        final int blocksInSec = 3;
        final int timeForFly = (power / blocksInSec) * 20;
        final int blocksInTime = (int) (3.92 * (99 - 49.50 * (0.98* timeForFly + 1) - timeForFly));
        return (power + blocksInTime)/timeForFly;
    }
?
blocksInSec - сколько пролететь блоков в секунду
power - количество блоков

Лучше все переменные объявлять сразу в double. А то математика с разными типами у меня всегда приводила к странным результатам ;)

Например, так:

Код:
    private double getNewVelocity(double power){
        double blocksInSec = 3;
        double timeForFly = (power / blocksInSec) * 20;
        double blocksInTime = (3.92 * (99 - 49.50 * (0.98* timeForFly + 1) - timeForFly));
        return (power + blocksInTime)/timeForFly;
    }
 
Вы читаете сначала?

Задача стоит именно в вычислении параметра для того чтобы игрок пролетел необходимое количество блоков.




Лучше все переменные объявлять сразу в double. А то математика с разными типами у меня всегда приводила к странным результатам ;)

Например, так:

Код:
    private double getNewVelocity(double power){
        double blocksInSec = 3;
        double timeForFly = (power / blocksInSec) * 20;
        double blocksInTime = (3.92 * (99 - 49.50 * (0.98* timeForFly + 1) - timeForFly));
        return (power + blocksInTime)/timeForFly;
    }
Вот только это не работает. Дает огромную отрицательную velocity.
 

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

Назад
Верх