【问题标题】:Rendering obstacles with Android using Libgdx使用 Libgdx 在 Android 中渲染障碍物
【发布时间】:2015-12-29 21:56:40
【问题描述】:

我正在尽力将纹理渲染到屏幕上。我也尝试过渲染一个精灵,但没有一个成功。据我了解,相机需要一个视口,并且在渲染世界时最好使用世界单位。我明白有关单位的想法,这是有道理的。但如果你说你的世界是 100X100,那么你的精灵背景也必须是 100X100。我仍然不明白应该如何覆盖整个设备屏幕(安卓手机)。我想以不同的分辨率提供资产或实施拉伸视口可能是理想的。另外,我正在尝试实现私有 moveCamera 方法。我的目标是 让相机以随机方式移动,显示我的部分纹理。当我第一次运行代码时,我看到相机移动了,然后屏幕移动了 变红然后变黑。我想我可能不得不夹住相机以迫使它保持在资产的范围内。请帮我设置这个功能。

这是我的代码:(无法渲染)

public class myGdxGame extends ApplicationAdapter{

 @Override
 public void Create(){
 scenery= new Texture...;
 sprity= new Sprite(new Texture(..));
 sprity.setPosition(0f,0f);
 sprity.setSize(100f,100f);

 w= Gdx.graphics.getWidth();
 h= Gdx.graphics.getHeight();

 moveX=0f;//float value
 moveY=0f;//float value
 time= System.currentTimeMillis();

 camera= new OrthoGraphicCamera(30,30*(h/w));
 camera.position.set(camera.viewportWidth/2f,camera.viewportHeight/2f,0);
 camera.update();

 }

 @Override
 public void resize(int width, int height) {
 camera.viewportWidth = 30f;        
 camera.viewportHeight = 30f * (height/width);
 camera.update();

}

@Override
public void render () {

moveCamera();
camera.update();
batch.setProjectionMatrix(camera.combined);

Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

batch.begin();
batch.draw(scenery, 0, 0);
batch.end();

}

public void moveCamera(){

if(System.currentTimeMillis()-time>2000){

double random=Math.round(Math.random()*100);
double random2=Math.round(Math.random()*100);
double d=random/10;
double e=random2/10;
int f=(int)d;
int g=(int)e;
moveX=moveX+f;
moveY=moveY+g;

time=System.currentTimeMillis();
camera.translate(moveX,moveY,0);
camera.update();

}
}

}

【问题讨论】:

    标签: android libgdx textures rendering sprite


    【解决方案1】:

    你的错误在这一行:

    camera.viewportHeight = 30f * (height/width);
    

    heightwidth 都是整数,所以如果width 大于height(height/width) == 0,那么您将视图高度设置为0。

    将其中一个转换为浮点数,您的问题将得到解决。

    camera.viewportHeight = 30f * ((float)height/width);
    

    请注意,您将世界宽度设置为 30,而不是您描述的 100。

    我不认为 StretchViewport 是一个好的解决方案,因为东西看起来会变形。我建议使用 ExtendViewport 并根据极端值之一(4:3 或 16:9)为其指定尺寸。然后让你的背景足够大,以覆盖额外的区域以达到另一个极端。

    例如,您可以创建一个new ExtendViewport(400, 300),因此它的设计比例为 4:3。然后将您的背景图片设置为至少 534 x 300,这样如果您获得 16:9 的屏幕(相反的极端),它仍然可以覆盖整个区域。

    或者反过来:制作一个new ExtendViewport(800, 450),这样它就被设计成16:9的比例。然后将您的背景图片设置为至少 800 x 600,这样如果您获得 4:3 屏幕(相反的极端),它仍然可以覆盖整个区域。

    【讨论】:

    • 如果我将相机放置在 x 坐标是视口宽度一半的负数而 y 坐标为零的位置,这是否意味着我只能看到一半的视口和剩余的屏幕?会黑屏吗? Libgdx 中的默认相机位置是什么?我听说是在左上角,而精灵的默认位置是在手机屏幕的左下角? @Tenfour04
    • 相机的位置不会像您描述的那样导致裁剪。如果您将任何东西放在那里,您将看到位于负坐标区域的世界部分。 Libgdx(和 OpenGL)中正交相机的默认位置是 (0, 0) 位于屏幕中心,Y 轴指向上方。如果您使用视口并选择使用 update 方法将相机居中,则 (0,0) 将位于左下方。仅当您选择翻转相机上的 Y 轴时,左上角才会出现,如果您已经习惯了使用 Flash 或类似工具,您可能想要这样做。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2012-04-08
    • 2011-08-25
    • 2022-07-22
    相关资源
    最近更新 更多