遊戲製作相關---HAM教程翻譯本(四)(轉)

post0發表於2007-08-12
遊戲製作相關---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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章