Один раз поток в libgdx после запуска рендера l oop - PullRequest
0 голосов
/ 11 апреля 2020

Возможно ли запустить поток сразу после метода render только один раз, так как render l oop будет вызывать его на каждой итерации. Это моя тема:

    new Thread(new Runnable() {
        float time=0;
        @Override
        public void run() {
            while(redPos<10) {
                time += Gdx.graphics.getDeltaTime();
                redPos+=(int)time;
            }
        }
    }).start();

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

Обновление: я получил его, сместив инкремент redPos для метода рендеринга следующим образом -

float time = 0;
void render(){
    if(redPos<10){
        time += Gdx.graphics.getDeltaTime();
        redPos+=(int)time;
    }
    batch.begin();
    batch.draw(ball, redPos, 5);
    batch.end();
}

Использование Thread для анимации спрайта было плохой идеей, так как будет обработан потоком рендеринга.

1 Ответ

0 голосов
/ 12 апреля 2020

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

public class MySprite extends Sprite {


    private boolean doScale;
    private float   scaleBy;
    private float   scaleTime;
    private float   timeElapsed;
    private float   progress;
    private float   lastProgress;

    public MySprite(Texture texture) {
        super(texture);
    }

    public void scaleTo(float scaleTo, float time){
        scaleBy(scaleTo - getScaleX(),time);
    }

    public void scaleBy(float scaleBy, float time){
        this.scaleBy = scaleBy;
        doScale = true;
        scaleTime = time;
        timeElapsed = 0;
        lastProgress = 0;

        setOriginCenter();
    }

    @Override
    public void draw(Batch batch) {
        if(doScale){
            timeElapsed += Gdx.graphics.getDeltaTime();
            progress = timeElapsed/scaleTime;
            progress = progress > 1?1: progress;

            float progressDelta = progress - lastProgress;
            float scaleBy =  this.scaleBy *progressDelta;
            setScale(getScaleX()+scaleBy,getScaleY()+scaleBy);

            lastProgress = progress;

            if(progress == 1)
                doScale = false;
        }
        super.draw(batch);
    }
}

Затем используйте метод scaleTo() или scaleBy() в MySprite ...

    @Override
    public void create () {
        ...
        ...
        ...

        mySprite = new MySprite(texture);
        mySprite.scaleTo(2,1);//Scale to 200% in 1 seconds
    }

Хотя libGdx уже предоставляет Actions для этого, вы можете рассмотреть возможность использования Actor

    @Override
    public void create () {
        ...
        ...
        ...

        imageActor = new Image(texture);
        imageActor.addAction(Actions.scaleTo(2,2,1));//Scale to 200% in 1 seconds
    }

...