1

更新ハードウェア ボタンがないためにタブレットの静的な通知バーが原因で、これは問題のようです。私はそれについて考えていませんでした。とにかく、TF101 の場合、1280x752 の解像度を返すので、約 1.702 (80 : 47) の比率になります。縦方向に 33.5 または 11.75 などの適切な単位サイズを使用すると、適切なスケーリングが得られ、これにより、歪んだピクセルの問題が修正されるようです。 更新を終了

タイル マップに 16x16 ユニットを使用してゲームをセットアップしています。デスクトップ プロジェクトと Android プロジェクトの両方で解像度 1280x800 を使用しています。これをテストして、TF101 asus タブレットでどのように表示されるかを確認しています。現在、20x12.5 (wxh) 単位のカメラを使用しており、デスクトップ プロジェクトでピクセル スケーリングがないことに気付きましたが、Android でゲームを実行すると、奇妙なスケーリングと緑色の水平線が表示されます。スクリーン ショットに示されているように、タブレットの x 軸に沿ってさらに 1/4 セル移動することもできます。Android プロジェクトのピクセルはまったく均一に見えません。

verticalTiles の量を 12.5f に設定してから、 horizo​​ntalTiles の量を次のように計算します。

verticalTiles = 12.5f;
...
horizontalTiles = (float) width / (float) height * verticalTiles;
camera = new OrthographicCamera(horizontalTiles, verticalTiles);

縦横比が異なるデバイスでマップを多かれ少なかれ表示することを目指していますが、正しく機能していないようです。どんな助けでも大歓迎です。

Android キャプチャ - http://imageshack.us/f/7/dsvg.png/ - 屋根の端のハイライトに注目してください。それらはまったく均一ではありません。

デスクトップ キャプチャ - http://imageshack.us/f/853/5itv.png/

現在の MainGame クラス

package com.bitknight.bqex;

/* Bunch of imports */

public class MainGame implements ApplicationListener {
  private OrthographicCamera camera;
  private SpriteBatch spriteBatch;
  private TiledMap map;
  private OrthogonalTiledMapRenderer mapRenderer;
  private Texture texture;
  private Texture clothArmor;
  private Sprite sprite;
  private BitmapFont font;

  private float horizontalTiles = 0;
  private float verticalTiles = 12.5f;
  private int hoverTileX = 0;
  private int hoverTileY = 0;

  private TiledMapTileLayer layer;
  private Cell cell;
  private TiledMapTile canMoveToTile;
  private TiledMapTile cannotMoveToTile;

  private AnimatedTiledMapTile animatedStopTile;
  private AnimatedTiledMapTile animatedGoTile;

  private Texture spriteSheet;
  private TextureRegion region;

  private Player player;

  float h, w;
  float ppuX, ppuY;

  @Override
  public void create() {    
    // Setup the animated tiles
    Array<StaticTiledMapTile> tileArray;
    // Start position on the sheet
    int startX = 192;
    int startY = 1568;

    spriteSheet = new Texture(Gdx.files.internal("data/maps/tilesheet.png"));
    spriteSheet.setFilter(TextureFilter.Nearest, TextureFilter.Nearest);
    // We are trying to load two strips of 4 frames, 8 total
    for( int i = 0; i < 2; ++i ) {
      tileArray = new Array<StaticTiledMapTile>(4);
      for( int j = 0; j < 4; ++j ) {
        region = new TextureRegion(spriteSheet, startX, startY, 16, 16);
        tileArray.add(new StaticTiledMapTile(region));
        startX += 16;
      }

      if( i == 0 ) {
        animatedStopTile = new AnimatedTiledMapTile(1/10f, tileArray);
      } else {
        animatedGoTile = new AnimatedTiledMapTile(1/10f, tileArray);
      }
    }

    // Load the map
    map = new TmxMapLoader().load("data/maps/base.tmx");
    // Setup the two tiles that show movable and not movable sprites
    canMoveToTile = map.getTileSets().getTileSet(0).getTile(1959);
    canMoveToTile.setBlendMode(BlendMode.ALPHA);
    cannotMoveToTile = map.getTileSets().getTileSet(0).getTile(1958);
    cannotMoveToTile.setBlendMode(BlendMode.ALPHA);

    // Manually create the layer used to show the cursor sprites
    layer = new TiledMapTileLayer(100, 100, 16, 16);
    layer.setName("display");
    cell = new Cell();
    cell.setTile(canMoveToTile);
    layer.setOpacity(1f);
    mapRenderer = new OrthogonalTiledMapRenderer(map, 1/16f);
    spriteBatch = new SpriteBatch();

    font = new BitmapFont(Gdx.files.internal("data/consolas.fnt"), false);
    font.setScale(0.6f);

    texture = new Texture(Gdx.files.internal("data/maps/tilesheet.png"));
    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    clothArmor = new Texture(Gdx.files.internal("data/img/native/clotharmor.png"));
    region = new TextureRegion(clothArmor, 32, 256, 32, 32);
    sprite = new Sprite(region);
    sprite.setOrigin(0.5f, 0.5f);
    sprite.setPosition(0f - 0.5f, 0f);
    sprite.setSize(2, 2);

    // Setup player and associated animations
    Array<TextureRegion> regions = new Array<TextureRegion>();

    player = new Player();
  }

