[XNA GameStudio] Bài 6 : Set Text và các hiệu ứng đối với Text

Đăng bởi : 7/18/2014


 Chào - như đã hứa hôm nay mình sẽ hướng dẫn các bạn phần còn lại của hiển thị Text.
Bài học cũng khá đơn giản nên chúng ta tiến hành luôn nhé Code rất ngắn.. nhưng mình sẽ cố gắng chú thích thật kĩ cho các bạn dễ hiểu :)

I. Set Text
- Draw() là một phương thức chạy liên tục như vòng lặp vô hạn trong game và cũng giống như Update() nên việc set Text cũng rất đơn giản như sau :

// Khai báo
string Text = "Xin chào";

// Trong phương thức Draw 
// DrawString như bài 5 đã học chỉ khác là thay cái nội dung thành biến Text thôi :D
protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     spriteBatch.DrawString(spriteFont, Text, new Vector2(100, 20), Color.White); 
     spriteBatch.End();

     base.Draw(gameTime);
}

// Trong phương thức Update chúng ta sẽ ôn lại cái lấy trạng thái của bàn phím nhé
protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // Lấy trạng thái bàn phím
            KeyboardState keyState = Keyboard.GetState();

            if (keyState.IsKeyDown(Keys.A))
                Text = "You pressed A key";

            base.Update(gameTime);
        }
OK hãy thử và xem thành quả nhé. Khi ấn phím A, đoạn Text sẽ được set thành "You pressed A key". Tương tự hãy làm cái Score như thế :) ... Không hiểu chỗ nào cứ comment bên dưới nhé ^^!

II. Hiệu ứng trong suốt đối với Text
Các kiểu dữ liệu trong thư viện của XNA hầu hết giống với các kiểu dữ liệu trong các thư viện C# mà chúng ta vẫn dùng, nhưng 1 số đã được thay đổi để thích ứng tốt hơn đối với lập trình game, ví dụ như gán giá trị float đôi khi không cần thêm chữ "f" đằng sau.
Và sau đây là 1 cái mình cảm thấy thú vị nhất đó là Set trong suốt đối với màu.

// Màu trắng trong suốt 50%

Color MauTrongSuot = Color.White*0.5f;
// Màu xanh trong suốt 20%
Color MauTrongSuot2 = Color.Blue*0.2f;
OK giờ các bạn có thể làm 1 đoạn chữ có hiệu ứng "sáng lên dần dần - tối đi đều đều" :)) như sau
// Khai báo
float _DoTrongSuot = 1.0f; // Khai báo biến trong suốt ban đầu là 100%

// Trong phương thức Draw cũng Draw bình thường như bài 5 nhé - chỉ sửa chỗ Color thôi
protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     spriteBatch.DrawString(spriteFont, Text, new Vector2(100, 20), Color.White*_DoTrongSuot); 
     spriteBatch.End();

     base.Draw(gameTime);
}

// Tới chỗ khó rồi đây... mình cần nó sáng lên tới 1 mức nào đó rồi lại tối đi
// Với Timer trong winform thì đơn giản rồi
// Nhưng vì phương thức Update() chạy liên tục nên chúng ta bắt buộc phải làm kiểu "Timer" cho nó

// Khai báo 1 biến đại diện cho thời gian
// Mục đích là tăng biến này sau mỗi lần Update() được gọi
// Tới một mức nào đó thì mới cho thực hiện lệnh (giống kiểu hẹn giờ thôi)
float _Timer = 0f;
float _GiatriCong = 0.1f;
protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // Mỗi lần Update được gọi chúng ta cộng thêm vào _Timer một giá trị tính = mini giây
           _Timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds;

           if (_Timer >= 80f) // Nếu _Timer được cộng tới khi nó bằng hoặc vượt quá 80 thì mới cho chạy các lệnh của ta
           {
               // Đoạn này có tính thuật toán chắc ai học lập trình rồi cũng sẽ biết thôi, nhưng mình cũng giải thích qua qua
               // Đoạn này có nghĩa là : Cộng vào độ trong suốt thêm 1 giá trị bằng _GiatriCong
               // Nếu độ trong suốt vượt quá 1 thì phải set nó lại là 1, và _GiatriCong *= -1 có nghĩa là đổi dấu để thực hiện                                                          phép trừ (thì khi nó nó sẽ tối dần) 
               // Tương tự với giới hạn dưới là 0.2 
               _DoTrongSuot += _GiaTriCong;
               
               if (_DoTrongSuot > 1f) 
               {
                   _DongTrongSuot = 1f;
                   _GiaTriCong *= -1f;
               }   
               else if (_DoTrongSuot < 0.2f)
               {
                    _DoTrongSuot = 0.2f
                    _GiaTriCong *= -1f;
               }
               _Timer = 0f; // Reset nó
           }

            base.Update(gameTime);
        }
OK , Giờ chúng ta đã có được hiệu ứng Text như mong muốn :)

III. Các cách Draw Text khác
Phương thức DrawString trong lớp SpriteBatch cung cấp cho ta tới 6 cách DrawString và các cách mình giới thiệu từ bài 5 tới giờ đều là cách thứ 1 và cũng là cách đơn giản nhất.
Tuy nhiên chúng ta còn có 5 các khác và cũng có nhiều tác dụng hay hơn
- Có vài phương thức thay string thành StringBuilder thì cũng như nhau thôi, nên ở đâu mình không giới thiệu nữa :)

* Phương thức số 3 -- là một phương thức có nhiều chức năng nhât


spriteBatch.DrawString(SpriteFont spriteFont, string Text, Vector2 Position, Color color, float rotation, Vector2 origion, float Scale, SpriteEffects spriteEffect, float LayerDepth);

Giải thích các parameters :
- SpriteFont, Text, Position, Color mình đã giới thiệu rồi
- rotation : Đó là góc quay tính bằng Radian của text (mặc định là 0), ví dụ tôi muốn đoạn Text nó dựng ngược lên thì cho giá trị này là pi/2 (tầm 1,5x)
- origion : Tạo độ tâm của đoạn Text (Tọa độ trên màn hình sẽ được xác định theo nó) và tâm quay của Text sẽ là nó
- Scale : là độ phóng to của Text (mặc định là 1f) (là 2f thì nó to gấp 2, 0.1 thì nó to = 1/10 cái mặc định)
- SpriteEfffect : là SpriteEffect.None thì bình thường, SpriteEffects.FlipHorizontally : quay ngược theo chiều ngang (cái này phục vụ cho di chuyển nhân vật ấy, SpriteEffects.FlipVertically : quay ngược theo chiều dọc (chổng mông lên zời haha)
- float LayerDepth : cứ để là 0f đi ^^  (Vì mình chưa thấy tác dụng của nó @@)
* Tương tự ta cũng có phương thức số 4 thay float Scale thành một Vector2 Scale có nghĩa là thay vì phóng to đều 2 chiều ta sẽ có thể tùy ý phóng to theo 1 chiều mình thích

*  Bài sau sẽ là Draw ảnh và các hiệu ứng . Mong các bạn theo dõi :)
Hẹn gặp lại


{ 1 comments }

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -