是否可以在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
}