Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1

    Làm sao để draw được tiếng việt trong XNA? [Cùng thảo luận]


  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Sử dụng GDI+ để draw chắc là được thôi!

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi tauit_dnmd
    Em thì:
    Sử dụng Bitmap Font.Là:
    Dùng ảnh chứa tất cả tập hợp các kí tự ,để làm 1 bộ font --> Sau đó viết 1 Class để vẽ (map chuỗi kí tự cần vẽ vô bộ font và vẽ ra).
    J2ME toàn dùng kiểu này để draw Tiếng Việt.
    XNA thì cũng áp dụng kĩ thuật này đc.
    Thật ra cái này bộ LWUIT cũng xài.
    Ví dụ bộ ảnh bộ font mình tạo bằng tool (MobileRéourceMaker viết = C# )
    J2ME thì cái này anh cũng dùng rồi, font bitmap, có map key..anh thường dùng bộ Motivent để draw tiếng việt
    lý thuyết là thế, trong XNA lại khác. ai xử lí đc rồi thì post cả code lên nhé [IMG]images/smilies/smile.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thử code này xem nhé!

    Mã:
    Font font = new Font("Arial Unicode MS", 18, FontStyle.Regular);Bitmap bitmap = new Bitmap(200, 200);Graphics g = Graphics.FromImage(bitmap);g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;g.DrawString("Cộng đồng C Việt", font, Brushes.Black, 0, 0, StringFormat.GenericDefault);bitmap.Save("buffer"); //this could be a memory stream Texture2D texture = Texture2D.FromFile(Device3D, "buffer"); SpriteBatch batch = new SpriteBatch(Device3D);batch.Begin();batch.Draw(texture, new Microsoft.Xna.Framework.Rectangle(100, 100, 200, 200),Microsoft.Xna.Framework.Graphics.Color.White);batch.End();
    Sử dụng kỹ thuật giới thiệu ở trang này: blogs.msdn.com/b/manders/archive/2007/01/12/stroke-based-text-rendering-in-xna.aspx

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Vậy trong OpenGL làm như thế nào nhỉ, nếu ko dùng 1 file ảnh chứa tập hợp các kí tự như tauit nói?-

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cách của mình là dựa vào CharacterRegion trong *.spriteFont

    1. thử nghiệm mặc định
    - mục đích : in cái dòng "Xin chào cộng đồng cviet" ra màn hình
    - tạo 1 file spriteFont từ project, mặc định nội dung của file font là

    Mã:
    <?xml version="1.0" encoding="utf-8"?><XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">  <Asset Type="Graphics:FontDescription">    <FontName>Segoe UI Mono</FontName>    <Size>14</Size>    <Spacing>0</Spacing>    <UseKerning>true</UseKerning>    <Style>Regular</Style>      <CharacterRegions>       <CharacterRegion>        <Start> </Start>        <End>~</End>      </CharacterRegion>    </CharacterRegions>  </Asset></XnaContent>

    trong Game1.cs tôi code như sau

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Content;using Microsoft.Xna.Framework.GamerServices;using Microsoft.Xna.Framework.Graphics;using Microsoft.Xna.Framework.Input;using Microsoft.Xna.Framework.Input.Touch;using Microsoft.Xna.Framework.Media; namespace WindowsPhoneGame1{        public class Game1 : Microsoft.Xna.Framework.Game    {        GraphicsDeviceManager graphics;        SpriteBatch spriteBatch;        SpriteFont font = null;        String s = "Xin chào cộng đồng cviet";        public Game1()        {            graphics = new GraphicsDeviceManager(this);            Content.RootDirectory = "Content";                        TargetElapsedTime = TimeSpan.FromTicks(333333);        }         protected override void Initialize()        {                         base.Initialize();        }         protected override void LoadContent()        {                        spriteBatch = new SpriteBatch(GraphicsDevice);            font = Content.Load<SpriteFont>("font/font");        }         protected override void UnloadContent()        {                    }                 protected override void Update(GameTime gameTime)        {                       if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)                this.Exit();             base.Update(gameTime);        }         protected override void Draw(GameTime gameTime)        {            GraphicsDevice.Clear(Color.CornflowerBlue);            spriteBatch.Begin();            spriteBatch.DrawString(font, s, new Vector2(), Color.White);            spriteBatch.End();            base.Draw(gameTime);        }    }}
    chắc chắn sẽ lỗi be bét, Exception sẽ nhẩy đến đoạn spriteBatch.DrawString(font, s, new Vector2(), Color.White);
    cụ thể sẽ nhảy đến cái từ "à" trong chữ "chào"
    do

    2. Hướng suy nghĩ, tìm giải pháp

    phân tích :
    - nó chỉ lỗi ở các kí tự nguyên âm tiếng việt : à ,á ,ă,...v v
    - mở cái file *.spriteFont trên ra, để ý đoạn dưới có đoạn

    Mã:
     <CharacterRegion>        <Start> </Start>        <End>~</End>      </CharacterRegion>
    - để ý tiếp cái đống &#, 32,126 là cái quái gì nhỉ ? , start từ 32 đến 126 --> các bạn mở bảng mã ASCII ra xem nó là gì nhé. ---> các kí tự tiếng anh nó nằm trong đống này, nên draw tiếng anh thoải mái
    - &# đằng trước nghĩa là html code của kí tự đó
    - còn tiếng việt ? tôi lên google search : html code for vietnamese đc trang này http://art-hanoi.com/vncode/
    - tôi lần lượt thêm vào các thẻ <CharacterRegion> với các html code tiếng việt như trang đó
    - tóm lại sau khi thêm các <CharacterRegion> tôi có file font như sau

    Mã:
    <?xml version="1.0" encoding="utf-8"?><XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">  <Asset Type="Graphics:FontDescription">    <FontName>Tahoma</FontName>    <Size>20</Size>    <Spacing>0</Spacing>    <UseKerning>true</UseKerning>    <Style>Regular</Style>      <CharacterRegions>      <CharacterRegion>        <Start> </Start>        <End>~</End>      </CharacterRegion>      <CharacterRegion>        <Start>À</Start>        <End>Ã</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ạ</Start>        <End>ỹ</End>      </CharacterRegion>      <CharacterRegion>        <Start>È</Start>        <End>Í</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ò</Start>        <End>Õ</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ù</Start>        <End>Ú</End>      </CharacterRegion>      <CharacterRegion>        <Start>à</Start>        <End>ã</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ý</Start>        <End>Ý</End>      </CharacterRegion>      <CharacterRegion>        <Start>è</Start>        <End>ê</End>      </CharacterRegion>      <CharacterRegion>        <Start>ì</Start>        <End>í</End>      </CharacterRegion>      <CharacterRegion>        <Start>ò</Start>        <End>õ</End>      </CharacterRegion>      <CharacterRegion>        <Start>ù</Start>        <End>ù</End>      </CharacterRegion>      <CharacterRegion>        <Start>ú</Start>        <End>ú</End>      </CharacterRegion>      <CharacterRegion>        <Start>ý</Start>        <End>ý</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ă</Start>        <End>ă</End>      </CharacterRegion>      <CharacterRegion>        <Start>Đ</Start>        <End>đ</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ĩ</Start>        <End>ĩ</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ũ</Start>        <End>ũ</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ơ</Start>        <End>ơ</End>      </CharacterRegion>      <CharacterRegion>        <Start>Ư</Start>        <End>ư</End>      </CharacterRegion>    </CharacterRegions>  </Asset></XnaContent>
    giờ thì đoạn code Game1.cs ở trên chạy mượt, đã draw tiếng việt thoải mái. bạn có thể chọn font ở thẻ <FontName>Tahoma</FontName> của file font

    kết quả :


  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ẹc, có vẻ thẻ code của diễn đàn hiện ko đúng html code trong <characterRegion>

    mình đính kèm file lên đây cho các bạn dễ hiểu

    file *.spritefont như thế này :
    trước khi thêm html code tiếng việt

    sau khi thêm html code tiếng việt


    tóm lại : bây giờ cần draw tiếng việt, chỉ cần sử dụng file font mà mình tạo là đc, cần chỉnh loại font,kích cỡ,style thì mở ra edit là được

  8. #8
    chả thấy ai quan tâm, chắc đề tài lởm [IMG]images/smilies/biggrin.png[/IMG]

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zstar
    chả thấy ai quan tâm, chắc đề tài lởm [IMG]images/smilies/biggrin.png[/IMG]
    Em thì:
    Sử dụng Bitmap Font.Là:
    Dùng ảnh chứa tất cả tập hợp các kí tự ,để làm 1 bộ font --> Sau đó viết 1 Class để vẽ (map chuỗi kí tự cần vẽ vô bộ font và vẽ ra).
    J2ME toàn dùng kiểu này để draw Tiếng Việt.
    XNA thì cũng áp dụng kĩ thuật này đc.
    Thật ra cái này bộ LWUIT cũng xài.
    Ví dụ bộ ảnh bộ font mình tạo bằng tool (MobileRéourceMaker viết = C# )

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Sử dụng GDI+ để draw bitmap font, game Pro Evolution Soccer series đang dùng em này, font mặc định game đó hỗ trỡ tất cả ngôn ngữ, nhưng tiếc là tiếng việt ko dc, vì thiếu ký tự, nên anh em toàn tự chèn thêm ký tự, rồi tool sẽ tự draw lại font để thay thế cho ký tự ko dùng đến nhiều ( như tiếng trung quốc, thái lan, v,....)

    Bạn thử unpack thằng này rồi xem cách thức, hi vọng sẽ giúp ích cho bạn về vấn đề này

    PESUltimateDataExplorer_v2.9.7

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •