我正在制作一个用箭头射击苹果的游戏。苹果的位置是用户输入的XY位置,箭头参与者必须使用代码actor.moveto移动到该位置。问题是箭头只向用户输入的方向移动一次。我知道当我在update方法中调用stageArrow.act时,actor的moveTo动作每秒更新很多次,所以我想知道为什么箭头只移动一次。这是我的代码:
appleclass.java
public class AppleClass implements Screen {
Arrow arrow;
private final MainApp app;
public Image ShotImage;
public AppleClass(final MainApp app){
this.app = app;
this.stageApple = new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera));
this.stageArrow =new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera));
arrow = new ArrowClass(app);
}
@Override
public void show() {
InputMultiplexer inputMultiplexer = new InputMultiplexer();
inputMultiplexer.addProcessor(stageApple);
inputMultiplexer.addProcessor(stageArrow);
Gdx.input.setInputProcessor(inputMultiplexer);
arrow();
}
public void arrow(){
arrow.isTouchable();
stageArrow.addActor(arrow);
arrow.addAction((moveTo(Gdx.input.getX(),Gdx.input.getY(),0.3f))); //===> only executes once.
arrow.addListener(new InputListener(){
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor){
if (Gdx.input.isTouched()){
ShotImage.setVisible(true);
}
}
});}
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
update(delta);
}
public void update(float deltaTime){
stageApple.draw();
stageArrow.draw();
stageApple.act(deltaTime);
stageArrow.act(deltaTime);
}
ArrowClass.java
public class ArrowClass extends Actor {
MainApp app;
AppleClass appleClass;
public Texture arrowTexture;
public ArrowClass(final MainApp app){
this.app = app;
arrowTexture = new Texture("medievalarrow.png");
this.setSize(arrowWidth, arrowHeight);
this.setTouchable(Touchable.enabled);
this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight);
this.setOrigin(0,0);
}
@Override
public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
final float delta = Gdx.graphics.getDeltaTime();
this.act(delta);
app.batch.begin();
app.batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight());
app.batch.end();
}
}
任何帮助都将受到高度赞赏。感谢。
答案 0 :(得分:1)
我认为问题是因为您在this.act(delta)
'绘制方法中调用了ArrowClass
。当你致电Stage#act()
时,它会为你的所有演员调用act方法。由于您在绘制时调用了一次,而在更新舞台时再次调用它,因此它以正常速度的两倍移动,这可能导致它过早地到达目的地。
关于您的代码的一些其他评论,如果我可以:
首先,你可能不需要两个单独的阶段 - 除非你使用Scene2D.UI,你通常会有一个单独的阶段,Arrow和Apple作为演员添加到它。
其次,当您覆盖Actor#draw()
时,您应该使用它传递给您的批处理而不是使用app中的批处理。您也不想在绘制方法中调用begin()
和end()
- 这些都是“昂贵的”,您只想每帧调用一次。但是,如果您只使用传递给draw()的批处理,Stage类将为您处理开始和结束,您不需要显式调用它们。
第三,你实际上不需要调用super.draw(batch, parentAlpha)
因为它是Actor类中的空方法。
因此,您的课程可以简化为以下内容:
public class ArrowClass extends Actor {
AppleClass appleClass; // You never set this; you may not need it
Texture arrowTexture;
public ArrowClass(MainApp app, arrowWidth, arrowHeight) {
arrowTexture = new Texture("medievalarrow.png");
this.setSize(arrowWidth, arrowHeight);
this.setTouchable(Touchable.enabled);
this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight);
this.setOrigin(0,0);
}
@Override
public void draw(Batch batch, float parentAlpha) {
batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight());
}
}