在開發很多類型的游戲中,地圖系統都需要良好的設計,直觀的說,我們需要的地圖系統僅僅是一個2D數組,然后用最快的方式將數組影射到屏幕上。
游戲中的地圖通常不是由程序員用鍵盤輸入到程序里然后再在程序中修改然后再修改的狂亂過程,而是一般先由程序員做一個地圖編輯器,在這個地圖編輯器中用鼠標點點點,再保存的過程,或者是從網絡上下載的一些成熟編輯器比如:mappy這樣的工具生成地圖,再用腳本語言為mappy寫一個應該保存成什么樣格式的程序。通常地圖分為45度角,側視角和俯視角等等,45度角的也有很多種,這種視角相對俯視角和側視叫較復雜,我們主要討論俯視角,其實側視叫和俯視角主要的區別是圖片的表現風格不一樣,比如雷電這樣的空戰就是俯視角,mario這樣的游戲就是側視角,可以用相同的地圖編輯器做出來。綜上,你要知道游戲地圖不是程序員用程序寫出來的,你喜歡寫也可以,修改起來較麻煩,也不能像資源一樣動態治理而是一次性讀入到內存里,比較不爽。
在這個文章里面,我們假設我們的2D數組是通過,資源讀取出來的,內容如下:
public static byte[][] B_MAZE_2D_ARRAY = {
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
, {
0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}
, {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0}
, {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}
, {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
這個地圖中一共0,1兩種byte數,0代表一種圖塊,1代表一種圖塊,也可以是動畫圖塊,你繪制的時候區別一下就可以了。因為我們程序里面想把這整個圖形繪制出來的話有N多種方案,我給出兩個比較合理的方案,當然第二種是比較優化的.我們假設你的主角一直在屏幕中心,當你主角移動的時候,地圖相應的變化,就是說主角為參照物,地圖動.我們知道地圖的大小要超過屏幕的,我們需要設定一個坐標系統,我的方法是,以左上角為0,0也就是和我們常用的Canvas的坐標系統是相同的,我們的圖塊大小為:ELEMENT_WIDTH, ELEMENT_HEIGHT,所以我們整個地圖的面積(絕對面積)是 ELEMENT_WIDTH * 橫坐標的塊數 * ELEMENT_HEIGHT*縱坐標的塊數。因此,我們把這么大的題圖畫在屏幕上時,需要把需要畫的坐標面積(也就是屏幕面積)從這個地圖中拿出來,其他地方被切除,這就比較的高效了。
|
新聞熱點
疑難解答