- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 LibGDX 中使用 FitViewport
时遇到问题。调整窗口大小时,一切正常。接下来,我切换屏幕,所有内容都会翻转回正常尺寸,并且图像被裁剪到左侧,而应用程序的尺寸保持调整大小。
但是,当我按下到第一个屏幕
按钮时,就会发生这种情况:
因此,除了缩放按钮和图像的位置之外,一切正常(按到主屏幕
按钮可返回原始屏幕)。
窗口的尺寸保持不变,但图像恢复到其原始大小(500x500)并放置在坐标(0,0)处。
关于如何解决这个问题有什么想法或建议吗?我正在为这个问题绞尽脑汁,似乎无法正确处理...我希望它就像第一个屏幕一样。
<小时/>这些是我的类文件:我使用抽象 Screen 类来跟踪屏幕(并用于稍后扩展)和 ScreenManager:
主类:
public class MainClass implements ApplicationListener {
@Override
public void create () {
ScreenManager.setScreen(new MainScreen());
}
@Override
public void render () {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if (ScreenManager.getCurrentScreen() != null) {
ScreenManager.getCurrentScreen().render();
}
}
@Override
public void resize(int width, int height) {
if (ScreenManager.getCurrentScreen() != null)
ScreenManager.getCurrentScreen().resize(width, height);
}
}
抽象屏幕类:
public abstract class Screen {
public abstract void create();
public abstract void render();
public abstract void resize(int width, int height);
public abstract void pause();
public abstract void dispose();
public abstract void resume();
}
屏幕管理器类:
public class ScreenManager {
private static Screen currentScreen;
public static void setScreen(Screen screen) {
if (currentScreen != null)
currentScreen.dispose();
currentScreen = screen;
currentScreen.create();
}
public static Screen getCurrentScreen() {
return currentScreen;
}
}
主屏幕类:
public class MainScreen extends Screen {
private Texture bg1;
private Image bg1Image;
private Skin skin;
private Stage stage;
private OrthographicCamera camera;
private FitViewport fitViewport;
@Override
public void create() {
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
bg1 = new Texture(Gdx.files.internal("background1.png"));
bg1Image = new Image(bg1);
skin = new Skin(Gdx.files.internal("uiskin.json"));
TextButton nextButton = new TextButton("to first screen", skin);
nextButton.setPosition(200, 200);
nextButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
ScreenManager.setScreen(new FirstScreen());
super.clicked(event, x, y);
}
});
stage = new Stage(fitViewport);
stage.addActor(bg1Image);
stage.addActor(nextButton);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(Gdx.graphics.getDeltaTime());
fitViewport.apply();
stage.draw();
}
@Override
public void resize(int width, int height) {
fitViewport.update(width, height, true);
camera.update();
}
}
第一屏幕类(class):
public class FirstScreen extends Screen {
private Texture bg2;
private Image bg2Image;
private Skin skin;
private Stage stage;
private OrthographicCamera camera;
private FitViewport fitViewport;
@Override
public void create() {
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
bg2 = new Texture(Gdx.files.internal("background2.png"));
bg2Image = new Image(bg2);
skin = new Skin(Gdx.files.internal("uiskin.json"));
TextButton prevButton = new TextButton("to main screen", skin);
prevButton.setPosition(200, 200);
prevButton.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
ScreenManager.setScreen(new MainScreen());
super.clicked(event, x, y);
}
});
stage = new Stage(fitViewport);
stage.addActor(bg2Image);
stage.addActor(prevButton);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(Gdx.graphics.getDeltaTime());
fitViewport.apply();
stage.draw();
}
@Override
public void resize(int width, int height) {
fitViewport.update(width, height, true);
camera.update();
}
}
(我知道我提供了很多类(class),但我想详细解释所有内容......)我猜这可能是一件小事,但我似乎无法把它做好,这让我发疯......任何帮助或建议将不胜感激!
最佳答案
您的问题在这里:
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fitViewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
每次检查当前窗口大小并创建具有窗口大小的视口(viewport)时。解决方案是手动定义窗口大小并根据该值创建新的屏幕视口(viewport)。
在您的主类中创建静态公共(public)大小变量(您当然可以在您想要或不创建的任何地方创建它,但直接写入值 - 但这由于将来的重构而不好)
public static final float WIDTH = 800, HEIGHT = 600; //or any other values you need
然后创建你的视口(viewport)和相机,就像
camera = new OrthographicCamera(Main.WIDTH, Main.HEIGHT);
camera.setToOrtho(false, Main.WIDTH, Main.HEIGHT);
fitViewport = new FitViewport(Main.WIDTH, Main.HEIGHT, camera);
仅此而已。
<小时/>如果您不需要这个相机,也请考虑不要创建新相机 - 也许默认的舞台相机对您来说就足够了?想一想。
关于java - LibGDX FitViewport 正确调整大小,但在更改屏幕后重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32528989/
我在手机上开发了一款分辨率为 1080x1920(纵向)的游戏。我根据它设置了我的 fitviewport。在我的手机上看起来像这样: 但在任何其他手机或桌面相机上定位错误。在其他设备上看起来像这样:
当我使用正确的宽高比启动游戏时,当我调整窗口大小时,我的游戏可以很好地缩放,但当我使用不同的宽高比启动应用程序时,就会出现问题。 我在主游戏类中设置了这些全局变量: public static fin
我得到了 super 马里奥1级的图像(1563x224):但当你玩游戏时,你看不到所有的关卡。 这些是我的值(value)观: // level1.png image size: 1563x224
我想要做的是为我的世界设定一个虚拟尺寸,并在不改变纵横比的情况下尽可能地在屏幕上缩放该世界,FitViewport 似乎是最佳选择。这就是我在舞台上初始化视口(viewport)的方式。 public
我的目标是使用 FitViewport 创建一款始终以 9:16 的纵横比(基本上是 16:9,但直立)显示的游戏;它应该独立于目标设备的分辨率。为了测试此设置,我创建了以下最小工作示例。绿色小方 b
我目前正在编写一个小游戏,你必须用宇宙飞船避开小行星。为了让游戏在每台设备上看起来都一样,我使用了 FitViewport。不幸的是,通过使用视口(viewport),我的坐标在调整大小时会有点偏离。
在互联网上搜索并搜索如何在 LibGDX(此处和其他网站)中正确调整大小之后,我的 Tic tac Toe 游戏遇到了一个大问题。当切换屏幕时,我的 FitViewport 不会按预期调整大小。我确实
我的问题是,我保存游戏世界的 FitViewport 的缩放方式使得在 X 轴上我可以看到黑条,但 Y 轴似乎不介意 Gdx.graphics 限制,并且它超出了屏幕。似乎发生的情况是,即使我向它传递
我正在绞尽脑汁试图弄清楚这里发生了什么...我正在使用 FitViewport,每当我调整屏幕大小时它都工作得很好,但是当它在构造函数期间首次创建时它不适合自己像它应该的那样进入屏幕(就像我调整大小时
我有一个 FitViewport具有虚拟宽度和虚拟高度。当屏幕的宽高比不同于我的虚拟分辨率时,会添加黑条。我想在这些信箱里画点东西。 我试图那样做,但只绘制了我的虚拟分辨率“内部”的对象,“外部”的对
我在 LibGDX 中使用 FitViewport 时遇到问题。调整窗口大小时,一切正常。接下来,我切换屏幕,所有内容都会翻转回正常尺寸,并且图像被裁剪到左侧,而应用程序的尺寸保持调整大小。 调整大小
我已经尝试解决这个问题三周了。我开始使用 libgdx wiki 上的视口(viewport),并浏览了这个论坛中有关视口(viewport)、虚拟视口(viewport)等的许多问题,发现我的游戏的
所以,我正在为我即将推出的应用程序使用 LibGDX。 我使用 FitViewport 来确保 16:9 的纵横比。因此,使用 16:9 以外的其他纵横比的播放器将在网站上出现黑条。 绘制屏幕填充背景
我有这种方法可以在 Windows 桌面上按预期工作和扩展: public class MyGdxGame extends ApplicationAdapter { SpriteBatch m
这里的基本问题是:如何始终将 Sprite 保持在 Fitviewport 内?如何保留对 View 的引用以便获得正确的绘制位置坐标? 我正在尝试将敌人生成到游戏屏幕中。但这是由 FitViewpo
我有一款使用 FitViewport 的 Android 游戏,因此宽高比始终正确(根据需要显示黑条)。我以前的几部手机一切正常。 但是,现在我得到了一个新的,Samsung Galaxy J6。使用
libgdx Viewports - 为什么当我使用 FitViewport 时触摸输入 x 和 y 不准确? 最佳答案 使用 viewport.unproject() 而不是 camera.unpr
我是一名优秀的程序员,十分优秀!