編寫字庫漢化程序~VB篇/VC篇 by sumiya

大概1年前些過程序生成字庫的程序,今天又要用到了,結果找了半天找不到,只好再重新寫一遍了,這個就是當時參考的教程,很不錯的。

 

顯示:

1BPP_VB

1BPP_VC

4BPP_VB

4BPP_VC

 

寫入

1BPP_VB

4BPP_VB

 

------------------------------------------------------------------------------------------------------------------

 

轉自:tgb論壇,原地址

 

在原理篇中已經講解了字庫的原理,下面從字庫顯示開始講解如何用VB編寫字庫程序。

 


1BPP

仍然借用這個圖:

            行   2進制數    轉換爲16進制
|_|_|_|_|_|_|_|_|   0 00000000     0
|_|_|_|X|X|_|_|_|   1 00011000     18
|_|_|X|_|_|X|_|_|   2 00100100     24
|_|X|_|_|_|_|X|_|   3 以下省略…………
|_|X|_|_|_|_|X|_|   4 ……………………
|_|X|X|X|X|X|X|_|
|_|X|_|_|_|_|X|_|
|_|X|_|_|_|_|X|_|   8 ……         一共8Byte

1、首先要打開ROM:
Dim sRomName as String      定義一個字符串來存放ROM路徑
sRomName = "你存放ROM的絕對路徑,比如:E:/0001.gba"
Open sRomName For Binary as #1 在1號工作區以2進制方式打開ROM

2、把字模數據讀到數組以便處理
Dim bTileArray(7) as Byte      定義一個8Byte的數組用於存放字模數據
Get #1,字模開始地址,bTileArray   從1號工作區的字模開始地址處,獲取字模數據

3、虛擬一部分調色板
Dim bPalID as Byte         定義一個Byte變量存放顏色編號
Dim iPalCol(1) as Integer        虛擬一部分調色板
iPalCol(0) = 0x00           將虛擬調色板的0號顏色設爲黑
iPalCol(1) = 0xFFFFFF          將1號顏色設爲白

4、按順序把每個2進制位的值提取出來
Dim bTile as Byte          臨時存放1byte字模數據
Dim iX,iY as Integer         定義兩個整數變量記錄當前在字模裏的座標
For iY = 0 To 7            設定循環,這裏表示字模縱向有8行
bTile = bTileArray(iY)         臨時存放1Byte數據,方便處理
For iX = 0 To 7            設定循環,這裏表示字模橫向有8列
bPalID = bTile/256          獲取最高點的2進制位的值,作爲編號

5、虛擬GBA硬件的索引過程
Pictrue1.Pset(iX,iY),RGB(iPalCol(bPalID))
上面這句是:用編號索引到虛擬調色板iPalCol的bPalID號顏色,再把這個顏色畫到圖象框控件Picture1的(iX,iY)點上。

6、將臨時數據左移1位,這樣第2高的2進制位就變最高位
bTile = (bTile and 0x7F) * 2

7、繼續處理下面的數據
Next iX
Next iY

8、關閉工作區和ROM
Close #1


這裏的程序只能處理1個字模,如果要1次顯示多個字模就要多設定一個字數循環,並讓數據讀取的首地址根據字數遞增而遞增。

 

 

上面1BPP的程序寫成VC MFC的格式,就是這個(原理是一模一樣的):

1、打開ROM
CString sRomName="E:/rom.gba";
CFile Rom;
Rom.Open(_T(sRomName),CFile::modeReadWrite|CFile::shareDenyNone)

獲取圖象框的“設備上下文”(Device Content),下面畫點的時候要用。
CWnd *pImg=GetDlgItem(IDC_STATIC) 獲取圖象框指針
CDC *pDC=pImg->GetDC(); 獲取圖象框DC

2、讀取TILE
BYTE bTileArray[8];
Rom.Seek(字模開始地址,CFile::begin);
Rom.Read(bTileArray,8);

3、虛擬調色板
BYTE bPalID;
int iPalCol[2]={0x00,0xFFFFFF};

4、提取編號
BYTE bTile;
for(int iY=0;iY<7;iY++)
{
  bTile=bTileArray[iY];
  for(int iX=0;iX<7;iX++)
  {
    bPalID=bTile/256;

5、索引顏色並畫點
    pDC->SetPixel(iX,iY,RGB(iPalCol(bPalID)));

6、移位操作
    bTile=(bTile & 0x7F) * 2;
  }
}

7、關閉ROM
Rom.Close();
……省略一些掃尾工作,不影響正常的顯示

 

 

4BPP

1、打開ROM:
Dim sRomName as String
sRomName = "E:/0001.gba"
Open sRomName For Binary as #1

2、把字模數據讀到數組(4*8=32,一共要讀32Byte)
Dim bTileArray(31) as Byte      32Byte的數組用於存放字模數據
Get #1,字模開始地址,bTileArray

3、虛擬調色板
Dim bPalIDLeft,bPalIDRight as Byte
Dim iPalCol(1) as Integer
iPalCol(0) = 0x00           黑色
iPalCol(1) = 0xFFFFFF         白色
iPalCol(2) = 0xD0D0D0        灰色
iPalCol(3) = ……
……
……
iPalCol(15) = ……        4BPP能表示0~15這16個數,可以根據需要賦值

