冒险解谜游戏中文网 ChinaAVG

标题: 在XNA中显示中文字符 [打印本页]

作者: shane007    时间: 2010-5-11 23:48
标题: 在XNA中显示中文字符
原文  j& v% ^- p6 c+ [8 p+ F' ?: g$ V* m
http://blog.csdn.net/lqr801225/archive/2009/05/26/4218688.aspx
8 B7 X& ]/ P' K. e9 ~! _7 E
& \5 f6 ?0 b, a, W( z# w
  ]9 `. V# s5 N, O在XNA中显示中文字符或其它UNICODE字符(非GDI+)
3 w; U+ `  G. A/ }. @) LXNA3.0+VS2008SP1下调试通过8 m+ F) w$ r' B2 F7 A# Y  R/ v
由于XNA内置的DrawString方法并不能输出全角UNICODE字符,只能设定字符的起始和终止的内码,欧洲语系的字元不多,可以一次导入并生成字体,但像亚洲语系这样动辄上千的字元又是全角,好像设计者并没有考虑到这些情况。为了实现字符输出,已经有一些方法,例如利用.net中的GDI+。下面的实现方法是通过生成自定义的文字托管方式来实现的。# q$ R) _4 C9 K# p' C
步骤如下:! W" m; r# a2 J9 q+ |3 R; }: F
建立字体文件" v2 W* C  ?3 [* ]+ m
字典文件:1 I- i% M) k) p  r6 n) ~* `
文字处理类:- S8 m" c6 w( T+ ^, M
DefaultFontProcessor.cs
using System.IO;
: m, g( T; u, p8 {4 Y2 O3 musing Microsoft.Xna.Framework.Content.Pipeline;
5 E+ P6 U. f1 d" Iusing Microsoft.Xna.Framework.Content.Pipeline.Graphics;1 `7 A' s- Y" _$ G) C
using Microsoft.Xna.Framework.Content.Pipeline.Processors;8 z) q$ A2 Q8 ~1 F- _4 ^4 i6 q

  w4 z1 S" `9 A. q% `9 w) u* ?! v. _
namespace FontProcessors1 h" q6 y( b0 ]4 C" r  B
{1 l# S) ]8 I5 [. y7 a
    [ContentProcessor]
) Q$ }$ t) T+ m- _8 O" [# l9 l    public class DefaultFontProcessor : FontDescriptionProcessor+ w! O- Z! Q2 Q8 @$ O; W
    {# K  L, z" Z3 N' g6 f' [! m2 k
        public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)% F, W- K% E# @- a8 t8 \
        {3 q. {. q- W* z- u; f# M0 D; v. N4 T
            //载入文件
+ k7 z8 F* ^$ c2 t* x$ I            string fullPath = Path.GetFullPath("message.txt");
" s) B/ ^1 f# r" h# y8 f            context.AddDependency(fullPath);
/ O* \7 P- V) a  l            string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8);+ M8 I% }1 s) Y, q
( Z+ h8 c) B( @2 }4 m
/ H3 a* S( E% \: K5 u4 N7 n
            //导入字符
" E/ P" u, {6 o4 W            foreach (char c in letters)$ m. f0 v7 M# {. Q8 e' f
            {- F! Z0 B3 q9 f8 }2 ?8 G8 d
                input.Characters.Add(c);8 `" D- h3 z8 f6 N0 c: P
            }9 e6 O7 [' x. [+ ~
            return base.Process(input, context);
: w+ M2 `1 e! X$ ?        }
5 z' q7 ~- M8 D4 {. b) B    }# N) g; q; P: C3 @
}4 K3 N) Z7 Y# z+ d/ m, Y: N* G( ~
; l3 D5 N: a9 \! ~2 f, E4 S: O
4 \$ f4 z; @  N; n, ], P: {

8 c* S' |" ~, _, t& M1 t( d+ Q- [添加项目引用7 X& x! B/ |: @! G+ U" h% P
在项目用使用
7 l& ~2 ]! F/ O1 `
Game1.cs
using System;, q9 a* S; O% x5 b3 V
using System.Collections.Generic;
9 @1 s& E9 Q9 \2 g$ ~* v4 w0 @- S2 w8 uusing Microsoft.Xna.Framework;
) N" L) k3 }- j9 ~. G% H; Lusing Microsoft.Xna.Framework.Audio;& l  l' q; _# A
using Microsoft.Xna.Framework.Content;
0 ^3 f9 x4 M& l/ r% m! yusing Microsoft.Xna.Framework.GamerServices;
* L' \% R7 f  R8 A+ n# F) h% v5 ausing Microsoft.Xna.Framework.Graphics;, {! ~% ~! j1 e
using Microsoft.Xna.Framework.Input;
* K" C/ Z$ B. ]0 w: `$ Jusing Microsoft.Xna.Framework.Net;) j7 m' N! f! L) c: G6 C  q
using Microsoft.Xna.Framework.Storage;
# U# S% Q- ^. K( m
9 _7 z# z! ~) x) H/ }/ E8 l* j
$ W1 \/ I4 a# u0 u2 Q, onamespace HelloWorld {
" T9 S! j7 a+ H1 o& P    public class GameMain : Microsoft.Xna.Framework.Game {
& o2 X: E( e; }- D. T7 K* G        private GraphicsDeviceManager graphics;   
2 a0 B; c4 `9 R. q8 G( p0 E- R- _        private SpriteBatch           spriteBatch;
0 [0 s" ?# _* j- d+ R        private SpriteFont            font;       & G9 E; d! R4 d2 V

/ \. }9 r( f' j' [2 i3 B, {
8 z4 Y! ]4 M, M# l        public GameMain() {! ^) Q/ j' ]  v0 N3 y" x
            graphics=new GraphicsDeviceManager(this);
8 A, q* t) K& ^. H, i5 f            Content.RootDirectory="Content";
9 o/ ~7 X' \% r8 y* p        }
- `7 f. |# q# Z8 h+ f0 [% D4 ^) @7 j6 ~& Q. [
7 b4 U8 E! T4 m% x( q3 N
        protected override void Initialize() {
6 o  F7 a' q! d% S5 a8 @$ v            base.Initialize();
0 p# H+ ?4 V$ G! b$ O3 _        }
% A% t' l: c) A( p- q% A) T# J: _! `' x  M9 m% l) c

% q$ G6 n" m+ P        protected override void LoadContent() {7 g/ y+ o* A# i3 s; S
            spriteBatch=new SpriteBatch(GraphicsDevice);& F3 G' x- b! N
            font=Content.Load<SpriteFont>("DefaultFont");! q. n  F% M! _
        }
