2010-11-10 37 views
2

我正在嘗試創建的應用程序是棋盤遊戲。它將有一個位圖作爲棋盤和棋子,移動到棋盤上的不同位置。該板的一般設計是方形的,具有一定數量的行和列,並具有用於外觀的邊框。想象一下國際象棋棋盤或拼字遊戲板。Android - 確定不同分辨率的位圖上的特定位置(X,Y座標)?

在使用位圖之前,我首先通過手動繪製它來創建電路板和寄存器 - drawLine & drawRect。我決定了邊框的寬度有多少像素基於「onSizeChanged」中傳遞的屏幕寬度和高度。剩餘的屏幕除以我需要的列數或行數。

對於實施例起見,讓我們說,屏幕尺寸是102 X 102

我可能選擇在1設置邊界並設置行數在10 &列這將使100×100個左(減去兩個以考慮頂部&底部邊界以及左/右邊界)。然後將列和行設置爲10,這將爲高度和寬度留下10個像素。

無論通過哪種屏幕尺寸,我都會存儲寄存器寬度的多少個像素以及電路板上每個方塊的高度&。我確切地知道在屏幕上根據簡單的公式確定屏幕上的什麼位置,並且我確切地知道用戶觸摸什麼單元格來進行移動。

現在如何與位圖一起工作?這意味着,如果我爲每個密度創建3個不同的背景位圖,它們是不是會調整大小以適合每個設備的屏幕分辨率,因爲從我讀的內容來看,不僅有3種屏幕分辨率,而且現在有平板電腦 - 更多。如果我或Android向上或向下縮放位圖以適應當前設備的屏幕尺寸,我如何知道邊框的縮放範圍以及每個方塊的尺寸,以便確定移動某個部分的位置或計算玩家的位置感動。到目前爲止,我看過的例子只是展示瞭如何縮放整體位圖並獲得整體位圖寬度和高度。但是,我沒有看到如何判斷電路板的每個部分在縮放之後會有多少像素寬或高。當我根據onSizeChanged的屏幕尺寸繪製每一行和矩形時,我總是知道這些尺寸。

如果任何人有任何示例代碼或URL指向我,我可以就這個問題與位圖的讀取,我將不勝感激。

順便說一句,這裏有一些關於如何知道我的遊戲板(邊框和正方形)尺寸的示例代碼(非常簡化),無論屏幕尺寸如何。現在我只需要知道如何將這個與電路板做成一個可以縮放到任何屏幕尺寸的位圖。


@Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     intScreenWidth = w; 
     intScreenHeight = h; 

     // Set Border width - my real code changes this value based on the dimensions of w 
     // and h that are passed in. In other words bigger screens get a slightly larger 
     // border. 
     intOuterBorder = 1; 

     /** Reserve part of the board for the boardgame and part for player controls & score 
      My real code forces this to be square, but this is good enough to get the point 
      across. 
     **/ 
     floatBoardHeight = intScreenHeight/4 * 3; 

     // My real code actually causes floatCellWidth and floatCellHeight to 
     // be equal (Square). 
     floatCellWidth = (intScreenWidth - intOuterBorder * 2)/intNumColumns; 
     floatCellHeight = (floatBoardHeight - intOuterBorder * 2)/intNumRows; 

     super.onSizeChanged(w, h, oldw, oldh); 
    } 


我想我找到了答案。我可能無法在單個縮放位圖中找到每個可播放方塊的確切寬度/高度和位置,但通過查看SDK中的Snake示例,我發現它不會爲整個板創建1個位圖,並且可以縮放它基於屏幕尺寸 - 相反,它會爲每個圖塊創建一個位圖,然後根據屏幕分辨率和屏幕上需要的圖塊數量來縮放圖塊 - 就像我手動繪製圖板時一樣。使用這種方法,我應該能夠找到板上所有可玩方塊的確切像素邊界。我只需要將棋盤分成多個方塊的位圖。我可能將不得不爲邊界做類似的處理,所以我可以在縮放之後檢測它們的寬度/高度。

現在我將測試它來驗證,但我期望它能夠基於我在Snake SDK示例中看到的工作。

--Mike


我測試的方式做什麼,我是問,它似乎工作。以下是我所做的:

我爲電路板創建了一個320 x 320位圖。它由邊框和方塊組成(像棋盤)。邊框的寬度一直是10個像素。正方形是20 x 20像素。

我通過onSizeChanged檢測到屏幕的寬度和高度。在480×800的顯示,我將設置新的寬度爲主板是480×480,並使用下面的代碼來縮放整個事情:


protected void onSizeChanged(int w, int h, int oldw, int oldh) {   
    floatBoardWidth = w; 
    floatBoardHeight = floatBoardWidth; 

    bitmapScaledBoard = Bitmap.createScaledBitmap(bitmapBoard, (int)floatBoardWidth, (int)floatBoardHeight, true);  

     super.onSizeChanged(w, h, oldw, oldh); 
} 

現在,爲了檢測多少個像素寬的邊界被縮放到了多少個像素,並且正方形的寬度是多少,我首先計算了整個圖像的縮放比例。我知道該位圖是320 x 320,因爲我創建了它。我用下面的公式來計算圖像的縮放比例:

floatBoardScale = floatScreenWidth/320;

對於480寬度的屏幕,floatBoardScale等於:1.5。然後爲了計算我的邊界在完整位圖內的比例,我做了:

floatBorderWidth = 10 * floatBoardScale;

10是我的320 x 320位圖中的原始邊框寬度。在我的最終代碼中,我不會硬編碼值,我會使用變量。無論如何,在這個公式的情況下,新的計算出的邊框寬度應該是:15

當我將相同的比例因子乘以棋盤格(原始位圖中的20 x 20)時,我得到了30 x 30.當我在公式中使用這些值來計算一個人碰到什麼平方時,它就起作用了。我觸摸廣場的每個角落,並在中心,並始終計算出正確的位置。這很重要,所以無論屏幕分辨率如何,我都知道用戶想要移動的部分,並在視覺上顯示在正確的位置。

我希望這可以幫助任何可能有同樣問題的人。此外,如果任何人有更好的方法來完成同樣的事情,請張貼它。

回答

2

有幾件事。首先,開始閱讀關於如何support multiple screens.密切關注汲取以及它們如何工作。

接下來,手錶this video(至少第15-20分鐘)。

本主題不是Cakewalk的掌握。我發現最好從我的代碼中開始玩。我會建議創建一個表面視圖,並開始討論一些位圖,不同的模擬器(屏幕大小和密度)以及不同類型的可繪製文件夾。

不幸的是,這個話題比我想Google承認的還要多,儘管它對於某些類型的應用程序來說絕對可行並不容易。

最後,你應該考慮熬煮你的問題更直截了當,如果你是不是在找一個抽象的回答(像這樣)。

祝你好運!

+0

在18:20到視頻開始,它顯示了我在說什麼,但它並沒有回答這個問題。它顯示了縮放比例如何保持整個圖像大小相同,但位圖中的單個元素不會位於相同的像素位置或可能會丟失。所以在這部影片中,說我需要知道是否有人觸動了眼睛。我需要知道每個分辨率下眼睛的座標。我怎麼知道它將縮放到每個分辨率/密度的像素是什麼?視頻和我沒有找到答案這個問題。也許答案是你不能。 – Mike 2010-11-11 04:46:58

相關問題