Android - установить начальную точку в левом верхнем углу на libgdx - PullRequest
0 голосов
/ 25 февраля 2012

Я хочу использовать libgdx в качестве решения для масштабирования приложений на основе соотношения сторон экрана.Я нашел эту ссылку, и я считаю ее действительно полезной: http://blog.acamara.es/2012/02/05/keep-screen-aspect-ratio-with-different-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();
  }

1 Ответ

0 голосов
/ 28 февраля 2012

Эти строки:

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

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

camera.update()

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

* * 1010
...