! O4 |$ W% L( V8 ]8 f# v6 `: F# [+ ]3 G- K

* [9 ]* l( V/ x. H5 g' s1 d' Z/ j        protected override void UnloadContent() {) M: A  u' \6 H  ?' v. @
        }; }6 f9 H5 X( g( B. n
9 R* R5 C7 m, i, G( B+ {

8 W& B& M; z) w% m6 v1 Y# \        protected override void Update(GameTime gameTime) {
: [$ u' g3 u2 w; J4 F5 M            if (GamePad.GetState(PlayerIndex.One).Buttons.Back==
( Q: M' B1 y: ^0 V                ButtonState.Pressed) {
$ |8 b: K( t( V3 q4 M                Exit();5 s+ q7 l' T- W
            }" A' g0 y' ^' @3 f7 \1 G
0 `9 V& d% @# Q+ c# y: O1 C

5 N: E2 |  I% E8 C8 n+ q% I: l3 x            base.Update(gameTime);
+ x6 k$ T6 v3 u( _7 B+ L* \        }
% ~1 n1 L7 X  k5 E  h
3 ?" v& g1 A5 E0 _- @" h9 {
6 S! ~# n  O2 \* I2 N* d  `        protected override void Draw(GameTime gameTime) {
. D+ i( e1 s* G            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
& f6 E1 `! E8 g5 w$ e, l- B3 n; \# D* _" ~* ?

/ `- a! t* o, O. A  ?            spriteBatch.Begin();1 i" F* N) m/ W) y2 ~
            DrawString("中文输入测试,日本語テストを入力する",50,50);
& c6 p! q: P& d! o/ n  b) Z1 O            spriteBatch.End();+ @4 O' @, X, M) v3 I' a
4 U# \. G. p3 N: U3 t
) {3 |6 l6 }4 R* a
            base.Draw(gameTime);
2 u  U5 Q+ X* C+ ^; H        }
+ b8 ^1 v9 J' Q, o: N
- k9 V9 i3 x: R" t0 \7 V* y7 c! t# y0 a  i  l3 U
        private void DrawString(String str,int x,int y) {
. p6 V4 H/ U+ p( W" E5 I2 g5 X0 D            spriteBatch.DrawString(font,str,new Vector2(x,y),Color.White);2 ^8 K/ R. H5 U- [5 f- k
        }
4 e! d( D, `. w- Y  M8 z3 c4 b+ j    }
& c: ?& {" e7 e5 g# L}- P# {. X2 ?4 m! z, B3 @

6 ~% l" o& z" \8 M& \





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