接上,一点点来,先把写屏函数分析完: 4 m3 W. _% ^! ]0 ~
写屏函数: -
- 02A2EA4C |> /8B00 |/mov eax,dword ptr ds:[eax]
- 02A2EA4E |. |0FB70450 ||movzx eax,word ptr ds:[eax+edx*2] ; //取出第edx个字符
- 02A2EA52 |. |8B7C24 14 ||mov edi,dword ptr ss:[esp+14]
- 02A2EA56 |. |8B7F 2C ||mov edi,dword ptr ds:[edi+2C] ; //003E69F0
- 02A2EA59 |. |8D04C0 ||lea eax,dword ptr ds:[eax+eax*8]
- 02A2EA5C |. |8D0487 ||lea eax,dword ptr ds:[edi+eax*4] ; //eax存放的就是字库的地址(实际上是单个字符的坐标)
- 02A2EA5F |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C] ; //129CE000
- 02A2EA63 |. |8D7C39 14 ||lea edi,dword ptr ds:[ecx+edi+14]
- 02A2EA67 |. |D940 04 ||fld dword ptr ds:[eax+4]
- 02A2EA6A |. |83C2 01 ||add edx,1 ; //多少个需要渲染的字符
- 02A2EA6D |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EA71 |. |D900 ||fld dword ptr ds:[eax]
- 02A2EA73 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EA75 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EA79 |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EA7C |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EA80 |. |D940 04 ||fld dword ptr ds:[eax+4]
- 02A2EA83 |. |8D7C39 30 ||lea edi,dword ptr ds:[ecx+edi+30] ; // 14 + X,Y + 14 ==30
- 02A2EA87 |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EA8B |. |D940 08 ||fld dword ptr ds:[eax+8]
- 02A2EA8E |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EA90 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EA94 |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EA97 |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EA9B |. |D940 0C ||fld dword ptr ds:[eax+C]
- 02A2EA9E |. |8D7C39 4C ||lea edi,dword ptr ds:[ecx+edi+4C]
- 02A2EAA2 |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EAA6 |. |D900 ||fld dword ptr ds:[eax]
- 02A2EAA8 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EAAA |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EAAE |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EAB1 |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EAB5 |. |D940 0C ||fld dword ptr ds:[eax+C]
- 02A2EAB8 |. |8D7C39 68 ||lea edi,dword ptr ds:[ecx+edi+68]
- 02A2EABC |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EAC0 |. |83C1 70 ||add ecx,70 ; //每70一个顶点结构
- 02A2EAC3 |. |D940 08 ||fld dword ptr ds:[eax+8]
- 02A2EAC6 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EAC8 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EACC |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EACF |. |8B46 58 ||mov eax,dword ptr ds:[esi+58]
- 02A2EAD2 |. |03C3 ||add eax,ebx
- 02A2EAD4 |. |3B50 08 ||cmp edx,dword ptr ds:[eax+8]
- 02A2EAD7 |.^\\0F8C 6FFFFFFF |\\jl xcDxShad.02A2EA4C
复制代码
% |( q7 }2 W& f! I实际上这里是定义了一个顶点结构,那一串浮点运算就是根据003E69F0处的字符在字库中的坐标信息建来赋值自己定义的顶点结构 / w0 i- j( ]- r
TLVertex vertices[] =
$ o8 j1 c* K1 E! z) y8 k, X {
1 j" v! H0 r3 \0 N& i' t { 248.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, a, b }, ) v) {7 [1 g3 [) V$ U
{ 262.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, c, b }, 7 R* H) W, d+ [9 @, q
{ 248.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, a, d }, $ n1 w9 \" F5 O- J% q. y7 z. {
{ 262.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, c, d } }" q( k+ G" Q. e* b0 ^5 Y L4 f
}; //129CE000 指向vertices,0xffffff00表示颜色,这里应该是白色
* w) z8 F2 ]2 s. Q* G
% x" W- n1 v+ M5 s4 p1 Y [a,b,c,d] = {0.02929688, 0.5410156, 0.08398438, 0.6113281}; //003E69F0
& [; L0 ^% `4 a: \. ]! V. a
: B" O! V8 X/ M, j& HPS:“每个字符占1C个字节,最后的四个字节都是一样的,可以认为是结束标志”
# O0 m) ]! O5 S# j其实是每个字符占0x70个字节,每个字符有4个顶点信息,你可以把它想像成那个字符的四个角,
; Z& D* q7 P2 L; b7 W; q* `每1C个字节就是一个顶点信息,倒数第三个字节表示颜色,他们之间的颜色渐变是由DXD来实现的
+ m( J! J8 A0 D; _' A这是一张DDS格式的图片字库 |