我正在尝试使用MoveToAction,RotateToAction和ScaleToAction进行精灵移动,旋转和调整大小。前两个工作正常,但我有ScaleToAction的问题。 我将动作添加到Actor,就像我对两个有效的动作一样。我认为问题可能出在@Override上?当我运行代码时,精灵移动并旋转,但不进行缩放。
我尝试使用sprite.setscale,如下面的答案所示,但仍然没有运气。我在这里添加了类中的代码:
public class Prizes extends Actor {
private LearnToRead game;
private TextureAtlas atlas;
private TextureRegion prizepic;
private Sprite sprite;
private RotateToAction rta;
private ScaleToAction sta;
private MoveToAction mta;
public Prizes(LearnToRead game) {
this.game = game;
atlas = new TextureAtlas("prizes.pack");
prizepic = atlas.findRegion("haxhatt");
sprite = new Sprite(prizepic);
sprite.setPosition(450 - sprite.getWidth() / 2, 450 * Gdx.graphics.getHeight() / Gdx.graphics.getWidth() - sprite.getHeight() / 2);
//setBounds(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
setTouchable(Touchable.enabled);
rta = new RotateToAction();
sta = new ScaleToAction();
mta = new MoveToAction();
rta.setRotation(180f);
sta.setScale(2f);
mta.setPosition(0, 0);
mta.setDuration(5f);
rta.setDuration(5f);
sta.setDuration(5f);
Prizes.this.addAction(rta);
Prizes.this.addAction(sta);
Prizes.this.addAction(mta);
}
@Override
public void draw(Batch batch, float parentAlpha) {
sprite.draw(batch);
}
@Override
public void act(float delta) {
super.act(delta);
}
@Override
protected void positionChanged() {
sprite.setPosition(getX(), getY());
}
@Override
protected void rotationChanged() {
sprite.setRotation(getRotation());
}
@Override
protected void sizeChanged() {
sprite.setScale(getScaleX(), getScaleY());
}
}
如果还尝试删除sprite并只使用TextureRegion,但没有让它工作。纹理被绘制,但不移动。我也发布了这段代码,但我承认我对这段代码很不确定:
public class Prizes extends Actor {
private LearnToRead game;
private TextureAtlas atlas;
private TextureRegion prizepic;
private RotateToAction rta;
private ScaleToAction sta;
private MoveToAction mta;
public Prizes(LearnToRead game) {
this.game = game;
atlas = new TextureAtlas("prizes.pack");
prizepic = atlas.findRegion("haxhatt");
Prizes.this.setBounds(450 - Prizes.this.getX(), Prizes.this.getY(), Prizes.this.getWidth(), Prizes.this.getHeight());
setTouchable(Touchable.enabled);
rta = new RotateToAction();
sta = new ScaleToAction();
mta = new MoveToAction();
rta.setRotation(180f);
sta.setScale(2f);
mta.setPosition(0, 0);
mta.setDuration(5f);
rta.setDuration(5f);
sta.setDuration(5f);
Prizes.this.addAction(rta);
Prizes.this.addAction(sta);
Prizes.this.addAction(mta);
}
@Override
public void draw(Batch batch, float parentAlpha) {
game.batch.begin();
game.batch.draw(prizepic, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
game.batch.end();
}
@Override
public void act(float delta) {
super.act(delta);
}
@Override
protected void positionChanged() {
Prizes.this.setPosition(getX(), getY());
}
@Override
protected void rotationChanged() {
Prizes.this.setRotation(getRotation());
}
@Override
protected void sizeChanged() {
Prizes.this.setScale(getScaleX(), getScaleY());
}
}
也许有人对我做错了什么有个好主意?
答案 0 :(得分:0)
使用sprite.setScale
代替sprite.scale
。区别在于您将其设置为特定值,而不是将当前比例乘以某个值。
但是使用Sprite和Actor是多余的,因为两个类都存储位置,旋转,缩放和颜色。使用带有Actor的TextureRegion更有意义。或者您可以使用Image类,它已经为您处理了这个问题。
编辑:
我看到问题的另一部分。您正在覆盖sizeChanged
,但这是您使用ScaleToAction更改的比例,而不是大小。 Actor没有缩放更改的回调。您可以覆盖setScale
方法以将更改应用于Sprite,但正如我上面所说,为此使用Sprite是没有意义的。您应该引用TextureRegion,并使用draw()
方法中的所有适当参数绘制它。