遊戲製作相關---HAM教程翻譯本(四)(轉)
遊戲製作相關---HAM教程翻譯本(四)(轉)[@more@] 你們在看了這篇教程後可能想知道這目的或這跟第六天有什麼不同。老實說,沒有太大不同,除了今天的地圖大小是512×512,還有你可以看到怎麼使地圖移動。我們將要對今天的圖形做一點點不同的事情。原因是我不想要一個最佳化的調色盤。如果你一直很注意,你應該已經注意到gfx2gba透過去掉影像中沒有用到的顏色來最佳化調色盤。這很好。然而今天,當我用ham_SetTextCol()時我想用一種確切的顏色, 在之前的Photoshop處理中計算出顏色的索引號是更容易的。 在轉換圖片時,打入: gfx2gba -fsrc -m -t8 -x simple_world.bmp 如果你看了gfx2gba readme,你會發現 ?x 引數可以防止它最佳化調色盤。你也可以發現我略去了-p,因為當你用了?x引數 gfx2gba會忽略掉它。 現在你的gfx資料夾下有了下面這些檔案: simple_world.pal.c simple_world.map.c simple_world.raw.c 現在讓我們來看程式碼: // 主要的 HAM 庫 #include // 影像檔案包含 // gfx2gba -fsrc -m -t8 -x simple_world.bmp #include "gfx/simple_world.pal.c" #include "gfx/simple_world.raw.c" #include "gfx/simple_world.map.c" // 全域性變數 u8 newframe = 1; // Signifies a new frame u16 map_x = 0; // X position of the map u16 map_y = 0; // Y position of the map // 函式宣告 void vbl_func(); // VBL function // 主程式: main() int main() { // 變數 map_fragment_info_ptr bg_simple_world; // 初始化 HAMlib ham_Init(); // 初始化文字顯示系統 ham_InitText(0); // 設定背景模式 ham_SetBgMode(0); // 初始化調色盤 ham_LoadBGPal((void*)simple_world_Palette,256); // 設定文字顏色 ham_SetTextCol(195, 40); // 設定圖塊 ham_bg[1].ti = ham_InitTileSet( (void*)simple_world_Tiles, SIZEOF_16BIT(simple_world_Tiles),1,1); // 設定地圖 ham_bg[1].mi = ham_InitMapEmptySet(3,0); bg_simple_world = ham_InitMapFragment( (void*)simple_world_Map,64,64,0,0,64,64,0); // 複製整張地圖到 BG0 座標 x=0, y=0 ham_InsertMapFragment(bg_simple_world,1,0,0); // 顯示背景 ham_InitBg(1,1,2,0); // 開始 VBL 中斷處理程式 ham_StartIntHandler(INT_TYPE_VBL,(void*)&vbl_func); while(1) { if(newframe) { // 寫一些東西到螢幕上 ham_DrawText(1,1,"512x512 Map example"); ham_DrawText(1,2,"Use pad to scroll around"); ham_DrawText(1,17,"scroll-x: %5d",map_x); ham_DrawText(1,18,"scroll-y: %5d",map_y); // 讓玩家可以移動地圖 if(F_CTRLINPUT_DOWN_PRESSED) { if(map_y < (512-160)) ham_SetBgXY(1,map_x,++map_y); } if(F_CTRLINPUT_UP_PRESSED) { if(map_y > 0) ham_SetBgXY(1,map_x,--map_y); } if(F_CTRLINPUT_RIGHT_PRESSED) { if(map_x < (512-240)) ham_SetBgXY(1,++map_x,map_y); } if(F_CTRLINPUT_LEFT_PRESSED) { if(map_x > 0) ham_SetBgXY(1,--map_x,map_y); } newframe = 0; // 不再有新的幀 } // End of if(newframe) } // 死迴圈 while(1)結束 return 0; } // End of main() //********************** // Function: vbl_func() // Purpose: VBL function //********************** void vbl_func() { newframe = 1; // 開始新的幀 return; } // End of vbl_func() 程式碼解釋 // 全域性變數 newframe 在 main() 使用在整個迴圈中決定是否有新的幀。你可能會想,“新的幀什麼時候產生?” 很好, 在每個 vertical blank (VBL)中斷髮生時。 對你們 map_x 和 map_y 應該非常清楚。 它們是顯示在螢幕上的地圖的左上角的座標。 現在看 main() 函式 // 設定文字顏色 ham_SetTextCol(195, 40); 這應該是計算出相當簡單的函式。基本上你想要前景和背景字型顏色要透過背景調色盤索引值。你會問,“我怎麼計算出索引值?” 很好,看一下 Graphics FAQ. 如果你看了 simple_world.bmp和其調色盤, 你就會發現 195 是紅色,40 是一種紫色。 //為我們的影像設定 map ham_bg[1].mi = ham_InitMapEmptySet(3,0); mymap = ham_InitMapFragment(&simple_world_Map,64,64,0,0,64,64,0); 希望你注意到我傳遞了 64,64 而不是 30,20。 為什麼我這麼做? 好的,我建立起一個512x512象素 而不是240x160象素的背景地圖。 現在讓我們來研究 while(1) if(newframe)... 這將在每個VBL中斷被設成 1, 或 true。 if(F_CTRLINPUT_DOWN_PRESSED)... if(map_y 這將允許地圖往下移動如果它沒有到達底部的話。 不知道為什麼我們用 512 ? 160? 好的, 螢幕的高度有 160 象素。 影像的高度有 512 象素。當地圖在螢幕底部時,影像的頂部將會在 512 ? 160象素。 還是不清楚? Click here. ham_SetBgXY(...) 這個函式可以用來滾動地圖。你透過BG號,新的 X 軸偏移量, 和新的 Y 軸偏移量。你將會發現我使用了 prefix incrementation/decrementation (前置增減量)在 map_x 和 map_y之前。比方說,當使用者摁下 DOWN按鈕, map_y 得到一個增量。 注意: 這個函式不能用於 rotation backgrounds(可旋轉背景,區別與text backgrounds)。 在這裡你需要再知道一個事情 ? tiles(圖塊)。 你一次載入的圖塊數量的極限是- 651 (我相信). 因為我們的影像是 512x512 象素,我一次載入了整個影像,這個我必須考慮。 當你執行 gfx2gba 你會發現在最佳化前有 4096 個圖塊最佳化後只有431個。 如果我的影像再複雜一點,這將會出現一個問題,我將必須不同地載入影像。這類的螢幕滾動有兩種方法,這是其中最簡單地一種。 對於第九天來說已經夠多了,我希望這不是太難。 HAM教程第十天翻譯本 今天的教程跟第八天的很相似,除了我們要使飛機活動起來,使它的發動機看起來好像在旋轉。我從第八天的圖開始,在作些處理。你可以看 這裡 來明白我的意思。為了節省時間,我決定飛機只可以在上、下、左、右四個方向移動,而不允許在對角線上。 這次的教程的一個目的是讓你對定時器有個基本的瞭解。你必須確定明白幀變數和怎麼用它來使發動機動起來。你會注意到這基本上跟第七天的vbl_count 一樣。還要注意animcnt 是怎麼被用的――這非常重要。 用下面的命令轉換圖片: gfx2gba -fsrc -m -pbackground.pal -t8 water.bmp sprite 沒有轉換成tile/map格式,所以再打入: gfx2gba -D -fsrc -pobject.pal -t8 red_plane_anim.bmp 你的gfx 資料夾將會有下面這些檔案: background.pal.c object.pal.c red_plane_anim.raw.c water.map.c water.raw.c 看程式碼: //主要的HAM 庫 #include // 圖形檔案包含 // gfx2gba -fsrc -m -pbackground.pal -t8 water.bmp #include "gfx/background.pal.c" #include "gfx/water.raw.c" #include "gfx/water.map.c" // gfx2gba -D -fsrc -pobject.pal -t8 red_plane_anim.bmp #include "gfx/object.pal.c" #include "gfx/red_plane_anim.raw.c" // 定義宏 #define ANIM_UP 0 #define ANIM_RIGHT 1 #define ANIM_DOWN 2 #define ANIM_LEFT 3 // 全域性變數 u32 dir_plane = ANIM_RIGHT; // 飛機方向 u8 plane; // 飛機的Sprite 索引 u32 plane_x = 110; // X 座標 u32 plane_y = 50; // Y 座標 u32 animcnt = 0; // 動畫的當前幀 u32 frames = 0; // 全域性幀計數器 u32 array_spot = 0; // Sprite的當前影像位置 // Function Prototypes void vbl_func(); // VBL 函式 void query_buttons(); // 查詢輸入 void update_plane_gfx(); // 更新飛機的影像 void update_plane_pos(); // 更新飛機的位置 // 主函式:main() int main() { //變數 map_fragment_info_ptr bg_water; // 背景指標 // 初始化 HAM庫 ham_Init(); // 設定背景顯示模式 ham_SetBgMode(1); // 初始化調色盤 ham_LoadBGPal((void*)background_Palette,256); ham_LoadObjPal((void*)object_Palette,256); // 為我們的影像設定圖塊 ham_bg[0].ti = ham_InitTileSet( (void*)water_Tiles,SIZEOF_16BIT(water_Tiles),1,1); // 設定地圖 ham_bg[0].mi = ham_InitMapEmptySet(3,0); bg_water = ham_InitMapFragment( (void*)water_Map,30,20,0,0,30,20,0); ham_InsertMapFrag
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951725/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遊戲製作相關---HAM教程翻譯本(五)(轉)遊戲
- 遊戲製作詳解自----OpenGL入門教程(四)(轉)遊戲
- [譯] 使用 Flutter 製作 3D 翻轉動畫Flutter3D動畫
- 動作遊戲的本質及相關設計方法論遊戲
- ppt製作的翻書效果及教程
- SAP Spartacus Translation(翻譯) 相關話題
- 組複製官方翻譯四、MonitoringGroupReplication
- initrd解壓和相關製作
- 【電子沙漏】製作相關例程
- 遊戲製作詳解自----OpenGL入門教程(九)(轉)遊戲
- 遊戲製作詳解自----OpenGL入門教程(五)(轉)遊戲
- 使用Urllib2製作有道翻譯器
- 遊戲修改器製作教程四:用API讀寫記憶體遊戲API記憶體
- 翻譯 | SpringBoot相關的面試問題Spring Boot面試
- Flutter遊戲引擎Flame -- 教程翻譯和例子解析Flutter遊戲引擎
- [翻譯] 用 CSS 背景混合模式製作高階效果CSS模式
- [翻譯]Play框架1.2.7版本教程(8) - 新增驗證框架
- 遊戲製作之我見:) (轉)遊戲
- Yurii談翻譯(四)怎樣翻譯更地道:翻譯如鋪路
- 關於單機遊戲製作中的物件重用問題(轉)遊戲物件
- [翻譯 EF Core in Action 2.4] 載入相關資料
- python製作查詢單詞翻譯的指令碼Python指令碼
- Webpack4系列教程(四) CSS相關配置WebCSS
- ZooKeeper 官方教程[翻譯]
- [翻譯]CMAKE官方教程
- 翻譯完了一本書
- 求 PHP 轉 java 的相關教程PHPJava
- [翻譯]關於通用文件轉換器Pandoc
- 有關RFC文件的翻譯說明 (轉)
- Dreamweaver製作簡易的拼圖遊戲教程遊戲
- Java 相關的編譯技術(轉)Java編譯
- 完成遊戲策劃設計製作的關鍵:推動力(轉)遊戲
- [翻譯]程式設計師需要掌握的6項相關技能程式設計師
- 囊括多項年度最佳遊戲!《黑帝斯》製作團隊談論本作起源遊戲
- 翻譯:EJB in a Nutshell (轉)
- 中國遊戲行業市場分析(一)關於國內遊戲製作的問題 (轉)遊戲行業
- Electron教程翻譯2:安裝
- 打算翻譯一本機器學習的書機器學習