java - 我的游戏屏幕在 Android 上使用 libgdx 缩小

标签 java android libgdx

我正在学习 libgdx (java) 游戏编程,并且刚刚完成了我的第一个游戏:一个简单的 Brick Destroyer。

我做了一个桌面和安卓项目。经过几个小时的“艰苦”工作,我的游戏终于在桌面上运行良好。我没有在这个游戏中使用 scene2D 或 box2D 或其他任何东西(我只是在我的类上实现了界面“屏幕”:GameScreen、MainMenuScreen 等...)。

问题是:当我将游戏导出为 .APK 文件,然后将其安装到我的 Android 手机(Sony Xperia Z1 Compact)上时,屏幕完全不同。球仍然与所有其他元素(砖 block 和屏幕侧面) react 良好,但似乎不是相同的缩放。我已经尝试了很多事情,我不知道该怎么办了,请帮助我:)。

我正在使用 FitViewport 和正交相机。

请参阅下面的屏幕截图: 1 - GameScreen 类的构造函数。 2 - 桌面程序。 3 - Android 应用程序。

谢谢大家的回答,如果我犯了错误,请为我的英语感到抱歉(我不是以英语为母语的人)。

final Bricks game;

Texture ball_img, plate_img, brique_img_rouge, brique_img_orange, brique_img_vert;  
Vector2 posb, posp;
Vector2 vitb, vitp;
OrthographicCamera camera;
Rectangle ball, plate;
Array<Brique> briques;
FitViewport viewport;
final int plate_width = 60, plate_height = 10;
final int brique_width = 35, brique_height = 15;
final int ball_width = 15, ball_height = 14;
boolean left_p, right_p, up_p;    


public GameScreen(final Bricks gam) {

    this.game = gam;


    ball_img = new Texture("ball_bl.PNG");
    plate_img = new Texture("plate_bl.PNG");
    brique_img_rouge = new Texture("brique_bl_rouge.PNG");
    brique_img_orange = new Texture("brique_bl_orange.PNG");
    brique_img_vert = new Texture("brique_bl_vert.PNG");

    camera = new OrthographicCamera();
    viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
    viewport.apply();               

    ball = new Rectangle();
    plate = new Rectangle();

    briques = new Array<Brique>();
    briques.add(new Brique(2));
    briques.first().x = 50;
    briques.first().y = Gdx.graphics.getHeight()-60;
    briques.first().width = brique_width;
    briques.first().height = brique_height;

    posb = new Vector2(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/4);
    vitb =  new Vector2(0, 400*Gdx.graphics.getDeltaTime());

    posp = new Vector2(Gdx.graphics.getWidth()/2 - plate_width/2, 20);
    vitp =  new Vector2(400*Gdx.graphics.getDeltaTime(), 0);

    for (int i = 1; i < 65; i++) {

        if( i % 13 == 0) {
            briques.add(new Brique(1));
            briques.get(i).x = briques.first().x;
            briques.get(i).y = briques.get(i-1).y - 35;
            briques.get(i).width = brique_width;
            briques.get(i).height = brique_height;

        } else {
            briques.add(new Brique(1));
            briques.get(i).x = briques.get(i-1).x + briques.get(i-1).width + 20;
            briques.get(i).y = briques.get(i-1).y;
            briques.get(i).width = brique_width;
            briques.get(i).height = brique_height;
        }

        if(i > 51 || i == 19 || i == 32) {
            briques.get(i).setType(3);
        }
        if((i < 13 || i %13 == 0 || i == 25 || i >= 38) && i < 52) {
            briques.get(i).setType(2);
        }
    }

    ball.x = posb.x;
    ball.y = posb.y;
    ball.width = ball_width;
    ball.height = ball_height;

    plate.x = posp.x;
    plate.y = posp.y;
    plate.width = plate_width;
    plate.height = plate_height;

我认为问题出在此处,但它可以在桌面上运行。

camera = new OrthographicCamera();
    viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
    viewport.apply();       

桌面:Desktop programm

安卓:android app from .APK file

最佳答案

发生这种情况是因为您使用的 FitViweport 的虚拟屏幕尺寸与实际屏幕尺寸相同。由于您的桌面应用程序和 Android 手机具有不同的分辨率,因此您会获得不同的视口(viewport)。

因此,对于您的桌面应用程序,相机代码实际上可能“看起来”像这样:

camera = new OrthographicCamera();
viewport = new FitViewport(800, 600, camera);
viewport.apply();

对于你的 android 来说,它实际上可能“看起来”像这样:

camera = new OrthographicCamera();
viewport = new FitViewport(400, 700, camera);
viewport.apply();

要解决这个问题,请定义内部虚拟世界大小,以便两个世界的大小例如为VIRTUAL_WIDTH x VIRTUAL_HEIGHT。此大小不得以像素为单位:

// Global static field in your game class
public static int VIRTUAL_WIDTH = XXX;
public static int VIRTUAL_HEIGHT = XXX;

// ...

camera = new OrthographicCamera();
viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
viewport.apply();

这意味着您不再使用 Gdx.graphics.getWidth()Gdx.graphics.getHeight(),而是分别使用这些值,因为您现在工作在您的虚拟屏幕尺寸。

例如在您的代码中:

posb = new Vector2(VIRTUAL_WIDTH / 2f, VIRTUAL_HEIGHT / 4f);

对于您的屏幕外问题:

检查您如何绘制 block ,您是否使用了 Gdx.graphics.getXXX() 或超出新大小限制的值?

关于java - 我的游戏屏幕在 Android 上使用 libgdx 缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131722/

相关文章:

java - 从异步任务获取空响应,响应代码为 200,这意味着成功

java - 检查单选按钮是否选择了特定 Activity

android - OpenGL : Create a "transparent window-like object"

java - Android libGDX 在启动时随机崩溃

java - BlueJ错误 “'无效类型“此处不允许”

android - 无法删除 CardView 项目之间的额外空间 - 可滚动的 RecyclerView

Java Eclipse PhoneGap。无法设置插件?

java - Libgdx 屏幕不交换

java - 为什么我的应用程序名称与 Activity 名称相同?

java - 多线程初始化同步