冒险解谜游戏中文网 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
void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {
: b0 w3 B/ X6 h M9 }7 S
copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);
, m U, j" p2 I* O& v
//add by shane007
+ u% \! p) }* G0 F8 G
drawStringToSurface();
" r) K* N$ K) j$ v- Y& h# `( H: v3 F
}
' b3 A/ y9 c2 k+ u6 x& m! j' g
. V( a z& u q! M, F* O+ W
//add by shane007
9 ^+ F) u( B' U2 l" B
void Surface::drawStringToSurface() {
; F) h$ K0 T- O
& _. K$ B9 `. Q! H, I8 V. H! O
Graphics::Surface *dstSurf = getSurface();
0 b, b" E/ B a$ d6 |" Y6 Z- }
// 在Surface上显示字符串
+ N6 \( r; F. s. }7 w. P. P
int x = 100;
# g. m, f8 `5 b% F E
int y = 300;
$ N, U( e4 p4 E$ A; E1 u
int charWidth = 16;
) a$ L" Z( J* z: c. ^
int charHeight = 16;
. A7 |% x5 A+ y+ S( O1 O' E
int color = 0x0000ff; //0x00BBGGRR
( l7 }7 m6 Q+ c8 [
const uint pitch = dstSurf->pitch;
& z) U8 V( C+ \- \3 S& e
const uint bytesPerPixel = dstSurf->format.bytesPerPixel;
0 |0 u8 r9 Y' W8 w$ c! ^1 w0 ]
4 n! K5 ]. h6 G
unsigned char *dst;
8 f! t; p! O) @' e2 L' Z% [
const char *str = "中文测试";
' [8 i) q' }( _ j$ w0 h. s
8 l( O; A# a* ~7 v& |2 C3 b+ |
for (int i = 0; str[i] != '\0'; i = i+2) {
2 m) ?+ {( M) i
int ch = (unsigned char)str[i];
8 |3 B; Y- \2 q% q/ V
int ch2 = (unsigned char)str[i + 1];
9 {0 R8 u4 d6 G L
int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);
. ~4 } L* U) E- o+ [: o
const unsigned char *fontData = hzk16_data + 32 * idx;
3 |1 I+ t! z% S' I' P: ?, x
dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;
4 A! e. \* N( n! V2 A
9 n p" h! V: L+ [% ]8 s2 d
for (int row = 0; row < charHeight; ++row) {
; L7 } Z8 \! e+ S' f2 D- B- P5 k. E
for (int col = 0; col < charWidth; ++col) {
6 z' ]5 V& i2 M+ T; {: c
unsigned char pixelByte = fontData[row * 2 + col / 8]; // 每行对应2个字节
4 u: X& r! }" }7 u; M8 W
unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位
( ?6 a/ ~: e, F7 ]$ I9 M) B) n
, [% j, J: C7 m- h, w
if (pixelBit == 1) {
+ Y8 @ Y2 Y0 Q( E" D- p
// 设置像素颜色
- y j2 l' }0 b7 R* g$ Y$ p3 E2 H O
uint32 *pixel = (uint32 *)dst;
# |$ u: J4 y8 }2 W6 Y1 x
*pixel = color;
% Z% K" \1 ^5 a
}
' {; a- ]% ^5 H
dst += bytesPerPixel;
0 f$ r. A1 K- {" e
}
( b0 ?" j* x$ H, Z8 j+ ]
dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置
# Y- b( c- r/ o0 w5 ]5 U
}
' A0 a, b' g: f( U# J
}
6 G# f1 W! `, Y% K
}
复制代码
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