舞台中的Actor不会更新MoveTo XY位置

时间:2016-12-06 04:39:13

标签: libgdx action actor stage scene2d

我正在制作一个用箭头射击苹果的游戏。苹果的位置是用户输入的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();

    }
}

任何帮助都将受到高度赞赏。感谢。

1 个答案:

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