Java / LibGDX 缩放问题
Java / LibGDX scaling issues
我正在 libgdx 中创建游戏,它在 1920x1080 纵横比和 1280x720 下都运行良好。问题是,一些分辨率,如 1366x768,这在计算机上也很常见,但不能被我的纹理大小(16px)整除,而且它不完全是 16*9,这使得一些像素变得太长或太高。这是正在发生的事情的图像。如果你放大,你会看到一些像素真的很奇怪。
希望这是足够的信息,如果不够请告诉我。
如果所需的分辨率不适合您游戏的纵横比,您需要裁剪绘制区域。
在您的渲染例程下,您应该计算正确的视口
@Override
public void render() {
[...]
// set viewport
Gdx.gl.glViewport((int) _viewport.x, (int) _viewport.y,
(int) _viewport.width, (int) _viewport.height);
[...]
}
要计算正确的视口,您可以使用此函数(我根据 libgdx 为我的游戏引擎编写了此函数)
- 宽度:当前window宽度,
- 身高:当前window身高,
- virtualHeight/Width:您游戏的原始分辨率(即 1920x1080)
public Rectangle resize(float width, float height){
float aspectRatio = (float)width/(float)height;
float scale = 1.0f;
Vector2 crop = new Vector2(0f, 0f);
if(aspectRatio > getAspectRatio())
{
scale = (float)height/(float)getVirtualLandHeight();
crop.x = (width - getVirtualLandWidth()*scale)/2f;
}
else if(aspectRatio < getAspectRatio())
{
scale = width/(float)getVirtualLandWidth();
crop.y = (height - getVirtualLandHeight()*scale)/2f;
}
else
{
scale = (float)width/(float)getVirtualLandWidth();
}
float w = (float)getVirtualLandWidth()*scale;
float h = (float)getVirtualLandHeight()*scale;
Rectangle viewport = new Rectangle(crop.x, crop.y, w, h);
return viewport;
}
public float getAspectRatio(){
return getVirtualLandWidth() / getVirtualLandHeight();
}
我正在 libgdx 中创建游戏,它在 1920x1080 纵横比和 1280x720 下都运行良好。问题是,一些分辨率,如 1366x768,这在计算机上也很常见,但不能被我的纹理大小(16px)整除,而且它不完全是 16*9,这使得一些像素变得太长或太高。这是正在发生的事情的图像。如果你放大,你会看到一些像素真的很奇怪。
希望这是足够的信息,如果不够请告诉我。
如果所需的分辨率不适合您游戏的纵横比,您需要裁剪绘制区域。
在您的渲染例程下,您应该计算正确的视口
@Override
public void render() {
[...]
// set viewport
Gdx.gl.glViewport((int) _viewport.x, (int) _viewport.y,
(int) _viewport.width, (int) _viewport.height);
[...]
}
要计算正确的视口,您可以使用此函数(我根据 libgdx 为我的游戏引擎编写了此函数)
- 宽度:当前window宽度,
- 身高:当前window身高,
- virtualHeight/Width:您游戏的原始分辨率(即 1920x1080)
public Rectangle resize(float width, float height){
float aspectRatio = (float)width/(float)height;
float scale = 1.0f;
Vector2 crop = new Vector2(0f, 0f);
if(aspectRatio > getAspectRatio())
{
scale = (float)height/(float)getVirtualLandHeight();
crop.x = (width - getVirtualLandWidth()*scale)/2f;
}
else if(aspectRatio < getAspectRatio())
{
scale = width/(float)getVirtualLandWidth();
crop.y = (height - getVirtualLandHeight()*scale)/2f;
}
else
{
scale = (float)width/(float)getVirtualLandWidth();
}
float w = (float)getVirtualLandWidth()*scale;
float h = (float)getVirtualLandHeight()*scale;
Rectangle viewport = new Rectangle(crop.x, crop.y, w, h);
return viewport;
}
public float getAspectRatio(){
return getVirtualLandWidth() / getVirtualLandHeight();
}