相机和视口无法正常工作(LibGDX And​​roid)

时间:2015-08-19 07:39:29

标签: android camera libgdx viewport

当我在桌面上运行它时,我得到了正确的结果:

enter image description here

但是当我在我的Android手机(HTC One M8 1080p屏幕)上运行它时,它会显示更大的屏幕部分。我只希望它显示你在上面看到的内容,但它会在左下角显示该部分以及我希望在屏幕外显示的其他一些内容。

enter image description here

问题是,我的相机和视口设置与另一个屏幕完全相同,并且可以在另一个屏幕中使用。请帮我解决这个问题!

这是整个MenuScreen类:

package com.xx4everPixelatedxx.gaterunner.screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.ParticleEffect;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.xx4everPixelatedxx.gaterunner.GateRunner;
import com.xx4everPixelatedxx.gaterunner.InputTransform;
import com.xx4everPixelatedxx.gaterunner.sprites.GameIcon;
import com.xx4everPixelatedxx.gaterunner.sprites.MenuBackground;

import java.awt.Menu;
import java.util.HashMap;

/**
 * Created by Michael Jan on 8/16/2015.
 */
public class MenuScreen implements Screen, InputProcessor {
    private GateRunner game;
    OrthographicCamera cam;
    Viewport viewport;

    private GameIcon gameIcon;
    private ParticleEffect effect;

    private MenuBackground mb, mb2;
    private Texture title_background, title, play_button, instructions_button, about_button;
    private Sprite titleSprite, playButtonSprite, instructionsButtonSprite, aboutButtonSprite;

    public MenuScreen(GateRunner game){
        this.game = game;

        Gdx.input.setInputProcessor(this);

        cam = new OrthographicCamera();
        cam.setToOrtho(false, GateRunner.WIDTH, GateRunner.HEIGHT);
        viewport = new ExtendViewport(GateRunner.WIDTH, GateRunner.HEIGHT, cam);

        title_background = new Texture(Gdx.files.internal("menu/title_background.png"));
        title = new Texture(Gdx.files.internal("menu/title.png"));
        play_button = new Texture(Gdx.files.internal("menu/play_button.png"));
        instructions_button = new Texture(Gdx.files.internal("menu/instructions_button.png"));
        about_button = new Texture(Gdx.files.internal("menu/about_button.png"));

        titleSprite = new Sprite(title);
        playButtonSprite = new Sprite(play_button);
        instructionsButtonSprite = new Sprite(instructions_button);
        aboutButtonSprite = new Sprite(about_button);

        mb = new MenuBackground(1);
        mb2 = new MenuBackground(2);

        gameIcon = new GameIcon(GateRunner.WIDTH/2 - GateRunner.WIDTH/10, GateRunner.HEIGHT/10);

        effect = new ParticleEffect();
        effect.load(Gdx.files.internal("game/particles1.party"), Gdx.files.internal("game"));
        effect.start();

    }

    @Override
    public void show() {

    }

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

        cam.update();

        game.batch.begin();

        mb.update();
        mb2.update();
        mb.getSprite().setX(0);
        mb2.getSprite().setX(0);
        mb.getSprite().setY(mb.getPosition().y);
        mb2.getSprite().setY(mb2.getPosition().y);

        mb.getSprite().draw(game.batch);
        mb2.getSprite().draw(game.batch);

        titleSprite.setSize(GateRunner.WIDTH, GateRunner.WIDTH * 0.5f); //width, height
        titleSprite.setPosition(GateRunner.WIDTH / 2 - titleSprite.getWidth() / 2, GateRunner.HEIGHT / 2 * 1.35f);
        titleSprite.draw(game.batch);

        playButtonSprite.setSize(titleSprite.getWidth(), titleSprite.getWidth() * 0.133f);
        playButtonSprite.setPosition(titleSprite.getX(), titleSprite.getY() - playButtonSprite.getHeight());
        playButtonSprite.draw(game.batch);

