冒险解谜游戏中文网 ChinaAVG

标题: 【Scummvm汉化 #5】 Phantasmagoria 2 - A Puzzle of Flesh 幽魂2#3 汉化抓图 [打印本页]

作者: shane007    时间: 2023-8-21 17:40
标题: 【Scummvm汉化 #5】 Phantasmagoria 2 - A Puzzle of Flesh 幽魂2#3 汉化抓图
经过一番研究,找到了底层的贴图函数之后,加入了一个写中文字符串的函数,
: R# W0 z0 _1 o, ~% z- {. C& p目前已经可以往屏幕上写中文字符串了。
# P9 R0 t, i3 C  _8 W/ F# A/ x2 m& r$ E* O8 G9 h
汉化抓图' W8 w  m* T2 ?- A1 N4 A, _
[attach]46598[/attach]
! K; E) r  x! P  G6 w" P- z  `1 ^# j7 k- N. w/ V  F& D6 h% k3 m
代码0 g7 s) p' T+ Z" p  Z+ e* R
backends\graphics\opengl\texture.cpp
' ?* }! R% B9 G/ E" r
  1. void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {: b0 w3 B/ X6 h  M9 }7 S
  2.         copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);, m  U, j" p2 I* O& v
  3.         //add by shane007+ u% \! p) }* G0 F8 G
  4.         drawStringToSurface();" r) K* N$ K) j$ v- Y& h# `( H: v3 F
  5. }
    ' b3 A/ y9 c2 k+ u6 x& m! j' g

  6. . V( a  z& u  q! M, F* O+ W
  7. //add by shane0079 ^+ F) u( B' U2 l" B
  8. void Surface::drawStringToSurface() {; F) h$ K0 T- O

  9. & _. K$ B9 `. Q! H, I8 V. H! O
  10.         Graphics::Surface *dstSurf = getSurface();
    0 b, b" E/ B  a$ d6 |" Y6 Z- }
  11.         // 在Surface上显示字符串+ N6 \( r; F. s. }7 w. P. P
  12.         int x = 100;
    # g. m, f8 `5 b% F  E
  13.         int y = 300;$ N, U( e4 p4 E$ A; E1 u
  14.         int charWidth = 16;
    ) a$ L" Z( J* z: c. ^
  15.         int charHeight = 16;. A7 |% x5 A+ y+ S( O1 O' E
  16.         int color = 0x0000ff; //0x00BBGGRR( l7 }7 m6 Q+ c8 [
  17.         const uint pitch = dstSurf->pitch;
    & z) U8 V( C+ \- \3 S& e
  18.         const uint bytesPerPixel = dstSurf->format.bytesPerPixel;0 |0 u8 r9 Y' W8 w$ c! ^1 w0 ]

  19. 4 n! K5 ]. h6 G
  20.         unsigned char *dst;8 f! t; p! O) @' e2 L' Z% [
  21.         const char *str = "中文测试";' [8 i) q' }( _  j$ w0 h. s
  22. 8 l( O; A# a* ~7 v& |2 C3 b+ |
  23.         for (int i = 0; str[i] != '\0'; i = i+2) {2 m) ?+ {( M) i
  24.                 int ch = (unsigned char)str[i];
    8 |3 B; Y- \2 q% q/ V
  25.                 int ch2 = (unsigned char)str[i + 1];9 {0 R8 u4 d6 G  L
  26.                 int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);. ~4 }  L* U) E- o+ [: o
  27.                 const unsigned char *fontData = hzk16_data + 32 * idx;3 |1 I+ t! z% S' I' P: ?, x
  28.                 dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;4 A! e. \* N( n! V2 A

  29. 9 n  p" h! V: L+ [% ]8 s2 d
  30.                 for (int row = 0; row < charHeight; ++row) {; L7 }  Z8 \! e+ S' f2 D- B- P5 k. E
  31.                         for (int col = 0; col < charWidth; ++col) {6 z' ]5 V& i2 M+ T; {: c
  32.                                 unsigned char pixelByte = fontData[row * 2 + col / 8];          // 每行对应2个字节
    4 u: X& r! }" }7 u; M8 W
  33.                                 unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位( ?6 a/ ~: e, F7 ]$ I9 M) B) n
  34. , [% j, J: C7 m- h, w
  35.                                 if (pixelBit == 1) {
    + Y8 @  Y2 Y0 Q( E" D- p
  36.                                         // 设置像素颜色- y  j2 l' }0 b7 R* g$ Y$ p3 E2 H  O
  37.                                         uint32 *pixel = (uint32 *)dst;# |$ u: J4 y8 }2 W6 Y1 x
  38.                                         *pixel = color;% Z% K" \1 ^5 a
  39.                                 }' {; a- ]% ^5 H
  40.                                 dst += bytesPerPixel;0 f$ r. A1 K- {" e
  41.                         }( b0 ?" j* x$ H, Z8 j+ ]
  42.                         dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置
    # Y- b( c- r/ o0 w5 ]5 U
  43.                 }' A0 a, b' g: f( U# J
  44.         }
    6 G# f1 W! `, Y% K
  45. }
复制代码

1 c0 A1 j# {; R" H" z
' R" j( a$ o& A: d
作者: 1314520aa    时间: 2023-9-6 01:32





欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2