Java - Отскок мяча от снаряда - Как я могу изменить вертикальную скорость? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь отскочить мяч в Java, но я пытаюсь понять, как обратить вспять вертикальную составляющую скорости шара, когда он попадает в область просмотра.Моя главная проблема (которая может быть глупой) заключается в том, что я не понимаю, как направления компонента скорости (в данном случае) влияют на общую скорость, когда формула скорости возводит в квадрат отрицательные значения.Спасибо за помощь.

В настоящее время я перезагружаю снаряд со смещением, когда он попадает в область просмотра, но это имеет проблему с неправильными углами.

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;

public class Trajectory5 extends JComponent {
private static final long serialVersionUID = 1L;

Timer timer; double x; double y; double vy; double vx;
double t = 0; double a = 70; double v = 40;
double offsetx = 0; double offsety = 400;
double xmult = 0;

public Trajectory5() {
    setFocusable(true);
    timer = new Timer(1, new TimerCallback()); 
    timer.start();}

    @Override
    public void paintComponent(Graphics g) {
        g.fillOval((int) x, (int) y, 10, 10);
    }

    protected class TimerCallback implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            t += .01;
            x = ((int) v*Math.cos(Math.toRadians(a)) * t + offsetx) + -xmult;
            y = getHeight() - ((int) v * Math.sin(Math.toRadians(a)) * t-.5 * 9.8 * (Math.pow(t, 2))) - offsety;
            vy = v * Math.sin(Math.toRadians(a)) - (t * 9.8);
            vx = v * Math.cos(Math.toRadians(a));

            System.out.println(vy + " " + vx);

            if (y > getHeight()) {
                offsetx = x;
                offsety = 0;
                v = Math.sqrt(Math.pow(vx, 2)+Math.pow(vy, 2));
                t = 0;
            }
            repaint();
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame(); frame.setSize(1000, 800);
        Trajectory5 canvas = new Trajectory5();
        frame.add(canvas); frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Так что проблема здесь действительно структурная, вы делаете ее более сложной, чем она должна быть.Это на самом деле больше математика, чем вопрос программирования.

Ваши координаты x и y начинаются с определенной позиции, а затем вы должны отрегулировать ее на основе определенного фактора.Вы будете регулировать положение на основе а).Скорость в то время и в).произвольная дробь, основанная на том, какие единицы измерения вы используете

Чтобы пройти все эти шаги, это действительно зависит от того, что вы делаете, но для простоты, скажем, у вас уже есть вычисления vx и vy (выВы можете понять это сами), ваш actionPerformed будет выглядеть так:

public void a...{
    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();
    ...
}

deltaX и deltaY - это фактическое расстояние, на которое вы собираетесь переместить мяч.Поэтому, чтобы переместить его, мы должны применить его к фактическим переменным x и y.

public void a...{
    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();

    x += deltaX;
    y += deltaY;
}

Это сместит x и y, deltaX и deltaY на расстояние соответственно.Обратите внимание, что если deltaX отрицателен, он будет двигаться влево, а если deltaY отрицателен, он сдвинет его вниз (или вверх, в зависимости от того, что вы считаете отрицательным)

Мы почти закончили, поэтомув этот момент мы должны определить, что getTimeFraction()

public double getTimeFraction(){
    return 1 / iterationsPerSecond;
}

iterationsPerSecond будет определяться как количество небольших движений, которые вы хотите в секунду.

Это охватывает все движенияОднако прямо перед этим вам нужно определить, что такое vx и vy, поэтому ваш конечный результат будет выглядеть примерно так:

public void a...{
    calculateVelocities();

    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();

    x += deltaX;
    y += deltaY;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...