2016-08-09 4 views
0

Я новичок в Java и Android. Недавно я пытался создать игру для Android с помощью LibGDX. Один из аспектов этой игры включает в себя перемещение человека с одной стороны экрана на другую (по горизонтали). Это мой код для человека: `Мгновенное изменение скорости LibGDX

public class Man { 
    private static final int SP = 10; 
    private static final int NSP = -10; 
    private Vector3 position; 
    private Vector3 velocity; 
    private Texture man; 

    public Man(int x, int y){ 
     position = new Vector3(x, y, 0); 
     velocity = new Vector3(0, 0, 0); 
     man = new Texture ("person.png"); 

    } 

    public void update(float dt){ 
     if (position.x > 2560) { 
      velocity.add(NSP, 0, 0); 
     } 
     else { 
      velocity.add(SP, 0, 0); 
     } 
     velocity.add(SP, 0, 0); 
     velocity.scl(dt); 
     position.add(velocity.x, 0, 0); 
     velocity.scl(1/dt); 
    } 

    public Texture getTexture() { 
     return man; 
    } 

    public Vector3 getPosition() { 
     return position; 
    } 

    public void dispose(){ 
     man.dispose(); 
    } 

} 

Я до сих пор не привык к решению таких проблем. Когда я запускаю этот код, человек идет с одной стороны экрана (слева) и мимо другой стороны экрана (справа, вне поля зрения). Через секунду или два человек возвращается в поле зрения (с правой стороны) и идет на другую сторону экрана (слева, и остается в поле зрения). Затем этот процесс повторяется. Кроме того, когда человек начинает двигаться, ему требуется секунда, чтобы добраться до полной скорости. Я попытался удалить инструкции if else и создать 2 человека с разными скоростями (один с положительным и один с отрицательным), чтобы создать иллюзию, что человек мгновенно меняет скорость (удаляя одного человека и не создавая другого), но я не был в состоянии сделать это.

Я хотел бы знать, как я мог заставить человека мгновенно добраться до полной скорости, мгновенно изменить скорость на другой стороне экрана и продолжить этот процесс в цикле. Любая помощь приветствуется. Спасибо.

ответ

1

Пройдите через свой код и подумайте о логике.

Вы следуете за инструкцией if-else, всегда добавляя SP к скорости. Так эффективно, вы можете комбинировать, что математику с вашей, если-то еще, в результате чего в этом эквиваленте:

if (position.x > 2560) { 
     velocity.add(0, 0, 0); 
    } 
    else { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

или более просто:

if (position.x <= 2560) { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

Таким образом, вы всегда ускоряющее на 2 * SP на каждом кадре, если вы не находитесь на экране, и в этом случае ваша скорость перестает увеличиваться, но вы по-прежнему приближаетесь вправо, за пределами экрана.

Если вы хотите мгновенно изменить скорость, вам нужно установить ее на определенное значение, а не добавлять к ней что-то. Я бы также рекомендовал не масштабировать и не масштабировать ваш вектор, потому что это могло бы начать вводить ошибку округления. Вот как заставить вашего персонажа пинг-понг с левой и правой сторон экрана.

public void update(float dt){ 
    if (velocity.x == 0) 
     velocity.x = SP; //first frame setup 

    //only change the velocity if character is off screen, otherwise leave it alone 
    if (position.x > 2560) 
     velocity.x = NSP; 
    else if (position.x < 0 - texture.getWidth()) 
     velocity.x = SP; 

    position.add(velocity.x * dt, 0, 0); 
} 

Обратите внимание, я использовал texture.getWidth() в качестве заполнителя для любой ширины вашего персонажа. Действительно, плохой практикой является загрузка такого актива, как текстура внутри вашего класса игрока. Вы смешиваете активы с логикой своей игры, которая является рецептом для кода, который будет подвержен ошибкам и его трудно поддерживать. Лучше всего использовать класс менеджера активов для загрузки и хранения всех ваших активов. Метод рисования вашего персонажа может взять диспетчер активов в качестве параметра и выбрать его ссылку на ресурсы. Например:

public void draw (SpriteBatch batch, MyAssets assets){ 
    TextureRegion region = assets.getRegion("man"); //imaginary assets class--implementation up to you 
    batch.draw(region, x, y); 
} 
+0

Спасибо !!!!!! –

Смежные вопросы