渲染循环启动后,libgdx中的一次性线程



是否可以在render方法之后仅运行一次线程,因为render循环将在每次迭代中调用它。这是我的帖子:

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();
}

使用线程来设置精灵的动画是个坏主意,因为它将与渲染线程去同步。

您可能不希望为该任务避免线程。您可以创建一个扩展Sprite的类,并编写一些代码,在draw方法中逐步更改Sprite的比例。

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);
}
}

然后在MySprite中使用scaleTo()scaleBy()方法。。。

@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
}

最新更新