设为首页收藏本站官方微博

汉化资料 在XNA中显示中文字符

[复制链接]
查看: 2188|回复: 0
打印 上一主题 下一主题

[汉化资料] 在XNA中显示中文字符

跳转到指定楼层
楼主
发表于 2010-5-11 23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在XNA中显示中文字符

原文- i/ `( A: Q* q
http://blog.csdn.net/lqr801225/archive/2009/05/26/4218688.aspx0 p% e" U8 V$ V$ ~- Q/ |

+ [: ^1 ]$ [) _ . f8 p) I. J& D. q2 e* f1 r% D  `
在XNA中显示中文字符或其它UNICODE字符(非GDI+)8 B1 E  ]) }, `9 h; B2 f/ a
XNA3.0+VS2008SP1下调试通过
6 X) E, g! }3 Z3 _由于XNA内置的DrawString方法并不能输出全角UNICODE字符,只能设定字符的起始和终止的内码,欧洲语系的字元不多,可以一次导入并生成字体,但像亚洲语系这样动辄上千的字元又是全角,好像设计者并没有考虑到这些情况。为了实现字符输出,已经有一些方法,例如利用.net中的GDI+。下面的实现方法是通过生成自定义的文字托管方式来实现的。+ A5 X; G# S. X/ p
步骤如下:) o1 e% ~: Z3 @- h
建立字体文件& ]* _6 ]) d; n" I2 @# b) X+ I
    [li]在当前项目中的“Content”中点击右键 [/li][li]加入新的文件,类型是"Sprite Font",起名为"DefaultFont.spritefont" [/li][li]打开这个XML格式的文件,将"FontName"节中的字体改成含有目标语言字体的字体文件,这里使用“幼圆” [/li]
字典文件:
  G  `7 g; w- r2 o; z/ f
    [li]把游戏中需要的文字放到一个文本文件“message.txt”中,方便随时修改,以换行符结尾,内容如下:
    message.txt
    中文输入测试,日本語テストを入力する2 D( ^6 c) G+ u2 ?: E9 R- e

    $ O: |+ v) e3 n8 Y/ b& ^
    [/li][li]将这个文件放置在项目的Content目录下。 [/li][li]另存为一下这个文件,以“UTF-8”编码格式。 [/li][li]在解决方案浏览器中选择这个文件,在属性窗口的高级中的“生成操作”中选择“无”,“复制到输出目录”里选择“始终复制”。 [/li]
文字处理类:4 ?9 j# M; d1 o
    [li]在解决方案浏览器中右键点击解决方案 [/li][li]添加新的项目,在项目类型对话框中选择"Windows Game Library(3.0)",起名"FontProcess" [/li][li]在项目中增加引用,选择“Microsoft.Xna.Content.Pipeline” [/li][li]将这个项目中的默认类"Class1.cs"改名为"DefaultFontProcessor.cs",修改为如下代码: [/li][li]重新编译这个项目 [/li]
DefaultFontProcessor.cs
using System.IO;# ]& B9 G$ _% j; O# I
using Microsoft.Xna.Framework.Content.Pipeline;. R" f! }5 a% b( k' p
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;  g( C  S8 ]4 h% F
using Microsoft.Xna.Framework.Content.Pipeline.Processors;- s7 n2 [$ [5 L( D9 K
' h* m4 E( H2 U( h% X2 q
, n% E8 E. e8 T) X! J. z7 a5 `: H
namespace FontProcessors
/ {1 \, X3 f6 f) P* u{
: X5 r# {+ X8 o2 C5 q    [ContentProcessor]1 n, q9 J4 b5 Z) o- p0 p. f4 }
    public class DefaultFontProcessor : FontDescriptionProcessor1 x$ d7 m/ }* D  d' v4 _: A5 y4 z
    {
2 }! z' g- A7 y# G: Y6 ^% y* b        public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)9 V: }0 f; I% D; B1 E
        {& O; K' v2 j) w* u0 F
            //载入文件5 o! Y) ]" J' l, D# [
            string fullPath = Path.GetFullPath("message.txt");' H! I2 I4 Z! I4 D% h! M
            context.AddDependency(fullPath);5 H! M1 G- a8 @/ f
            string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8);
8 o; [. y: S. ~" {5 M( R/ \
( r' ~/ ?" l. m  h
" c' P4 o- ^4 z9 S0 O7 ~            //导入字符0 U% ^- y0 s2 M# S4 w$ c, Y7 Y
            foreach (char c in letters)8 O* Y  \7 L; d8 h2 q) N) X
            {
* X) }, N5 |5 ]% O: R                input.Characters.Add(c);
7 Z/ {8 u+ n2 v$ P% V( ?6 b            }, I5 h2 j  r2 a( F( D
            return base.Process(input, context);1 P5 n, ]& G$ y" O- J$ Z! X
        }* u) ~6 j" h. M/ \* H
    }9 k+ j, r1 p- R7 s8 C. N6 S
}' Z. y" i- W  l1 J  S7 G

& v: k% E+ u* k6 ~0 h9 e$ b: N
) z- _4 y) y) ]* v9 L! D
: n2 O$ N7 H# H, G
添加项目引用$ X+ u+ d# p4 p6 x7 n) R
    [li]在本项目的Content下的"引用"上点击右键,添加项目引用,在弹出的对话框中选择刚才建立的项目:“FontProcessors” [/li][li]在解决方案管理器选择本项目中的字体文件"DefaultFont.spritefont" [/li][li]在属性窗口中的Content Processor中选择我们建立的处理类:"DefaultFontProssor" [/li]
在项目用使用
  K% s6 Q8 f- Q) z7 @
    [li]在我们的项目中使用如下代码: [/li]
Game1.cs
using System;
  t* l# p( S. M6 a# Q  vusing System.Collections.Generic;
" X0 z; T+ O9 R9 p& ^; iusing Microsoft.Xna.Framework;8 i& ~$ N, K' Q# Y9 I9 F8 B# J$ b5 \
using Microsoft.Xna.Framework.Audio;
9 w8 T1 W$ t' V5 e6 o1 F7 k1 ^using Microsoft.Xna.Framework.Content;
& f) A. K2 Z- G- `7 S: ^1 k) Eusing Microsoft.Xna.Framework.GamerServices;# E: L. B8 h8 t( ^) Z
using Microsoft.Xna.Framework.Graphics;8 k. ?$ W! C! F
using Microsoft.Xna.Framework.Input;
- Q0 V, S" m/ T3 s" `/ h2 gusing Microsoft.Xna.Framework.Net;/ l, k* B8 n1 b
using Microsoft.Xna.Framework.Storage;
& [' W. ]8 _. F# R4 R7 R7 v5 ?4 M& M' f

/ n. f" X1 u- ]: ^1 ]( p- Xnamespace HelloWorld {
* @/ t8 Q( [7 |1 P  O    public class GameMain : Microsoft.Xna.Framework.Game {
, h# A+ B0 L) C/ X" h. N        private GraphicsDeviceManager graphics;   * k+ x8 i) O3 }6 T- X) ], H$ ]! G# _
        private SpriteBatch           spriteBatch;
3 P- }' n1 `5 [        private SpriteFont            font;       - z2 i7 x4 g8 p$ s+ S

! U& a8 Y* l* T7 ]. U* N; {9 t0 H2 z* f" u3 v
        public GameMain() {* d" X( k! v1 t: y8 t
            graphics=new GraphicsDeviceManager(this);, |; Z/ Q$ v5 F9 J0 w; P- |4 U
            Content.RootDirectory="Content";
% ?& u; c1 o- L% m: m        }! |* f) ^4 P% r+ B- p# p
- z2 O  \  B4 N8 l! V5 X

9 y# s* w. b& `2 X) x) x5 z        protected override void Initialize() {% D3 }* P& g* X* p. C9 E& y
            base.Initialize();0 |0 k- q" ]8 d! E% ~% S
        }
