Ký tự hình ảnh là để vẽ ký tự trên hình ảnh, còn ký tự hệ thống là gọi các phông chữ đi kèm với điện thoại, về cơ bản có thể phân biệt được với hình thức bên ngoài. Sau khi văn bản của loại trò chơi này được dịch trực tiếp sang tiếng Trung Quốc, trò chơi sẽ hiển thị toàn bộ "口口口口口口" (trống). Đối với các trò chơi sử dụng ký tự hình ảnh của riêng chúng, các phương pháp dịch tiếng Trung bao gồm Trung Quốc hóa ma trận và sửa đổi các ký tự hệ thống. Bản địa hóa ma trận điểm có những hạn chế, chẳng hạn như quá nhiều văn bản, chỉ mục ma trận điểm trong tệp lớp, v.v. và chỉ áp dụng cho một số trò chơi. Nhiều hơn được sửa đổi thành các từ hệ thống. Việc sửa đổi yêu cầu bạn phải có hiểu biết nhất định về ngôn ngữ Java, vì vậy trước khi đọc hướng dẫn này, nếu bạn không biết Java, bạn nên tải xuống và tìm hiểu Người mới bắt đầu sử dụng JAVA để hiểu JAVA (cần phải có giải nén). Công cụ chuẩn bị bên S40: MC, MobyExplorer,
Dịch ngược Mocha
BE trình soạn thảo mã byte
jasmin(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) kiểm toán viên trước ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin
Trong số các trò chơi Java sử dụng phông chữ hình ảnh, các trò chơi của nhà sản xuất trò chơi DigitalChocolate là đơn giản nhất. Nói chung, trò chơi DigitalChocolate đã được sửa đổi. Trò chơi Sôcôla là một phần giới thiệu về việc học. Phương pháp sửa đổi trò chơi của nhà sản xuất này là một công thức cố định và không phức tạp lắm. Lấy " My Pet Shop My Pet Store" của DigitalChocolate làm ví dụ. Sau khi giải nén trò chơi, hãy sử dụng tính năng dịch ngược Mocha để dịch ngược các tệp lớp trong đó và duyệt qua chúng một cách ngắn gọn để tìm các phương thức sau: công khai? (Hình ảnh, DataInputStreamdatainputstream, Phông chữ, int?, int?) {} Chúng tôi thấy rằng nó nằm trong i. Nói chung, trong lớp, các tệp của phương thức này nằm trong các tệp lớp từ 3 đến 4K. Vì vậy, hãy ưu tiên mở file từ 3 đến 4K để duyệt, bạn sẽ tìm thấy chúng một cách nhanh chóng. công khai i (Hình ảnh, DataInputStreamdataInputStream, Phông chữ, inti1, int j1) {int k; int i2; int j2; char ch; if (image ! = null) (bỏ qua...) Những gì chúng ta phải làm là thêm image = null lên trên if (image! = null). Đừng nghĩ về nó trong tôi. Thêm nó vào java sẽ không hoạt động. Do nhầm lẫn hoặc lý do công cụ, về cơ bản, tệp java đã dịch ngược không thể được biên dịch lại thành tệp lớp. Mục đích có thể đạt được bằng cách sửa đổi mã byte. Trước tiên hãy tạo các thư mục mới "1" và "2" và đặt i. Cho lớp vào, mở phần mềm Disassembler2Jasmin lên, có hai hộp địa chỉ. Điền vào ô đầu tiên E:/1/i. Điền vào trường thứ hai của lớp, E:/2/Nhấp vào "Unshell" ở phím mềm bên trái và thay đổi i. Lớp được dịch ngược thành mã byte, mã này sẽ tạo ra i. tập tin j. Mở i bằng trình soạn thảo văn bản. j, còn được gọi là mã byte, được tìm thấy ở phần đầu: gọi đặc biệt java/lang/Object/
astore_1 trước aload_1 và cuối cùng: gọi đặc biệt java/lang/Object/
astore_1 rồi lưu và xem lại, thuận tiện hơn nhiều. -------------Quy trình hoạt động cơ bản là như thế này, tại sao lại phải sửa đổi như thế này? Hãy nói về nguyên tắc dưới đây. Trong tôi. Chúng ta thấy phương thức này trong java: public void a (Graphics Graphics, String string, int i1, int j1, int k1) {if (a! = null) {... Graphics. setClip(i5, j5, k5 - i5, i6 - j5); đồ họa. drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}đồ họa. setClip(i2, k2, i3, j3); return;} Lưu ý: Nhiều trò chơi sử dụng phương thức public void a (Graphics Graphics, String string, int i1, int j1, int k1...) để vẽ chuỗi. Trong phần if, chúng ta thấy phương thức setClip để cắt ảnh. Nguyên tắc của phương pháp setClip là chỉ hiển thị một phần nội dung trên màn hình sao cho nội dung của hình ảnh nằm chính xác trong phần đó được hiển thị. drawImage là một phương thức được sử dụng để vẽ các hình ảnh được chỉ định. Thật dễ dàng để tưởng tượng rằng phương thức trong if được sử dụng để hiển thị các từ hình ảnh. đồ họa. setFont(a); int j2 = đồ họa. getColor();if (a){......graphics. setColor(b); đồ họa. drawString(chuỗi, i1, j1 - 1, k1); đồ họa. drawString(chuỗi, i1 - 1, j1, k1); đồ họa. drawString(chuỗi, i1 + 1, j1, k1); đồ họa. drawString(string, i1, j1 + 1, k1);} đồ họa. setColor(a); đồ họa. drawString(chuỗi, i1, j1, k1); đồ họa. setColor(j2);} Lưu ý: Phần bên dưới if là phần quan trọng. Chúng ta đã thấy phương thức drawString để vẽ chuỗi, vì vậy chúng ta biết điều chúng ta phải làm là làm cho phương thức này không thực thi phần bên trong if mà trực tiếp đi đến phần từ hệ thống bên dưới. (Bổ sung: Nếu các câu lệnh phân kỳ có điều kiện được chuyển đổi thành các quy trình khác nhau theo các điều kiện khác nhau. Sau đó nhìn vào phần đầu if (a! = null), chúng ta thấy rằng nó được đánh giá bằng cách đánh giá biến a. Và biến này được xác định ở đâu? Trước đó chúng ta đã nói về phương thức public c (Hình ảnh, DataInputStreamdatainputstream, Phông chữ, int i, int j), chúng ta cũng có thể cắt ngang và xem xét. public i (Hình ảnh hình ảnh, DataInputStreamdataInputStream, Phông chữ, int i1, int j1) {int k; int i2; int j2; if (hình ảnh ! = null) {a = hình ảnh ...} else {a = phông chữ;b = j1; a = j1! = -1; } Lưu ý: Bạn có thể thấy rằng phương pháp này liên quan đến biến a và nhiệm vụ của biến này là xác định xem số lượng hình ảnh có rỗng hay không. Sau đó tôi nhìn thấy phông chữ = trong else; Câu này có nghĩa là gán số lượng font cho a (biến font), có thể hiểu là gán font hệ thống cho a. Vì vậy, chúng tôi hy vọng có thể cố gắng làm cho phương thức này luôn được thực thi theo cách khác, để chúng tôi có thể thêm image = null trước if (image ! = null); Theo cách này, giá trị của hình ảnh là null ở đầu và phần khác sẽ được thực thi. Trong mã byte: aload_1ifnull Label216 tương ứng với if (image! = null). (Vì công cụ này nên việc sửa đổi vị trí trên điện thoại di động khó hơn trên máy tính.) aload_1 là tải (1) đối tượng đầu tiên được tham chiếu bởi biến cục bộ và đẩy nó vào ngăn xếp. Biến cục bộ đầu tiên tương ứng với hình ảnh ở vị trí đầu tiên của tên phương thức. Thêm image=null vào đây để tạo số lượng null cho hình ảnh. aconst_nullastore_1 Nếu bạn muốn biết thêm về nguyên tắc, bạn có thể xem Java Bytecode Revealed. Cần lưu ý rằng số "1" trong astore_1 dựa trên if (image ! = null) trước đó. Ta thấy dòng thứ 3 là aload_1, ở đây là 1 thì astore_1 cũng phải là 1. Ngược lại nếu là aload_2 thì phải là astore_2, v.v. aconst_null
astore_1 Đoạn mã này tương đối máy móc nên bạn có thể nhớ được. Các trò chơi do Digital Chocolate sản xuất tương đối cố định và tất cả những ai muốn bản địa hóa trò chơi của mình nên sửa đổi chúng theo cách này. Những sửa đổi trò chơi của DC về cơ bản là cơ sở cho nhiều sửa đổi trò chơi. Vì vậy, khuyến cáo mọi người nên nắm vững nó một cách triệt để. Trò chơi từ các nhà sản xuất khác không hề dễ dàng như vậy và ngay cả các trò chơi từ cùng một nhà sản xuất cũng có thể có các phương pháp sửa đổi khác nhau. Điều cần thiết là không ngừng học tập và thực hành, tích lũy kinh nghiệm và hiểu biết sâu sắc hơn về Java.
-------------------Phiên bản tiếng Trung của trò chơi Digital Chocolate. Sau khi chuyển đổi thành công ký tự hình ảnh thành ký tự hệ thống, bạn có thể trực tiếp Trung Quốc hóa văn bản. Các tệp ngôn ngữ về cơ bản là l0_0, l0_1, l0_2, v.v. Trong "My Pet Store", thường chọn tiếng Trung l0_0 (tiếng Anh). Sử dụng plug-in trong thư mục SUMEA trong công cụ máy tính Halo để mở và sửa đổi trực tiếp. Trên điện thoại di động, bạn cần sử dụng hệ thập lục phân. Mở l0_0 ở dạng thập lục phân. 00 00 3c 75 đại diện cho tổng số byte 15477, 00 00 01 6c đại diện cho tổng số byte bắt đầu 364, 00 00 05 b8, 00 00 05 c1... đại diện cho byte bắt đầu của trường. Byte bắt đầu trường là gì? Phím mềm bên trái - Chỉnh sửa - Vào địa chỉ, nhập địa chỉ 0x5b8 hoặc số thập phân 1464. Sau khi xác nhận, bạn sẽ thấy nó chuyển sang số byte 00 06 của tiếng Anh. Sau đó nhập 0x5c1 thứ 2 để về 00 02 của Ok bên dưới. Mỗi byte bắt đầu lần lượt tương ứng với các trường sau. Nói một cách thẳng thắn, 5b8 là tổng số byte trước 00 06. Số byte sẽ thay đổi khi chúng ta bản địa hóa nó và những byte này cần phải được sửa đổi, điều này khá phức tạp và rắc rối.