  @Override
  public void dispose() {
    spriteBatch.dispose();
    texture.dispose();
    clothArmor.dispose();
    spriteSheet.dispose();
  }

  @Override
  public void render() {
    player.update(Gdx.graphics.getDeltaTime());

    camera.update();

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

    if( Gdx.input.isKeyPressed(Input.Keys.ESCAPE) ) {
      Gdx.app.exit();
    }

    // Clear the last cell
    layer.setCell(hoverTileX, hoverTileY, null);
    // Convert screen coordinates to world coordinates
    Vector3 worldCoordinates = new Vector3(Gdx.input.getX(0), Gdx.input.getY(0), 0);
    camera.unproject(worldCoordinates);
    hoverTileX = (int)(worldCoordinates.x);
    hoverTileY = (int)(worldCoordinates.y);

    TiledMapTileLayer layer = (TiledMapTileLayer)map.getLayers().get("collision");

    if( Gdx.input.isTouched(0) ) {
      //sprite.setPosition(hoverTileX - 0.5f, hoverTileY);
      player.pos.x = hoverTileX - 0.5f;
      player.pos.y = hoverTileY - 0.25f;
      cell.setTile(animatedGoTile);
    } else {
      if (layer.getCell(hoverTileX, hoverTileY) != null) {
        cell.setTile(cannotMoveToTile);
      } else {
        cell.setTile(canMoveToTile);
      }
    }
    layer.setCell(hoverTileX, hoverTileY, cell);

    mapRenderer.setView(camera);
    mapRenderer.render();

    mapRenderer.getSpriteBatch().begin();
    mapRenderer.renderTileLayer(layer);
    mapRenderer.getSpriteBatch().end();

    spriteBatch.setProjectionMatrix(camera.combined);
    spriteBatch.begin();
    player.render(spriteBatch);
    spriteBatch.end();
  }

  @Override
  public void resize(int width, int height) {    
    horizontalTiles = (float) width / (float) height * verticalTiles;
    camera = new OrthographicCamera(horizontalTiles, verticalTiles);
    w = width;
    h = height;
  }

  @Override
  public void pause() {
  }

  @Override
  public void resume() {
  }

}
4

1 に答える 1

1

ハードウェア ボタンがないためにタブレットの静的な通知バーが原因で、これは問題のようです。私はそれについて考えていませんでした。とにかく、TF101 の場合、1280x752 の解像度を返すので、約 1.702 (80 : 47) の比率になります。縦方向に 33.5 または 11.75 などの適切な単位サイズを使用すると、適切なスケーリングが得られ、これにより、歪んだピクセルの問題が修正されるようです。

また、これは私の場合、TF101 タブレットには適していますが、実際には優れたソリューションではありません。これは、優れたソリューションについて語る Gemserk シリーズです。

http://blog.gemserk.com/2013/01/22/our-solution-to-handle-multiple-screen-sizes-in-android-part-one/

于 2013-09-08T11:06:20.780 に答える