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

post0發表於2007-08-12
遊戲製作相關---HAM教程翻譯本(五)(轉)[@more@]

  到了第11天我將說明怎麼旋轉背景。 HAM 做這個很簡單,只要用 RotBgEx() 函式。這個函式十分強大,它不僅能旋轉背景還能放大縮小還有捲動背景。注意: 還有一個叫做 RotBg() 的函式, 但是我更喜歡 RotBgEx() 因為你除了旋轉還可以控制更多。

  

  噢,不要忘了。你只能在模式1和模式2中旋轉。 在模式1中,背景2可以旋轉/縮放。在模式2中,背景2和背景3可以旋轉/縮放。如果你忘了請再看一下 Day 1 。

  

  用下面這句轉換圖片:gfx2gba -fsrc -m -protate.pal -rs -t8 rotate.bmp

  

  你的 gfx 資料夾下會有下面這些檔案:rotate.map.crotate.pal.c

  rotate.raw.c

  

  下面看程式碼:

  

  // 主要 HAM 庫#include "mygba.h"

  

  // 包含圖形標頭檔案// gfx2gba -fsrc -m -protate.pal -rs -t8 rotate.bmp#include "gfx/rotate.map.c"

  #include "gfx/rotate.pal.c"

  #include "gfx/rotate.raw.c"

  

  // 全域性變數u32 frames = 0;

  u32 zoomx = 256; // X co-ordinate of zoom centeru32 zoomy = 256; // Y co-ordinate of zoom centeru32 scrollx = 64; // X co-ordinate of scrolling centeru32 scrolly = 64; // Y co-ordinate of scrolling centerbool zoomin = 1;

  

  // 函式宣告void vblFunc(); // 中斷函式VBLvoid query_keys(); // 檢查按鍵狀態void redraw(); // 重畫螢幕

  

  // Main主函式int main()

  {

  // 初始化

  HAMlib ham_Init();

  

  // 設定背景模式為Mode1

  ham_SetBgMode(1);

  

  // 初始化調色盤

  ham_LoadBGPal(&rotate_Palette,256);

  // 背景調色盤

  // 初始化轉動的背景

  ham_bg[2].ti = ham_InitTileSet(&rotate_Tiles,SIZEOF_16BIT(rotate_Tiles),1,1);

  ham_bg[2].mi = ham_InitMapSet(&rotate_Map,256,0,1);

  

  // 顯示背景

  ham_InitBg(2,1,1,0);

  

  //移動背景到螢幕中央

  ham_RotBgEx(2,0,120,80,scrollx,scrolly,zoomx,zoomy);

  

  // 開啟 VBL 中斷函式

  ham_StartIntHandler(INT_TYPE_VBL,&vblFunc);

  

  while(1)

  {

  // 死迴圈

  }

  

  return EXIT_SUCCESS;

  } // 主程式尾

  

  

  // 中斷函式VBL

  void vblFunc()

  {

  ham_CopyObjToOAM();

  // 把 精靈 複製到記憶體的OAM中

  query_keys();

  

  // 檢查按鍵

  redraw();

  

  // 重畫飛機

  // 旋轉背景

  ham_RotBgEx(2,frames%360,120,80,scrollx,scrolly,zoomx,zoomy);

  

  // 幀自增1

  ++frames;

  

  return;

  } // End of vblFunc()

  

  

  // 檢查按鍵

  void query_keys()

  {

  // 只按RIGHT鍵 if (F_CTRLINPUT_RIGHT_PRESSED)

  {

  if (scrollx < 127) ++scrollx;

  }

  

  // 只按LEFT鍵 if (F_CTRLINPUT_LEFT_PRESSED)

  {

  if (scrollx > 0) --scrollx;

  }

  

  // 只按START鍵

  if (F_CTRLINPUT_START_PRESSED) {

  scrollx = 64;

  scrolly = 64;

  }

  

  return;

  } // End of query_keys()

  

  

  // 重畫螢幕

  void redraw()

  {

  if (zoomin) { // 放大

  if (zoomx != 396) {

  zoomx+=2;

  zoomy+=2;

  } else {

  zoomin = FALSE;

  }

  } else { // 縮小

  if (zoomx != 116) {

  zoomx-=2;

  zoomy-=2;

  } else {

  zoomin = TRUE;

  }

  }

  

  return;

  } // End of redraw()

  

  程式碼解釋

  

  // 全域性變數

  u32 zoomx=256;u32 zoomy=256;這兩個分別表示在X方向和Y方向的縮放量。在HAM文件中,你可以看到作者用0x100(=256)表示沒有縮放。 數字增加放大,反之減小。

  u32 scrollx=64;u32 scrolly=64;這兩個變數對應影像的旋轉軸的X和Y座標。這次我全設定成64代表旋轉軸在影像中心(原始影像大小為128x128象素)。當心,不要嘗試把座標定在影像的邊界外。我們待會再詳細說明。

  

  

  // Main()

  你將會注意到這次我載入背景的方法跟前幾天不同。這次的方法更短,儘管兩種方法都可以。// 初始化旋轉背景ham_bg[2].ti = ham_InitTileSet(&rotate_Tiles,SIZEOF_16BIT(rotate_Tiles),1,1);這個呼叫剛好一樣,下面的部分就不同了。ham_bg[2].mi = ham_InitMapSet(&rotate_Map,256,0,1);第一個引數就是背景map陣列。接下來就是“將要複製到BG視訊記憶體中的Tile大小,是個16位數字。”下一個數字是建立在最後一個引數 (是否為可旋轉)的基礎上的。所以128x128大小的影像做旋轉背景對應的數字是0。最後的的引數是1,因為是旋轉背景。

  注意: 你可以用下面的程式碼完成同樣的事:

  

  // 變數

  map_fragment_info_ptr bg_rotate; // 背景指標

  

  // 為影像安裝tile

  ham_bg[2].ti = ham_InitTileSet(&rotate_Tiles,SIZEOF_16BIT(rotate_Tiles),1,1);

  

  // 安裝map

  ham_bg[2].mi = ham_InitMapEmptySet(0,1);

  bg_rotate = ham_InitMapFragment(&rotate_Map,16,16,0,0,16,16,1);

  ham_InsertMapFragment(bg_rotate,2,0,0);

  

  // 顯示背景

  ham_InitBg(2,1,0,0);

  

  // 移動背景到中央

  ham_RotBgEx(2,0,120,80,scrollx,scrolly,zoomx,zoomy);

  這是RotBgEx() 函式的隱含工作。就像我說的,這是個功能很強的函式。我現在只用它把背景移到中央,而沒有旋轉。我待會會在VBL中斷函式中旋轉並且解釋引數。

  

  // VBL function

  

  // 旋轉背景

  ham_RotBgEx(2,frames%360,120,80,scrollx,scrolly,zoomx,zoomy);

  Okay, 現在的這個才是真正的旋轉(和縮放)。 第一個引數代表背景號。(它只能是2或3,因為背景0和1不能旋轉) 。接下來的是旋轉的角度。frames%360 的值會在 0 ? 359間。 再接下來的是旋轉中心的X和Y座標。我使它位於120,80幾乎是螢幕的中心。在這裡停一下以確定你真的明白了。這就是影像將要繞著轉的點。然後你傳遞的X和Y座標是卷軸的偏移量。這就是旋轉中心點在影像上位置。我選擇了64,64 (又幾乎是影像的中心)。多花了一些時間得到一個合適的圖片。圖片的中心將會跟著螢幕的中心轉。最後你傳入X方向上的縮放和Y方向上的縮放。它從256開始算起(或者是十六進位制的 0x100),意思是沒有縮放。如果你看了重畫函式,你將會看到怎麼修正zoomx 和 zoomy 。

  

  // query_keys()

  if (scrollx < 127) ++scrollx;if (scrollx > 0) --scrollx;當演示程式執行時,使用者可以按 左 或 右 來移動影像的旋轉中心點。比方說,如果你一直按 左,影像將會圍繞中間左側旋轉。注意字母'R'接近中心。如果你按 右 鍵,影像將會繞左側旋轉,接近中心的是字母'e'。 噢,如果你按了 Start 鍵將會回到中心。

  

  // redraw()

  這裡的這段程式碼不難。我設定了最大的縮放在116和396之間。當到達了界限時,我把放大改成縮小,或把縮小改成放大。

  

  啊,今天就到這裡吧。下一天,下一節精彩的課將關於用HAM編GBA程式的精美藝術。 你毫無疑問應該在學習第十二課以前,盡你所能修改今天的程式碼,看看RotBgEx() 函式的所有功能。

  

  HAM教程第十二天翻譯本

  

  我想是時候學一種簡單且依然很酷的特效――馬賽克。今天我們做馬賽克用在sprite上,明天我們再把它同背景核對。今天的大部分程式碼將會跟第八天和第十天相似。

  

  注意: 我的圖片是從這裡免費得到的。

  

  控制:Up ? 馬賽克縱向增大Down ? 馬賽克縱向減小Left ? 馬賽克橫向減小Right ? 馬賽克橫向增大Start ? 復位到沒有馬賽克

  

  // The Main HAM Library

  #include "mygba.h"

  // Graphics Includes

  #include "gfx/background.pal.c" // Created from water.bmp

  #include "gfx/object.pal.c" // Created from ship.bmp

  #include "gfx/ship.raw.c" // gfx2gba -D -fsrc -pobject.pal -t8 ship.bmp

  #include "gfx/water.map.c" // gfx2gba -fsrc -m -pbackground.pal -t8 water.bmp

  #include "gfx/water.raw.c"

  

  // Global Variables

  u8 ship[1]; // Sprite index for the ship

  u8 new_frame = 0; // 0 = true, 1 = false

  u16 curr_frame = 1; // Current frame

  u8 mosaic_h = 0; // Mosaic horizontal amount

  u8 mosaic_v = 0; // Mosaic vertical amount

  

  // Function Prototypes

  void vblFunc(); // VBL function

  void query_keys(); // Query for input

  void redraw(); // Redraw sprites

  

  // Main function

  int main()

  {

  // Variables

  map_fragment_info_ptr bg_water; // Pointer to our background

  

  // Initialize HAMlib

  ham_Init();

  

  // Setup the background mode

  ham_SetBgMode(1);

  

  // Initialize the palettes

  ham_LoadBGPal(&background_Palette,256); // Background palette

  ham_LoadObjPal(&object_Palette, 256); // Sprite palette

  &lt

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951727/,如需轉載,請註明出處,否則將追究法律責任。

相關文章