Не может изменить направление мяча, не испортив гравитацию - PullRequest
0 голосов
/ 04 декабря 2018

Я играю в игру, похожую на понг, за исключением того, что есть только одно весло, и мяч движется снарядом.Цель состоит в том, чтобы удерживать мяч на мяче как можно дольше.Когда мяч попадает в лопатку, направление компонента y скорости меняется на знак.Проблема в том, что когда шар движется вверх, гравитация действует в этом направлении, ускоряя его.Код ниже

Это код для моего класса мячей, это метод тиков, который вызывается 60 раз в секунду

public Ball(double x, double y, Game game) {
    super(x,y);
    this.game=game;
}
public void tick() {
        time+=1.0/60.0;
        if(x<=0)
            xreflection=1.0;
        else if(x>=Game.Width-15)
            xreflection=-1.0;
        if(y<=0)
            yreflection=1.0;
        else if(y>=Game.Height-15)
            gameover=1;//different variable here as I use this to end the game if the ball hits the bottom of the screen
    x+=traj.xvel()*xreflection;
    y-=traj.yvel(time)*yreflection;

    if(Physics.Collision(this, game.getP())) {
    time=2;
        System.out.println("Collision");
        yreflection=-1;

    }

}

Это мой класс траектории мяча, который обрабатывает всематематика для этого

public double xvel() {
    double xvelo=initvel*Math.cos(Math.toRadians(theta));
    return xvelo;
}

public double yvel(double time) {
    double yvelo;
        yvelo=initvel*Math.sin(Math.toRadians(theta))-(9.8*time);
    return yvelo;
}

И я попытался использовать выражение if с y-отражением, чтобы сделать 9.8 отрицательным, когда yreflection равно 1, и положительным, когда оно равно -1.

1 Ответ

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

вы на самом деле не делаете отражение ... чтобы отразить по большой оси, вы должны отменить соответствующую координату вектора скорости (и исправить положение). Я не вижу такого поведения в вашем коде.Вместо этого ваша скорость y не имеет знака независимо от направления вверх / вниз, поэтому вы просто добавляете гравитацию в соответствии с ней ... для исправления либо переписываете код, либо добавляете yreflection в свой код, связанный с гравитацией ... также вы получили тета?Я ожидал бы, что угол только при первой стрельбе

см.

Вот небольшой пример C ++ с воздушным трением:

//---------------------------------------------------------------------------
double pos[2],vel[2],acc[3],r;  // ball
double x0,y0,x1,y1;             // walls
//---------------------------------------------------------------------------
void ball_update(double dt)
    {
    int i;
    double v,k=0.0001,g=9.81;
    dt*=10.0;                                   // time multiplier for simulation speed ...
    // compute driving force/acceleration
    v=sqrt((vel[0]*vel[0])+(vel[1]*vel[1]));    // |vel|
    acc[0]=  -(k*vel[0]*v);                     // gravity + air friction (k*vel^2)
    acc[1]=+g-(k*vel[1]*v);
    // Newton/D'Alembert simulation
    for (i=0;i<2;i++) vel[i]+=acc[i]*dt;
    for (i=0;i<2;i++) pos[i]+=vel[i]*dt;
    // colision/reflect
    if (pos[0]<x0+r){ pos[0]=x0+r; vel[0]=-vel[0]; }
    if (pos[0]>x1-r){ pos[0]=x1-r; vel[0]=-vel[0]; }
    if (pos[1]<y0+r){ pos[1]=y0+r; vel[1]=-vel[1]; }
    if (pos[1]>y1-r){ pos[1]=y1-r; vel[1]=-vel[1]; }
    }
//---------------------------------------------------------------------------
void ball_init()
    {
    Randomize();
    pos[0]=0.5*(x0+x1);
    pos[1]=0.5*(y0+y1);
    double a=2.0*M_PI*Random(),v=50.0;
    vel[0]=v*cos(a);
    vel[1]=v*sin(a);
    r=20.0;
    }
//---------------------------------------------------------------------------

Моя система координат (0,0) - это верхний левый угол, и x указывают вправо, а y указывает вниз ... Чтобы использовать это простоинициализируем стены x0,y0,x1,y1, вызываем ball_init(), а затем в некотором таймере вызываем ball_update(dt) и визуализируем шарик на pos и радиусе r ...

Вот как это выглядит:

preview

PS. Вам необходимо настроить такие параметры, как время дельты dt, ускорения или добавить масштаб в пикселях в соответствии с вашими потребностями... Вам нужно, чтобы все устройства были совместимы ... Я рекомендую использовать SI (м, м / с, м / с ^ 2, с, N, ..), поэтому вам также нужно решить, насколько великав пикселях (в метрах)

...