【问题标题】:LibGdx MoveTo() action method for Actor is not workingActor 的 LibGdx MoveTo() 操作方法不起作用
【发布时间】:2021-07-25 14:53:32
【问题描述】:

我对@9​​87654321@ 操作有疑问。没有错误,但 Actor 没有移动到该位置。该方法在touchDown() 中调用。我花了几个小时,找不到解决方案。 请问你能帮忙吗? moveTo()中的参数暂时是随机的,不用担心

请看下面的代码。

public class GameScreen implements Screen, InputProcessor {

    private final float REMOTE_WIDTH = 30;
    private final float BATTERY_WIDTH = 11;
    private final float BATTERY_HEIGHT = 30;
    private final float TRIANGLE_X1 = RgbSortGame.GAME_SCREEN_WIDTH/2 - REMOTE_WIDTH /2;
    private final float TRIANGLE_Y1 = RgbSortGame.GAME_SCREEN_HEIGHT/2;
    private final float TRIANGLE_X2 = RgbSortGame.GAME_SCREEN_WIDTH/2 + REMOTE_WIDTH /2;
    private final float TRIANGLE_Y2 = RgbSortGame.GAME_SCREEN_HEIGHT/2;
    private final float TRIANGLE_X3 = RgbSortGame.GAME_SCREEN_WIDTH/2;
    private final float TRIANGLE_Y3 = RgbSortGame.GAME_SCREEN_HEIGHT/2 - REMOTE_WIDTH;
    private final float BUTTON_RADIUS = REMOTE_WIDTH/4f;
    private final float TV_OFFSET_X = (RgbSortGame.GAME_SCREEN_WIDTH-RgbSortGame.GAME_SCREEN_WIDTH/2)/2;
    private final float TV_OFFSET_Y = (RgbSortGame.GAME_SCREEN_HEIGHT-RgbSortGame.GAME_SCREEN_HEIGHT/4)/1.1f;

    private Level level;
    private List<BatteryView> batteryViews;
    private Map<Integer, Battery> strategy;

    private Viewport viewport;
    private TextureAtlas atlas;
    private OrthographicCamera camera;
    private SpriteBatch batch;
    private ShapeRenderer shapeRenderer;
    private Texture background;
    private Texture tv;
    private Texture battery;
    private Stage stage;

    private Vector2 tempVector;
    private Vector2 tempScreenToStage;


    private Queue<String> hitActorsNames;

    public GameScreen() {
        Level1 level1 = new Level1();
        level = new Level(level1.getRelativeCoordinates());
        batteryViews = new ArrayList<>();
        strategy = level.getBatteries();
        batch = new SpriteBatch();
        camera = new OrthographicCamera();
        viewport = new StretchViewport(RgbSortGame.GAME_SCREEN_WIDTH, RgbSortGame.GAME_SCREEN_HEIGHT, camera);
        viewport.apply();
        stage = new Stage(viewport, batch);
        Gdx.input.setInputProcessor(this);

        shapeRenderer = new ShapeRenderer();

        atlas = new TextureAtlas("buttons/buttons.atlas");

        background = new Texture("images/97916b7c0f1f5f582723426ee1f876ce.jpg");
        tv = new Texture("images/tv1.png");
        battery = new Texture("images/battery.png");

        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();

        hitActorsNames = new ArrayDeque<>();
        calculateBatteriesStartCoordinates();

        tempVector = new Vector2(0,0);
        tempScreenToStage = new Vector2(0,0);
    }

    @Override
    public void show() {

    }

    @Override
    public void render(float delta) {
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        batch.draw(background, 0f,0f,RgbSortGame.GAME_SCREEN_WIDTH, RgbSortGame.GAME_SCREEN_HEIGHT);
        batch.draw(tv, TV_OFFSET_X, TV_OFFSET_Y,
                RgbSortGame.GAME_SCREEN_WIDTH/2, RgbSortGame.GAME_SCREEN_HEIGHT/4);
        batch.end();

        shapeRenderer.setProjectionMatrix(camera.combined);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.setColor(Color.GOLD);
        shapeRenderer.triangle(TRIANGLE_X1, TRIANGLE_Y1,
                TRIANGLE_X2, TRIANGLE_Y2,
                TRIANGLE_X3, TRIANGLE_Y3);
        shapeRenderer.end();

        stage.draw();
        stage.act(Gdx.graphics.getDeltaTime());
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        background.dispose();
        batch.dispose();
        shapeRenderer.dispose();
        atlas.dispose();
        stage.dispose();
    }

