1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

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

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

    Баллы:
    173
    Skype:
    shkurovs
    Как задать игроку 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));
                    }
                }
     
    Последнее редактирование: 5 фев 2014
  2. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
  3. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Не забывайте, что на игрока действует ускорение свободного падения. Устанавливая velocity вы задаете начальную скорость, которая уменьшается каждый тик на 0.08 блока. Соответственное есть Вы задаете velocity = 1, то игрок начинает взлетать со скоростью 1 блок в секунду. Но в через секунду он будет на на 20-м блоке, а ниже и пролетит всего... 6 блоков.

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

    P.S. Мои рассуждения - теоретические. Я не замерял скорость не проверял насколько, что-то меняется и как далеко можно пролететь задав велосити (когда было надо просто подбирал требуемо значение). Так что могу и ошибаться.
     
    Последнее редактирование: 5 фев 2014
  4. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Что-то я ничего не понял. Как по этим формулам узнать нужное ускорение?
    Просто мне надо, чтобы velocity высчитывалось само.
     
  5. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    serega6531, я в школе давно учился, но там точно были задачи на тему "из пункта А в пункт Б..." ну и плюс немного физики добавляется.

    Составляете два уравнения, оформляете в виде функции и velocity высчивается "само" ;)
     
  6. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Так какие формулы надо использовать и как?
    ??
     
  7. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Вот смотрите, как я это вижу.
    Есть расстояние: 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 нравится это.
  8. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Спасибо, попробую.
    Но что, если я сам не знаю время, за которое мне нужно пролететь эти блоки?
     
    ПриветОтЛайки нравится это.
  9. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    serega6531, тогда решай систему уравнений с двумя неизвестными, у которых кстати может быть несколько решений :)
     
  10. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А вот так можно:

    Код:
        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 - количество блоков
     
  11. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ты так человека к ГИА/ЕГЭ подготовишь
     
    ПриветОтЛайки нравится это.
  12. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Сделал. Velocity 180 - многовато.
    А в каком порядке в уравнении действия?
     
  13. Hilgert

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

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    Попробуй:
    Vector v = e.getPlayer().getLocation().getDirection();
    e.getPlayer().setVelocity(v.add(new Vector(0,0.8,0)));
    То что красным - то и изменяй.
     
  14. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А то я не так делаю!
     
  15. Hilgert

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

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    В чём проблема? =)
    У меня всё работает.
     
  16. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Я так и делаю.
     
  17. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Вы читаете сначала?

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


    Лучше все переменные объявлять сразу в 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;
        }
     
  18. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Вот только это не работает. Дает огромную отрицательную velocity.
     
  19. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    power сколько задаете?
     
  20. Автор темы
    serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Столько, сколько блоков надо пролететь.
    Up!
    @fromgate ??
    Up!
     

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