Les caractères d'image doivent dessiner des caractères sur des images, tandis que les caractères système doivent appeler les polices fournies avec le téléphone, qui peuvent fondamentalement être distinguées de l'apparence. Une fois le texte de ce type de jeu directement traduit en chinois, le jeu affichera tous « 口口口口口口 » (vide). Pour les jeux qui utilisent leurs propres caractères d'image, les méthodes de traduction chinoise incluent la Chineseisation matricielle et la modification des caractères système. La localisation matricielle a ses limites, comme trop de texte, des index matriciels dans les fichiers de classe, etc., et n'est applicable qu'à certains jeux. D'autres sont modifiés en mots système. La modification nécessite une certaine compréhension du langage Java, donc avant de lire ce tutoriel, si vous ne connaissez pas Java, il est recommandé de télécharger et d'apprendre JAVA Débutants pour comprendre JAVA (doit être décompressé). Outils de préparation côté S40 : MC, MobyExplorer,
Décompilation Moka
Éditeur de bytecode BE
jasmin(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) auditeur précédent ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin
Parmi les jeux Java qui utilisent des polices d'images, les jeux du fabricant de jeux DigitalChocolate sont les plus simples. Généralement, le jeu DigitalChocolate est modifié. Le jeu Chocolat est une initiation à l'apprentissage. La méthode de modification du jeu de ce constructeur est une formule fixe et n'est pas très compliquée. Prenons l'exemple de " My Pet Shop My Pet Store". Après avoir décompressé le jeu, utilisez la décompilation Mocha pour décompiler les fichiers de classe qu'il contient et parcourez-les brièvement pour trouver les méthodes suivantes : public ? (Image image, DataInputStreamdatainputstream, Font font, int ?, int ?) {} Nous avons constaté que c'est dans i. En classe, de manière générale, les fichiers de cette méthode sont en fichiers classes de 3 à 4K. Donnez donc la priorité à l'ouverture des fichiers de 3 à 4K pour la navigation, et vous les retrouverez rapidement. public i (image image, DataInputStreamdataInputStream, police de police, inti1, int j1) {int k; entier i2 ; entier j2; char ch; if (image ! = null) (omis...) Ce que nous devons faire est d'ajouter image = null ci-dessus if (image ! = null). N'y pense pas en moi. L'ajouter en Java ne fonctionnera pas. En raison de confusion ou pour des raisons d'outils, le fichier Java décompilé ne peut pas être compilé à nouveau dans un fichier de classe. L'objectif peut être atteint en modifiant le bytecode. Créez d'abord de nouveaux dossiers "1" et "2", et placez i. Mettez la classe dedans, ouvrez le logiciel Disassembler2Jasmin, et il y a deux boîtes d'adresse. Remplissez le premier, E:/1/i. Remplissez le deuxième champ de la classe, E:/2/Cliquez sur "Unshell" dans la touche programmable de gauche et modifiez i. La classe est décompilée en bytecode, ce qui générera i. j fichier. Ouvrez-le avec l'éditeur de texte. j, qui est ce qu'on appelle le bytecode, trouvé au début : Invoquerspecial java/lang/Object/
astore_1 avant aload_1 et enfin : Invoquer spécial java/lang/Object/
astore_1, puis enregistrez-le et révisez-le, ce qui est beaucoup plus pratique. -------------Le processus de fonctionnement de base est comme ceci, pourquoi avez-vous besoin de le modifier comme ça ? Parlons du principe ci-dessous. En moi. On voit cette méthode en java : public void a (Graphics graphiques, String string, int i1, int j1, int k1) {if (a! = null) {... graphiques. setClip(i5, j5, k5 - i5, i6 - j5); graphique. drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}graphiques. setClip(i2, k2, i3, j3); return;} Remarque : De nombreux jeux utilisent la méthode public void a (Graphics graphiques, String string, int i1, int j1, int k1...) pour dessiner des chaînes. Dans la section if, nous voyons la méthode setClip pour couper des images. Le principe de la méthode setClip est de n'afficher qu'une partie du contenu à l'écran afin que le contenu de l'image exactement située dans cette partie soit affiché. drawImage est une méthode utilisée pour dessiner des images spécifiées. Il est facile d'imaginer que la méthode if est utilisée pour afficher des mots illustrés. graphique. setFont(a); int j2 = graphiques. getColor();if (a){......graphiques. setColor(b); graphique. drawString(chaîne, i1, j1 - 1, k1); graphique. drawString(chaîne, i1 - 1, j1, k1); graphique. drawString(chaîne, i1 + 1, j1, k1); graphique. drawString(string, i1, j1 + 1, k1);} graphiques. setColor(a); graphique. drawString(chaîne, i1, j1, k1); graphique. setColor(j2);} Remarque : La partie située sous le if est la partie clé. Nous avons vu la méthode drawString pour dessiner des chaînes, nous savons donc que ce que nous devons faire est de faire en sorte que cette méthode n'exécute pas la partie à l'intérieur du if, mais accède directement à la partie du mot système ci-dessous. (Supplément : si les déclarations de divergence conditionnelle sont converties en différents processus selon différentes conditions. Ensuite, regardez au début si (a! = null), nous voyons qu'elle est jugée en jugeant la variable a. Et où cette variable est-elle définie ? Plus tôt, nous avons parlé de la méthode publique c (Image image, DataInputStreamdatainputstream, Font font, int i, int j), nous pourrions aussi bien couper et jeter un œil. public i (Image image, DataInputStreamdataInputStream, Police police, int i1, int j1) {int k; int int j2; if (image ! = null) {a = image;b = j1 ; une = j1 ! = -1 ; } Remarque : Vous pouvez voir que cette méthode implique la variable a, et la responsabilité de cette variable est de déterminer si la quantité d'image est nulle. Ensuite, j'ai vu a = font dans else; cette phrase signifie attribuer la quantité de police à a (variable de police), ce qui peut être compris comme attribuer la police système à a. Nous espérons donc essayer de faire en sorte que cette méthode s'exécute toujours else, afin que nous puissions ajouter image = null avant if (image ! = null); De cette façon, la valeur de image est nulle au début et la partie else sera exécutée. Dans le bytecode : aload_1ifnull Label216 correspond à if (image! = null). (En raison de l'outil, il est plus difficile de modifier le positionnement sur le téléphone mobile que sur l'ordinateur.) aload_1 consiste à charger le premier (1) objet référencé par la variable locale et à le pousser sur la pile. La première variable locale correspond à l'image en première position du nom de la méthode. Ajoutez image=null ici pour créer un montant nul pour l'image. aconst_nullastore_1 Si vous souhaitez en savoir plus sur le principe, vous pouvez jeter un œil à Java Bytecode Revealed. Il convient de noter que le "1" dans astore_1 est basé sur le if précédent (image ! = null). Nous voyons que la troisième ligne est aload_1, ici c'est 1, alors astore_1 doit également être 1. À son tour, si c'est aload_2, alors ce devrait être astore_2 et ainsi de suite. aconst_null
astore_1 Ce segment de code est relativement mécanique, vous pouvez donc vous en souvenir. Les jeux produits par Digital Chocolate sont relativement fixes, et tous ceux qui souhaitent localiser leurs jeux devraient les modifier de cette manière. Les modifications de jeu de DC sont essentiellement la base de nombreuses modifications de jeu. Il est donc recommandé à chacun de bien le maîtriser. Les jeux d'autres fabricants ne sont pas si simples, et même les jeux du même fabricant peuvent avoir des méthodes de modification différentes. Ce qu'il faut, c'est un apprentissage et une pratique continus, une accumulation d'expérience et une compréhension approfondie de Java.
-------------------Version chinoise du texte du jeu Digital Chocolate. Après avoir réussi à transformer les caractères de l'image en caractères système, vous pouvez directement Chineseiser le texte. Les fichiers de langue sont essentiellement l0_0, l0_1, l0_2 et ainsi de suite. Dans « Mon animalerie », choisissez généralement le chinois l0_0 (anglais). Utilisez le plug-in présent dans le dossier SUMEA de l'outil informatique Halo pour l'ouvrir et le modifier directement. Sur le téléphone mobile, vous devez utiliser l'hexadécimal. Ouvrez l0_0 en hexadécimal. 00 00 3c 75 représente le nombre total d'octets 15477, 00 00 01 6c représente le nombre total d'octets de départ 364, 00 00 05 b8, 00 00 05 c1... représente l'octet de départ du champ. Quel est l'octet de début du champ ? Touche programmable gauche - Modifier - Accédez à l'adresse, entrez l'adresse 0x5b8 ou la décimale 1464. Après confirmation, vous constaterez qu'elle va à l'octet numéro 00 06 de l'anglais. Saisissez ensuite le deuxième 0x5c1 pour accéder au 00 02 de Ok ci-dessous. Chaque octet de départ correspond tour à tour aux champs suivants. Pour parler franchement, 5b8 est le nombre total d'octets avant 00 06. Le nombre d'octets changera lorsque nous le localiserons, et ceux-ci doivent être modifiés, ce qui est assez compliqué et gênant.