Как я могу заставить мое изображение подпрыгивать вдоль оси X? - PullRequest
1 голос
/ 13 октября 2011

У меня есть изображение, которое движется горизонтально с заданной скоростью в течение времени дельта (DT). Но проблема в том, что изображение не отскакивает, когда оно достигает конца размера мира. Как я могу заставить изображение отскочить назад, чтобы оно оставалось в мире?

Подойдет любая помощь.

Вот что я пробовал до сих пор:

@Override
public void move(long dt)
{
    // v = dx / dt
    //   dx m = v m/s  . dt s

    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;


    double left_wall = 0;
    double right_wall = board.x1_world;

    if (x <= right_wall)
    {
        x += dx_m;
        if (x >= right_wall)
        {

            x = right_wall;
           x *= -dx_m;
        }
    }
}

Ответы [ 3 ]

1 голос
/ 13 октября 2011
    @Override
public void move(long dt)
{
    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;


    double left_wall = 0;
    double right_wall = board.x1_world;

    x += dx_m;
    if (x <= 0) speed *= -1.0;
    if (x >= right_wall) speed *= -1.0;
}

Когда координата x ваших изображений достигает границы, просто измените ориентацию горизонтальной скорости (умножьте ее на -1). Но вы должны использовать такое условие:

if (x >= (right_wall - width_of_image)) speed *= -1.0;

Вместо просто x >= right_wall, потому что при этом изображение отскочит, когда оно "коснется" конца света.

1 голос
/ 14 октября 2011

В дополнение к проверке каждого конца по отдельности, как предлагает @Oscar, вам может потребоваться учитывать конечную ширину изображения, как показано в этом Subway моделировании.

0 голосов
/ 13 октября 2011
private boolean goleft=false;//keep direction
@Override
public void move(long dt)
{
    // v = dx / dt
    //   dx m = v m/s  . dt s

    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;

    double left_wall = 0;
    double right_wall = board.x1_world;

    if(goleft)x += dx_m;
    else x-= dx_m;

    if (x >= right_wall)//touching 1 wall
    {
        x = right_wall;
        x += dx_m;
        goleft=true;
    }else if(x<=left_wall){//touching the other wall
        x = left_wall;
        x += dx_m;
        goleft=false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...