    public void calculateBatteriesStartCoordinates(){
        float batteryStartPositionX = RgbSortGame.GAME_SCREEN_WIDTH/24;

        for (int i = 0; i < strategy.size(); i++) {
            if (batteryStartPositionX >= TRIANGLE_X1 && batteryStartPositionX<= TRIANGLE_X2){
                batteryStartPositionX += REMOTE_WIDTH;
            }
            Actor batteryView = new BatteryView(batteryStartPositionX, TRIANGLE_Y3, BATTERY_WIDTH, BATTERY_HEIGHT, BUTTON_RADIUS, strategy.get(i), battery, atlas);
            batteryStartPositionX += RgbSortGame.GAME_SCREEN_WIDTH/24 + BATTERY_WIDTH;
            batteryView.setName(i + "");
            stage.addActor(batteryView);
        }
    }

    @Override
    public boolean keyDown(int keycode) {
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        tempScreenToStage = stage.screenToStageCoordinates(tempVector.set((float)screenX,(float)screenY));
        Actor hitActor = stage.hit(tempScreenToStage.x,tempScreenToStage.y,true);
        if (hitActor != null){
          
            hitActorsNames.add(hitActor.getName());
            if (hitActorsNames.size() >= 2){
                    Actor actor = stage.getRoot().findActor(hitActorsNames.poll());
                    actor.addAction(Actions.moveTo(100f,200f,0.7f));                
                    hitActorsNames.clear();
                }
            }
        }
        return true;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        return false;
    }

    @Override
    public boolean scrolledenter code here(float amountX, float amountY) {
        return false;
    }

还有BatteryView

public class BatteryView extends Actor{
    private float positionX;
    private float positionY;
    private float width;
    private float height;
    private float buttonRadius;
    private Texture batteryTexture;
    private Deque<GameButton> buttonsStrategy;
    private TextureAtlas atlas;


    public BatteryView(float positionX, float positionY, float width, float height,
                       float buttonRadius, Battery strategy,
                       Texture batteryTexture, TextureAtlas atlas) {
        this.positionX = positionX;
        this.positionY = positionY;
        this.batteryTexture = batteryTexture;
        this.width = width;
        this.height = height;
        this.atlas = atlas;
        this.buttonRadius = buttonRadius;
        this.buttonsStrategy = strategy.getGameButtons();
        this.setBounds(positionX,positionY,width,height);
        this.setTouchable(Touchable.enabled);
        this.setSize(width, height);
    }

    @Override
    public void act(float delta) {
        super.act(delta);
    }


    @Override
    public void draw(Batch batch, float parentAlpha){
        batch.draw(batteryTexture,positionX,positionY,width,height);
        float xButtonPosition = positionX + width / 2 - buttonRadius / 2;
        float yButtonPosition = positionY;
        for (GameButton gameButton : buttonsStrategy) {
            new GameButtonView(xButtonPosition, yButtonPosition,
                    buttonRadius, atlas.findRegion(gameButton.getColor())).draw(batch);
            yButtonPosition += buttonRadius;
        }
    }


    public float getPositionX() {
        return positionX;
    }

    public float getPositionY() {
        return positionY;
    }

    public float getWidth() {
        return width;
    }`enter code here`

    public float getHeight() {
        return height;
    }
}

提前谢谢你!

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    更新:我找到了解决方案!我不得不更改 BatteryView 类中的绘制方法。它应该是batch.draw(batteryTexture,getX(),getY(),width,height)而不是关闭 batch.draw(batteryTexture,positionX,positionY,width,height).

    【讨论】:

    • 您应该从您的类中完全删除 positionXpositionYwidthheight,因为您正在遮蔽超类中已经存在的属性。
    • 感谢您的提示!我会这样做的
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2017-02-21
    • 2016-12-25
    • 2015-07-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多