        instructionsButtonSprite.setSize(titleSprite.getWidth(), titleSprite.getWidth() * 0.133f);
        instructionsButtonSprite.setPosition(titleSprite.getX(), titleSprite.getY() - 2 * instructionsButtonSprite.getHeight() - 10);
        instructionsButtonSprite.draw(game.batch);

        aboutButtonSprite.setSize(titleSprite.getWidth(), titleSprite.getWidth() * 0.133f);
        aboutButtonSprite.setPosition(titleSprite.getX(), titleSprite.getY() - 3 * aboutButtonSprite.getHeight() - 10 - 10);
        aboutButtonSprite.draw(game.batch);

        gameIcon.getSprite().setSize(GateRunner.WIDTH / 10, GateRunner.WIDTH / 10);
        gameIcon.getSprite().setPosition(GateRunner.WIDTH / 2 - GateRunner.WIDTH / 20, GateRunner.HEIGHT / 10 + 10);
        gameIcon.getSprite().draw(game.batch);

        effect.update(delta);
        effect.getEmitters().first().setPosition(GateRunner.WIDTH / 2 - GateRunner.WIDTH / 20 + gameIcon.getSprite().getWidth()/2, GateRunner.HEIGHT / 10 + 10); //doesnt follow gameIcon
        effect.draw(game.batch);

        game.batch.end();

        gameIcon.update(delta);
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        title_background.dispose();
        title.dispose();
        play_button.dispose();
        instructions_button.dispose();
        about_button.dispose();
    }

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

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

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

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        float pointerX = InputTransform.getCursorToModelX(GateRunner.WIDTH, screenX);
        float pointerY = InputTransform.getCursorToModelY(GateRunner.HEIGHT, screenY);

        if(playButtonSprite.getBoundingRectangle().contains(pointerX, pointerY)) //Play button
        {
            game.setScreen(new PlayScreen(game));
            dispose();
        }

        return true;
    }

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

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

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

    @Override
    public boolean scrolled(int amount) {
        return true;
    }

}

这是MenuBackground类(创建以便后台可以移动):

package com.xx4everPixelatedxx.gaterunner.sprites;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Vector3;
import com.xx4everPixelatedxx.gaterunner.GateRunner;

/**
 * Created by Michael Jan on 8/18/2015.
 */
public class MenuBackground {
    private Texture texture;
    private Sprite sprite;
    private Vector3 position;
    private Vector3 velocity;

    public MenuBackground(int i)
    {
        if(i == 1)
            position = new Vector3(0, 0, 0);
        else if(i == 2)
            position = new Vector3(0, GateRunner.HEIGHT * 2, 0);

        texture = new Texture(Gdx.files.internal("menu/title_background2.png"));
        sprite = new Sprite(texture);
        sprite.setSize(GateRunner.WIDTH, GateRunner.HEIGHT * 2 + 2);

        velocity = new Vector3(0, -3, 0);
    }

    public void update()
    {
        position.add(0, velocity.y, 0);
        if(position.y - 6 <= -2 * GateRunner.HEIGHT)
        {
            position.y = GateRunner.HEIGHT * 2;
        }
    }

    public Vector3 getVelocity() {
        return velocity;
    }

    public void setVelocity(Vector3 velocity) {
        this.velocity = velocity;
    }

    public Vector3 getPosition() {
        return position;
    }

    public void setPosition(Vector3 position) {
        this.position = position;
    }

    public Sprite getSprite() {
        return sprite;
    }

    public void setSprite(Sprite sprite) {
        this.sprite = sprite;
    }

    public Texture getTexture() {
        return texture;
    }

    public void setTexture(Texture texture) {
        this.texture = texture;
    }
}

GateRunner.WIDTH为480,GateRunner.HEIGHT为800。

编辑:添加了Android手机上发生的事情的截图

1 个答案:

答案 0 :(得分:0)

问题得到解决。我所做的只是删除标题精灵,并重新创建它。我不知道为什么会这样。