【问题标题】:Clickable textures可点击的纹理
【发布时间】:2017-10-08 10:24:12
【问题描述】:

我对 LibGdx 和 android studio 有点陌生。 我正在尝试创建可点击的纹理,一个用于播放,一个用于信用。 两者都应该打开一个新的空屏幕/事件。

public void create() {

    batch = new SpriteBatch();
    img = new Texture("Main_Screen.png");
    music = Gdx.audio.newMusic(Gdx.files.internal("bgmusic.wav"));
    music.play();
    music.setLooping(true);
    credits = new Texture("credits.png");
    play = new Texture("play.png");
}


@Override
public void render() {

    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(img, 0, 0);
    batch.draw(play, 340, 1400);
    batch.draw(credits, 340, 400);
    batch.end();
}

但是我不确定如何做到这一点,因为我也在用纹理创建背景,所以如果有人可以帮助我,我会非常高兴。

【问题讨论】:

    标签: java android android-studio libgdx textures


    【解决方案1】:

    使用Sprite 而不是Texture,它保存了用于绘制二维精灵的几何、颜色和纹理信息。

    MyGdxGame

    public class MyGdxGame extends Game {
    
        public Screen menuScreen,creditsScreen,playScreen;
    
        @Override
        public void create () {
    
            menuScreen=new MenuScreen(this);
            creditsScreen=new CreditsScreen();
            playScreen=new PlayScreen();
    
            setScreen(menuScreen);
        }
    }
    

    菜单屏幕

    public class MenuScreen extends InputAdapter implements Screen  {
    
        SpriteBatch batch;
        Texture background,play,credits;
    
        Sprite backgoundSprite,playSprite,creditsSprite;
        private ExtendViewport extendViewport;
    
        OrthographicCamera cam;
        private float w=480;
        private float h=800;
        private Vector3 vector3;
    
        MyGdxGame game;
        Music music;
    
        public MenuScreen(MyGdxGame game){
            this.game=game;
        }
    
        @Override
        public void show() {
    
            batch = new SpriteBatch();
            cam = new OrthographicCamera();
            extendViewport=new ExtendViewport(w,h,cam);
    
            vector3=new Vector3();
    
            background = new Texture("Main_Screen.png");
            play=new Texture("play.png");
            credits=new Texture("credits.png");
    
            backgoundSprite=new Sprite(background);
            backgoundSprite.setSize(w,h);       // If resources are not in context of your viewport
            backgoundSprite.setPosition(0,0);  //Default Position
    
            playSprite=new Sprite(play);
            playSprite.setSize(100,100);
            playSprite.setPosition(w/2-playSprite.getWidth()/2,h/2+100);
    
            creditsSprite=new Sprite(credits);
            creditsSprite.setSize(100,100);
            creditsSprite.setPosition(w/2-creditsSprite.getWidth()/2,h/2-100);
    
            Gdx.input.setInputProcessor(this);
    
            music = Gdx.audio.newMusic(Gdx.files.internal("bgmusic.wav"));
            music.play();
            music.setLooping(true);   
        }
    
        @Override
        public void render(float delta) {
    
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            batch.setProjectionMatrix(cam.combined);
            batch.begin();
            backgoundSprite.draw(batch);
            playSprite.draw(batch);
            creditsSprite.draw(batch);
            batch.end();
        }
    
        @Override
        public void resize(int width, int height) {
    
            extendViewport.update(width,height);
            cam.position.x = w /2;
            cam.position.y = h/2;
            cam.update();
        }
    
        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button) {
            vector3.set(screenX,screenY,0);
            Vector3 position=cam.unproject(vector3);
                if(playSprite.getBoundingRectangle().contains(position.x,position.y)) {
                game.setScreen(game.playScreen);
            }
            if(creditsSprite.getBoundingRectangle().contains(position.x,position.y)){
                game.setScreen(game.creditsScreen);
            }
    
            return super.touchDown(screenX, screenY, pointer, button);
        }
    
        @Override
        public void pause() { }
    
        @Override
        public void resume() { }
    
        @Override
        public void hide() { }
    
        @Override
        public void dispose() {
            batch.dispose();
            background.dispose();
            play.dispose();
            credits.dispose();
        }
    }
    

    学分屏幕

    public class CreditsScreen implements Screen {
    
        @Override
        public void show() {
    
        }
    
        @Override
        public void render(float delta) {
            Gdx.gl.glClearColor(0, 0, 1, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        }
    
        @Override
        public void resize(int width, int height) { }
    
        @Override
        public void pause() { }
    
        @Override
        public void resume() { }
    
        @Override
        public void hide() { }
    
        @Override
        public void dispose() { }
    }
    

    播放屏幕

    public class PlayScreen implements Screen {
    
        @Override
        public void show() {
    
        }
    
        @Override
        public void render(float delta) {
            Gdx.gl.glClearColor(0, 1, 1, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
        }
    
        @Override
        public void resize(int width, int height) { }
    
        @Override
        public void pause() { }
    
        @Override
        public void resume() { }
    
        @Override
        public void hide() { }
    
        @Override
        public void dispose() { }
    }
    

    【讨论】:

    • 这很有帮助,但是背景已调整大小并且不再适合屏幕,我将如何纠正这个问题?
    • Main_Screen.png 的大小不在480*800(视口大小)的维度内,因为它覆盖了整个屏幕,因此请在视口世界大小的上下文中使用所有资源。
    【解决方案2】:

    欢迎来到 libGDX!

    如果我正确理解了您的问题,那么您正试图弄清楚如何在游戏中更改屏幕。概括地说,这是您需要做的:

    1. 在屏幕上绘制按钮纹理。
    2. 使用Gdx.input 检测玩家何时抬起鼠标按钮(以及当他们抬起鼠标时它是否超过了您的一个按钮)
    3. 发生这种情况时切换到新屏幕(可能带有新背景)。

    我建议您首先完成 "A Simple Game""Extending the Simple Game" 教程,以熟悉 libGDX 和 GameScreen 类的基础知识。

    接下来,尝试使用 Scene2D.UI(第二个教程底部有链接)将 StageTextButtons 添加到您的主菜单。

    希望这可以帮助您入门 - 该 libGDX wiki 上有很多有用的信息,我认为您会发现它们很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多