簡體   English   中英

相機和視口無法按預期工作(Android LibGDX)

[英]Camera and Viewport Not Working as Intended (LibGDX Android)

當我在桌面上運行它時,我得到正確的結果:

在此處輸入圖片說明

但是,當我在Android手機(HTC One M8 1080p屏幕)上運行它時,它會在屏幕上顯示更大的部分。 我只希望它顯示您在上方看到的內容,但是它在左下角顯示該部分以及其他一些我想在屏幕外顯示的內容。

在此處輸入圖片說明

問題是,我的攝像頭和視口的設置與另一個屏幕完全相同,並且可以在另一個屏幕上正常工作。 請幫我解決這個問題!

這是整個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手機上發生的情況的屏幕截圖

該問題已解決。 我要做的就是刪除標題精靈,然后重新創建它。 我不知道為什么會這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM