大概1年前些過程序生成字庫的程序,今天又要用到了,結果找了半天找不到,只好再重新寫一遍了,這個就是當時參考的教程,很不錯的。
顯示:
寫入
------------------------------------------------------------------------------------------------------------------
轉自: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、在轉換的時候加入對陰影的處理