【问题标题】:Java - Libgdx : Keep actor's position even screen's resolution changesJava - Libgdx:即使屏幕分辨率发生变化,也能保持演员的位置
【发布时间】:2024-05-02 06:50:02
【问题描述】:

下一个问题是:我的游戏是为 1080x1920 像素屏幕构建的,但如果我在其他分辨率下运行它,我的演员位置会发生变化。

如果你还没有看懂一些图片:

~>original resolution

~>other resolution

我在 Google、*、论坛中寻找了几天的答案,但找不到我的问题的正确答案,这是我的代码:

public class PlayScreen implements Screen {

    private Main game;

    private Stage stage;

    Music music;
    Sound sound;




    private class MenuGame extends Actor {
        Texture menu = new Texture(Gdx.files.internal("sprite/menu.png"));

        @Override
        public void draw(Batch batch, float alpha) {
            batch.draw(menu, 0, 0,Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        }
    }

    private class NewGame extends Actor {
        Texture newgame = new Texture(Gdx.files.internal("sprite/new.png"));

        @Override
        public void draw(Batch batch, float alpha) {
            batch.draw(newgame, 350, 1000);
        }
    }

    private class LoadGame extends Actor {
        Texture loadgame = new Texture(Gdx.files.internal("sprite/load.png"));

        @Override
        public void draw(Batch batch, float alpha) {
            batch.draw(loadgame, 350, 830);
        }
    }

    private class CreditsGame extends Actor {
        Texture creditsgame = new Texture(Gdx.files.internal("sprite/credits.png"));

        @Override
        public void draw(Batch batch, float alpha) {
            batch.draw(creditsgame, 350, 660);
        }
    }

    private class DonsGame extends Actor {
        Texture donsgame = new Texture(Gdx.files.internal("sprite/dons.png"));

        @Override
        public void draw(Batch batch, float alpha) {
            batch.draw(donsgame, 350, 490);
        }
    }


    // our create()

    public PlayScreen(final Main game) {
        this.game = game;


        Gdx.input.setInputProcessor(stage);

        final Sound sound = Gdx.audio.newSound(Gdx.files.internal("sound/buttonsound.mp3"));

        music = Gdx.audio.newMusic(Gdx.files.internal("sound/brun.mp3"));
        music.setLooping(true);
        music.setVolume(0.2f);
        music.play();




        // actors

        MenuGame menu = new MenuGame();     // BACKGROUND
        stage.addActor(menu);

        final NewGame newGame = new NewGame();   // BOUTON NEW
        stage.addActor(newGame);
        newGame.setX(350);
        newGame.setY(1000);
        newGame.setWidth(410);
        newGame.setHeight(100);


        LoadGame loadGame = new LoadGame();   // BOUTON LOAD
        stage.addActor(loadGame);
        loadGame.setX(350);
        loadGame.setY(830);
        loadGame.setWidth(410);
        loadGame.setHeight(100);

        CreditsGame creditsGame = new CreditsGame();   // BOUTON CREDITS
        stage.addActor(creditsGame);
        creditsGame.setX(350);
        creditsGame.setY(660);
        creditsGame.setWidth(410);
        creditsGame.setHeight(100);

        DonsGame donsGame = new DonsGame();   // BOUTON DONS
        stage.addActor(donsGame);
        donsGame.setX(350);
        donsGame.setY(490);
        donsGame.setWidth(410);
        donsGame.setHeight(100);






        // actions

        newGame.addListener(new ClickListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)   // NEW BOUTON ACTION
            {
                sound.play(0.2f);
                music.stop();
                game.setScreen(new Story(game));
                return true;
            }
        });


        loadGame.addListener(new ClickListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)   // LOAD BOUTON ACTION
            {
                sound.play(0.2f); //faire un truc ici
                return true;
            }

        });




        creditsGame.addListener(new ClickListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)   // CREDITS BOUTON ACTION
            {
                sound.play(0.2f);//faire un truc ici
                return true;
            }
        });


        donsGame.addListener(new ClickListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)   // DONS BOUTON ACTION
            {
                sound.play(0.2f);//faire un truc ici
                return true;
            }
        });


    }



    @Override
    public void show() {
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.draw();

    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        stage.dispose();
        music.dispose();
        sound.dispose();
    }

}

【问题讨论】:

    标签: libgdx screen resolution actor responsive


    【解决方案1】:

    您在硬编码值之后定位所有内容。所以现在你的游戏非常依赖分辨率。

    您需要使用的是视口。 以下是一些帮助您入门的链接:

    Brent Aureli - Aspect Ratios & Viewports

    libgdx github - viewports

    libgdx github - scene2d

    【讨论】:

    • 我已经有了所有这些的场景问题是:如果我的图片是简单的精灵,我无法让我的图片可触摸,我必须将它们转换为演员以根据它们成为按钮的方式,这就是为什么很难,因为我给我的演员画了按钮,但是如果你改变分辨率,他们会移动:我想知道如何处理演员,而不是简单的精灵
    • 我在 github 上添加了 Scene2d 页面的链接。查看“视口”以了解如何在 Scene2d 中使用视口。
    【解决方案2】:

    这是因为不同的设备具有不同的屏幕尺寸。所以它看起来会有所不同。为避免这种情况,您必须使用 viewPort 。要获得更多说明,您必须阅读有关多分辨率和 viewPort 的 libgdx api。在这里,我将向您建议一些示例代码,以避免这种多屏问题。请按照此模式解决您的问题。

    // in your main class
    public class myGame extends ApplicationAdapter {
    
        public OrthographicCamera camera
        public Viewport viewPort
        private SpriteBatch batch;
        private BitMapFont myScoreFont
        public myGame() {
    
        }
    
        @Override
        public void create() {
                myScoreFont = new BitmapFont(Gdx.files.internal(font.txt), true);
            batch = new SpriteBatch();
            float w = Gdx.graphics.getWidth();
            float h = Gdx.graphics.getHeight();
    
            camera = new OrthographicCamera();
            camera.position.set(0, 0, 0);
            camera.update();
            camera.setToOrtho(false, Constants.APP_WIDTH, Constants.APP_HEIGHT);
            viewPort = new FillViewport(1280, 800, camera);
    
    
        }
    
        @Override
        public void dispose() {
            batch.dispose();
        }
    
    
    
        @Override
        public void render() {
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
            float deltaTime = Gdx.graphics.getDeltaTime();
            batch.setProjectionMatrix(camera.combined);
            batch.begin();
            myScoreFont.draw(batch,"myText",0,0)
            batch.end();
    
        }
    
        @Override
        public void resize(int width, int height) {
            viewPort.update(width, height);
        }
    
        @Override
        public void pause() {
        }
    
        @Override
        public void resume() {
        }
    }
    

    有关更多详细信息,您必须阅读以下有关视口的链接

    https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/viewport/FillViewport.html

    【讨论】:

      最近更新 更多