3 ]4 h) s4 [) E; Y- G- I/ L6 \; \5 k7 f& u* ^% o
8 ?2 w6 C8 G* V: I
        protected override void LoadContent() {) z5 v  t0 A# C* U( V% H1 ]
            spriteBatch=new SpriteBatch(GraphicsDevice);
" s0 @' m, E+ D' Z: W9 w            font=Content.Load<SpriteFont>("DefaultFont");
& h9 y0 C+ _- t2 O        }
0 @5 m8 V3 |5 b7 v, G5 G5 P" l
# S5 M0 L$ J" S3 K5 Q% v7 l6 D$ a' F4 w! T
        protected override void UnloadContent() {
" k! S; r% V5 c! p. F        }% h: S* f' }) q9 i7 p( D# x
4 a% j3 c  t% z+ D+ i$ t2 c7 h
, Y8 J8 K) J# }. F
        protected override void Update(GameTime gameTime) {
; R/ ~  B! e2 Y" S0 B. n" [            if (GamePad.GetState(PlayerIndex.One).Buttons.Back==7 T! K# @% Z0 y4 A: \
                ButtonState.Pressed) {. [0 S- s7 j+ t& t2 y! E# G
                Exit();
6 E! T+ r8 U1 g  G  z; w            }
# s% M& v4 A. q- M) t! I. j* E- T
, n4 w8 C- I. p$ }. Y  x. P) E$ n5 d/ V: o2 E; y4 c4 B) {
            base.Update(gameTime);
* D( U/ I& @0 G8 d+ y        }* E  O, q3 ]1 }+ `

8 l# g" T$ I4 D* h8 b1 U' c& L2 Q
' l& u/ J. {" w. s$ ?  k( o        protected override void Draw(GameTime gameTime) {
8 o1 n7 m# Z( q% C1 a- l            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);" U4 {. T: X6 \# E
* Y) r+ h6 f. j( i- I7 y9 P
5 [: x3 d. e! g1 |& B+ r7 ~" \
            spriteBatch.Begin();
9 m2 |- `: O2 k; a# e2 ~- D8 ?/ a            DrawString("中文输入测试,日本語テストを入力する",50,50);# y- M2 R3 A2 k: }( G' N6 h
            spriteBatch.End();! A" x3 k* [# r
# j7 m$ [+ J# ]
+ n- l, Y. u0 q+ p1 ?, A! h
            base.Draw(gameTime);
( @6 |0 q4 T* I( v" b- b5 _( W' A        }2 K+ K7 U3 q, M5 ?* {- f2 b% ]

  V- f, a4 a: v: w3 G0 L8 M. {% n
. m1 `/ d3 a- a" u$ M; q" }! K        private void DrawString(String str,int x,int y) {; ^$ }+ v  b) d5 j
            spriteBatch.DrawString(font,str,new Vector2(x,y),Color.White);
* W3 Q" M: |* c- L7 \/ y8 J" G7 k        }
% b) `- ^* n9 f) `4 l1 {    }7 f, {7 K8 f0 R- B  [
}  R, S) m& O  I) D4 h! O  i

! l9 V) a5 s$ y7 Q* s& h/ V9 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表