Android провал в пикселях. Возникли ужасные проблемы с моей 2d плиткой? - PullRequest
0 голосов
/ 14 ноября 2011

Я искал / прочитал все переводы в дип-пиксели, но я чувствую себя немного ошеломленным этим, я уверен, что это невероятно легко понять, но я довольно старая школа :( Так что яЯ прошу помощи по этому вопросу, если у кого-то есть время.

У меня есть игра для Android с использованием SurfaceView, которая рисует 2-мерную карту тайлов на экране для игры-головоломки. Я тупожестко запрограммировав все значения для моего устройства, просто для того, чтобы его запустить и запустить. Теперь он полностью готов на 100%, я вышел и купил вкладку Samsung Galaxy, и она выглядит как какашка! Может кто-нибудь пролить свет на то, как получить следующеекод для работы в dip / dp, а не в пикселях, пожалуйста?

TIA!

    public static int MAX_WIDTH                 = 320; // width of map area
    public static int MAX_HEIGHT                = 480; // height of map area
    public static final int TILE_SIZE_2     = 32; // tile size dimensions

Затем я устанавливаю область моей карты в заранее определенную область

    map_area = new int[MAX_WIDTH/TILE_SIZE][MAX_HEIGHT/TILE_SIZE];

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

        public void mapStringToMap(String mapString){
    // clear the map first
    int i= 0;
    rocks = new CTile[mapString.length()];

    try
    {
    // now add the rock types to the map array
    for(int x = 0; x<MAX_WIDTH/TILE_SIZE; x++){
        for(int y =0; y<MAX_HEIGHT/TILE_SIZE; y++){
            rocks[i] = new CTile();
            setMapData(x, y, Integer.parseInt(String.valueOf(mapString.charAt(i))));
            rocks[i].setRockType(Integer.parseInt(String.valueOf(mapString.charAt(i))));
            rocks[i].setX(x*TILE_SIZE);
            rocks[i].setY(y*TILE_SIZE);
            rocks[i].setRockId(i);

            if(Integer.parseInt(String.valueOf(mapString.charAt(i))) == GOLD_TILE){
                rocks[i].setRockBitmap(goldTile);
                // increase the number of rocks for this level
                level_rock_count+=3;
            }else if(Integer.parseInt(String.valueOf(mapString.charAt(i))) == SILVER_TILE){
                rocks[i].setRockBitmap(silverTile);
                // increase the number of rocks for this level
                level_rock_count+=2;
            }else if(Integer.parseInt(String.valueOf(mapString.charAt(i))) == COPPER_TILE){
                rocks[i].setRockBitmap(copperTile);
                // increase the number of rocks for this level
                level_rock_count++;
            }else if(Integer.parseInt(String.valueOf(mapString.charAt(i))) == START_TILE){
                dave.setX(x*TILE_SIZE);
                dave.setY(y*TILE_SIZE);
            }else if(Integer.parseInt(String.valueOf(mapString.charAt(i))) == DIAMOND_TILE_1){
                rocks[i].setRockBitmap(diamondTile1);
                // increase the number of rocks for this level by 4!
                level_rock_count += 4;
            }

            // move on 
            i++;
        }
    }
    }
    catch(ArrayIndexOutOfBoundsException e)
    {
        e.printStackTrace();
    }
}

Какрезультат, он прекрасно работает на моем устройстве, но я пытаюсь прикрыть как человеку телефонов, как я могу, очевидно.Рисунок карт в значительной степени идентичен приведенному выше, все значения сетки x / y * TILE_SIZE и т. Д.

Я уверен, что собираюсь ударить себя, но я просто не могу обернуть головувокруг всего, что я прочитал.

Приветствия.

1 Ответ

1 голос
/ 14 ноября 2011

px = dp * (dpi / 160) px = значение пикселя, dp = отображение независимых пикселей, dpi = число точек на дюйм (разрешение вашего устройства)

Это простая формула для преобразования.

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

Это значения x и y dpi, поэтому в соответствии с ними вы можете переопределить жестко закодированные значения в пикселях для значений провала (которые будут отличаться для горизонтальной и вертикальной осей)

...