android - установить начальную точку в левом верхнем углу на libgdx

я хочу использовать libgdx в качестве решения для масштабирования приложений на основе соотношения сторон экрана. я нашел эту ссылку и считаю ее действительно полезной: -libgdx/" rel="nofollow">http://blog.acamara.es/2012/02/05/keep-screen-aspect-ratio-with-other-resolutions-using-libgdx/

я довольно ржавый с opengl (не писал для него годами), и я хочу использовать пример по этой ссылке, чтобы было легко помещать изображения и формы. к сожалению, отправная точка находится посередине. я хочу использовать его, как и на многих других платформах - верхний левый угол должен быть (0,0), а нижний правый угол должен быть (targetWidth-1, targetHeight-1), насколько я помню, мне нужно переместить (перевести) и поверните камеру, чтобы добиться этого, но я не уверен.

вот мой модифицированный код примера ссылки для метода onCreate:

    @Override
public void create()
  {
  camera=new OrthographicCamera(VIRTUAL_WIDTH,VIRTUAL_HEIGHT);
  // camera.translate(VIRTUAL_WIDTH/2,VIRTUAL_HEIGHT/2,0);
  // camera.rotate(90,0,0,1);
  camera.update();
  //
  font=new BitmapFont(Gdx.files.internal("data/fonts.fnt"),false);
  font.setColor(Color.RED);
  //
  screenQuad=new Mesh(true,4,4,new VertexAttribute(Usage.Position,3,"attr_position"),new VertexAttribute(Usage.ColorPacked,4,"attr_color"));
  Point bottomLeft=new Point(0,0);
  Point topRight=new Point(VIRTUAL_WIDTH,VIRTUAL_HEIGHT);
  screenQuad.setVertices(new float[] {//
      bottomLeft.x,bottomLeft.y,0f,Color.toFloatBits(255,0,0,255),//
          topRight.x,bottomLeft.y,0f,Color.toFloatBits(255,255,0,255),//
          bottomLeft.x,topRight.y,0f,Color.toFloatBits(0,255,0,255),//
          topRight.x,topRight.y,0f,Color.toFloatBits(0,0,255,255)});
  screenQuad.setIndices(new short[] {0,1,2,3});
  //
  bottomLeft=new Point(VIRTUAL_WIDTH/2-50,VIRTUAL_HEIGHT/2-50);
  topRight=new Point(VIRTUAL_WIDTH/2+50,VIRTUAL_HEIGHT/2+50);
  quad=new Mesh(true,4,4,new VertexAttribute(Usage.Position,3,"attr_position"),new VertexAttribute(Usage.ColorPacked,4,"attr_color"));
  quad.setVertices(new float[] {//
  bottomLeft.x,bottomLeft.y,0f,Color.toFloatBits(255,0,0,255),//
      topRight.x,bottomLeft.y,0f,Color.toFloatBits(255,255,0,255),//
      bottomLeft.x,topRight.y,0f,Color.toFloatBits(0,255,0,255),//
      topRight.x,topRight.y,0f,Color.toFloatBits(0,0,255,255)});
  quad.setIndices(new short[] {0,1,2,3});
  //
  texture=new Texture(Gdx.files.internal(IMAGE_FILE));
  spriteBatch=new SpriteBatch();
  spriteBatch.getProjectionMatrix().setToOrtho2D(0,0,VIRTUAL_WIDTH,VIRTUAL_HEIGHT);
  }

до сих пор мне удавалось использовать этот код, чтобы использовать масштабированные координаты и по-прежнему сохранять соотношение сторон (что здорово), но мне не удалось переместить начальную точку (0,0) в верхний левый угол. .

пожалуйста, помогите мне .


РЕДАКТИРОВАТЬ: хорошо, после некоторого тестирования я обнаружил, что причина того, что он не работает, заключается в том, что я использую spriteBatch. Я думаю, что он игнорирует камеру. этот код возникает в части рендеринга. Что бы я ни делал с камерой, она все равно будет показывать те же результаты.

@Override
public void render()
  {
  if(Gdx.input.isKeyPressed(Keys.ESCAPE)||Gdx.input.justTouched())
    Gdx.app.exit();
  // update camera
  // camera.update();
  // camera.apply(Gdx.gl10);
  // set viewport
  Gdx.gl.glViewport((int)viewport.x,(int)viewport.y,(int)viewport.width,(int)viewport.height);
  // clear previous frame
  Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  //
  final String msg="test";
  final TextBounds textBounds=font.getBounds(msg);
  spriteBatch.begin();
  screenQuad.render(GL10.GL_TRIANGLE_STRIP,0,4);
  quad.render(GL10.GL_TRIANGLE_STRIP,0,4);
  Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D);
  spriteBatch.draw(texture,0,0,texture.getWidth(),texture.getHeight(),0,0,texture.getWidth(),texture.getHeight(),false,false);
  spriteBatch.draw(texture,0,VIRTUAL_HEIGHT-texture.getHeight(),texture.getWidth(),texture.getHeight(),0,0,texture.getWidth(),texture.getHeight(),false,false);
  font.draw(spriteBatch,msg,VIRTUAL_WIDTH-textBounds.width,VIRTUAL_HEIGHT);
  spriteBatch.end();
  }

person android developer    schedule 25.02.2012    source источник


Ответы (1)


Эти строки:

camera.translate(VIRTUAL_WIDTH/2,VIRTUAL_HEIGHT/2,0);
camera.rotate(90,0,0,1);

следует двигать камеру так, чтобы она делала то, что вы хотите. Однако в моем коде есть дополнительный:

camera.update()

вызовите после того, как он вызовет перевод, и похоже, что вы упускаете это. документ для Camera.update< /а> говорит:

update
public abstract void update()

Recalculates the projection and view matrix of this camera and the Frustum planes. Use this after you've manipulated any of the attributes of the camera.
person P.T.    schedule 28.02.2012
comment
кажется, что это не работает - зеленый прямоугольник не занимает все пространство окна, а текст и изображения не отображаются в правильных местах. - person android developer; 29.02.2012
comment
на андройде тоже не работает. я не понимаю, что мне не хватает? я также хочу поместить начальную точку в верхний левый угол, а не текущий (нижний левый). - person android developer; 29.02.2012
comment
Ваша камера повернута на 90 градусов ... это путает X и Y? Попробуйте удалить эту строку или изменить ее на 180? Без картинок или некоторых подробностей трудно понять, что конкретно означает не работает. Однако, возможно, пришло время для нового вопроса. - person P.T.; 29.02.2012
comment
камера повернута, потому что я пытался установить начальную точку самостоятельно. Исходная начальная точка находится в середине экрана, поэтому я сначала переместил камеру в . я повернул его, потому что значения оси не сверху слева - это означает, что чем больше вы двигаетесь вправо и вниз, тем больше x и y увеличиваются. about не работает, я дал примерную ссылку, которая в настоящее время идентична моей (поскольку я еще не нашел решения). как только я получу рабочее решение, я опубликую его. - person android developer; 29.02.2012