4、按順序把每4個2進制位的值提取出來
Dim bTile as Byte          
Dim iX,iY as Integer         
For iY = 0 To 7            
For iX = 0 To 7 Step 2
bTile = bTileArray(iY*4+iX/2)    臨時存放1byte,1Byte=8bit,含2個Pixel
bPalIDRight = (bTile and 0xF0)/16    獲取前4Bit的值,作爲右邊像素點的顏色編號

5、處理後4Bit
bPalIDLeft = bTile and 0x0F
    
6、虛擬GBA硬件的索引過程
Pictrue1.Pset(iX,iY),RGB(iPalCol(bPalIDLeft))      畫左邊的像素點
Pictrue1.Pset(iX+1,iY),RGB(iPalCol(bPalIDRight))    畫右邊的像素點

7、繼續處理下面的數據
Next iX
Next iY

8、關閉工作區和ROM
Close #1

 

4BPP VC

CString sRomName="E:/rom.gba";
CFile Rom;
Rom.Open(_T(sRomName),CFile::modeReadWrite|CFile::shareDenyNone);

CWnd *pImg=GetDlgItem(IDC_STATIC);
CDC *pDC=pImg->GetDC();

BYTE bTileArray[32];
Rom.Seek(字模開始地址,CFile::begin);
Rom.Read(bTileArray,32);

BYTE bPalIDLeft,bPalIDRight;
int iPalCol[16]={0x00,0xFFFFFF,0xD0D0D0,……根據需要設定顏色,這裏仍然是白底黑字、帶灰色陰影};

BYTE bTile;
for(int iY=0;iY<7;iY++)
{
  for(int iX=0;iX<7;iX+=2)
  {
    bTile=bTileArray(iY*4+iX/2);
    bPalIDRight=(bTile & 0xF0)/16;

    bPalIDLeft=bTile & 0x0F;

    pDC->SetPixel(iX,iY,RGB(iPalCol(bPalIDLeft)));
    pDC->SetPixel(iX+1,iY,RGB(iPalCol(bPalIDRight)));

  }
}
Rom.Close();

 

 

1BPP VB篇

字模寫入過程

1、先要用程序畫一箇中文字符
2、根據字庫原理,把字符轉換爲2進制數據串
3、把數據串寫進ROM

用程序實現上面過程

1、在圖象框畫字符

設定字體大小、字體名
With Picture1.Font
.Size = 9
.Name = "宋體"
End With

設定前景色,這裏是字體的顏色,設爲白色
Picture1.ForeColor = White

設定背景色,這裏設爲黑色。
Picture1.BackColor = Black

在圖象框畫字符
Picture1.Print "你要寫入字庫的字,比如'我'字"

2、按順序獲取像素點顏色,並轉換爲2進制串

Dim iPixelCol as Integer  '用於存放獲取的像素點顏色
Dim bTileArray[7] as Byte  '用於存放字模2進制串
Dim bTile as Byte      '用於臨時存放8個2進制位(1Byte)
Dim iX,iY as Integer     '用於存放座標

For iY = 0 to 7       縱向8行循環
For iX = 0 to 7       橫向8列循環

獲取像素點顏色值
iPixelCol = Picture1.Point(iX,iY)

轉換爲2進制數據
If iPixelCol<>0 Then     如果像素點不是黑色
bTile = (bTile+1)*2       給最低位賦值爲1(因爲白色是1號顏色)並左移1位
Else             如果是黑色
bTile = (bTile+0)*2       給最低位賦值0(黑色是0號顏色)並左移1位
End If

Next iX           轉換下一個像素點

bTileArray[iY] = bTile    把臨時存放的8個2進制位放到2進制串裏
bTile = 0          把bTile的8個位清0,以便進行下一行的轉換

Next iY           進入下一行的轉換

3、把2進制串寫入ROM

打開ROM
Dim sRomName as String
sRomName = "E:/rom.gba"
Open sRomName For Binary as #1

寫入
Put #1,新字模開始地址,bTileArray

關閉ROM
Close #1

 

4BPP VB篇

With Picture1.Font
.Size = 9
.Name = "宋體"
End With

Picture1.ForeColor = White

Picture1.BackColor = Black

Picture1.Print "我"

Dim iPixelCol as Integer
Dim bTileArray[31] as Byte
Dim bTile as Byte
Dim iX,iY as Integer

For iY = 0 to 7
For iX = 0 to 7 Step 2

iPixelCol = Picture1.Point(iX+1,iY)     右邊的像素點

If iPixelCol<>0 Then
bTile = (bTile+1)*16
Else
bTile = (bTile+0)*16
End If

iPixelCol = Picture1.Point(iX,iY)     左邊的像素點

If iPixelCol<>0 Then
bTile = bTile+1
Else
bTile = bTile+0
End If

bTileArray[iY*4+iX/2] = bTile

bTile = 0

Next iX

Next iY

Dim sRomName as String
sRomName = "E:/rom.gba"
Open sRomName For Binary as #1

Put #1,新字模開始地址,bTileArray

Close #1

如果要做字的陰影效果,只需要:
1、把背景模式設定爲“透明”
2、先把前景色設定爲灰色
3、畫1個向右下偏移1像素的灰色字符
4、把前景色設定爲白色
5、畫白色字符
6、在轉換的時候加入對陰影的處理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章