Android dip vis像素。我的2d瓷砖地图遇到了可怕的麻烦?

时间:2011-11-14 12:48:06

标签: java android 2d tiles

我已经搜索/阅读了所有的倾角到像素的翻译,但我感觉有点不知所措,我确信它非常容易掌握,但我很老了:(所以我如果有人有时间的话,我会在这件事上寻求帮助。

我有一个使用SurfaceView的安卓游戏,它将2d tilemap绘制到屏幕上以进行益智游戏。我愚蠢地硬编码了我的设备的所有值,只是为了让它运行起来。现在它完全100%完成,我出去买了一个三星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 个答案:

答案 0 :(得分:1)

px = dp *(dpi / 160) px =像素值,dp =显示独立像素,dpi =每英寸点数(设备的分辨率)

这是转换的简单fromula。

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

这些是x和y dpi值,因此根据它们,您可以将像素硬编码值重新定义为倾角值(水平轴和垂直轴的值不同)