XNA – project đầu tiên

Posted: 06/05/2011 in XNA Game
Tags:

giới thiệu sơ sơ :C# – XNA là 1 công nghệ làm game, phiên bản XNA mới nhất là 3.0 , XNA cho phép làm game chạy trên hệ điều hành window mobile, làm game cho Xbox 360 và game chạy trên hệ điều hành window

yêu cầu đầu tiên máy phải cài NET frame work 3.5 , Visual studio 2008, XNA frame work 3.0, bạn phải biết ngôn ngữ C#
sau khi cài cái đống trên ta sẽ làm 1 project game đầu tiên ,project đầu tiên là 1 game bóng nẩy (chạm vào thành sẽ nẩy ra)

Khởi động C#, bạn chọn New Project -> Windows Game , rồi gõ tên Project vào, nhấn OK là tạo xong
Hình ảnh
Bạn build (F5) , chạy thử sẽ được như hình :
Hình ảnh
=> Ra cái cửa sổ xanh lè và không có con chuột là OK!

Lưu ý : Có thể bạn sẽ gặp lỗi không chạy được (build đc nhưng chạy ko đc), có thể là do máy bạn không đáp ứng đủ các yêu cầu sau :
+ Windows XP Sp2
+ Card màn hình phải hỗ trợ DirectX9c và PixelShader 1.1 trở lên
+ Không chạy trên hệ thống 64-bit
Gặp trường hợp này thì có lẽ bạn nên nâng cấp máy trước rồi mới tính đến chuyện xài XNA sau , nhưng đa số máy P4 mua từ sau năm 2002 là chơi đc món này rồi, nên bạn yên tâm

làm việc với resource

Trong game, điều cần thiết nhất là tài nguyên (tất nhiên ), khi dùng XNA, bạn không thể liên kết trực tiếp đến 1 file data nằm bên ngoài được mà phải đưa file đó vào Project, sau đó khi biên dịch, XNA sẽ chuyển các file đó thành dạng .xnb

Bây giờ ta sẽ thử đưa 1 đối tượng hình ảnh vào xem sao nhé.

Tại cửa sổ project, bạn click phải chuột vào mục Content, chọn Add -> Existing Item, hộp thoại Add Existing Item mở ra và bạn tìm đến file cần đưa vào project, add nó vào
Hình ảnh
sau khi add thành công thì cửa sổ project sẽ thêm 1 item mới như hình
Hình ảnh
Đối với các file khác (âm thanh, dữ liệu khác,…) bạn cũng làm tương tự để đưa nó vào project
Lưu ý :Bạn phải set thuộc tính Content Root Directory của mục Content là “.” (không có dấu nháy, như trong hình trên) thì mới chạy được!!!
Thao tác với Sprite
Sprite là một đối tượng thể hiện hình ảnh lên màn hình, và khi chạy game, nó sẽ là các nhân vật, đối tượng trong game, sprite có thể là đối tượng động (animate-sprite) hoặc đối tượng tĩnh (sprite).

Trong bài này, ta sẽ tìm hiểu cách tạo và vẽ một sprite ra màn hình, làm cho nó chuyển động, kiểm tra va chạm, … (kiểm tra va chạm là một hiệu ứng vật lý đơn giản nhất mà bất cứ game nào cũng có)

Bạn hãy tạo một project mới với tên là Creatinga2DSprite
Hình ảnh
Bạn có thể thay đổi màu nền của cửa sổ game bằng cách thay đổi giá trị Color trong dòng lệnh sau tại thủ tục Draw() nằm trong file Game1.cs – Draw là thủ tục đảm nhận việc vẽ tất cả mọi thứ lên màn hình.

graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

Bây giờ, ta sẽ add vào project một file hình để làm sprite
Hình ảnh

chú ý đoạn có dòng code

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

Chúng ta sẽ tiến hành khai báo các đối tượng, giá trị ở đây

//Đối tượng Texture
Texture2D mTexture;
//Điểm bắt đầu của texture
int mTextureStartX = 0;
//Đối tượng dùng để vẽ Sprite
SpriteBatch mSpriteBatch;
//Tọa độ X, Y của sprite
int mSpriteX = 0;
int mSpriteY = 0;
//Tốc độ di chuyển ngang dọc cho sprite
int mHorizontalSpeed = 3;
int mVerticalSpeed = 3;

Tại thủ tục LoadContent() bạn cho đoạn code này vào

//Khởi tạo mSpriteBatch
mSpriteBatch = new SpriteBatch(this.graphics.GraphicsDevice);//Đưa hình vào đối tượng mTexture
ContentManager aLoader = new ContentManager(Services);
mTexture = aLoader.Load<Texture2D>("JumpingJelly") as Texture2D;

Dòng cuối cùng bạn sẽ thấy tham số của hàm Load là “JumpingJelly”, file hình ảnh đưa vào làm sprite có tên là JumpingJelly.png, tương tự khi bạn add file vào và muốn load, chỉ cần ghi phần tên file, không cần đưa vào phần đuôi mở rộng của file.
Tại thủ tục Update() , cho thêm vào 2 dòng

CheckKeyboardInput();
UpdateSprite();

Sau đó viết hàm CheckKeyboardInput như sau :

protected void CheckKeyboardInput()
{
//Khởi tạo bàn phím
KeyboardState aKeyboard = Keyboard.GetState();
//Mảng lưu các phím đang được nhấn
Keys[] aCurrentKeys = aKeyboard.GetPressedKeys();for (int aCurrentKey = 0; aCurrentKey < aCurrentKeys.Length; aCurrentKey++)
{
//Nhấn nút qua trái thì sprite chạy qua bên trái
if (aCurrentKeys[aCurrentKey] == Keys.Left)
{
if (mHorizontalSpeed > 0)
{
mHorizontalSpeed *= -1;
}
mSpriteX += mHorizontalSpeed;
}//Nhấn qua phải thì sprite chạy qua phải
if (aCurrentKeys[aCurrentKey] == Keys.Right)
{
if (mHorizontalSpeed < 0)
{
mHorizontalSpeed *= -1;
}
mSpriteX += mHorizontalSpeed;
}//Nhấn nút lên thì sprite chạy lên
if (aCurrentKeys[aCurrentKey] == Keys.Up)
{
if (mVerticalSpeed > 0)
{
mVerticalSpeed *= -1;
}
mSpriteY += mVerticalSpeed;
}//Nhấn nút xuống thì sprite chạy xuống
if (aCurrentKeys[aCurrentKey] == Keys.Down)
{
if (mVerticalSpeed < 0)
{
mVerticalSpeed *= -1;
}
mSpriteY += mVerticalSpeed;
}

//Thoát game khi nhấn nút ESC
if (aCurrentKeys[aCurrentKey] == Keys.Escape)
{
this.Exit();
}
}
}

Hàm này dùng để kiểm tra phím nào được nhấn và nhấn phím gì thì làm cái gì
Sau đó viết hàm UpdateSprite

void UpdateSprite()
{
//Tự di chuyển sprite theo tốc độ
mSpriteX += mHorizontalSpeed;
mSpriteY += mVerticalSpeed;//Nếu mà sprite đụng cạnh màn hình
if (CheckBoundaryCollision() == true)
{
//Nếu đụng rồi thì sẽ làm những gì, bạn đưa vào trong này
}
}

viết thêm hàm CheckBoundaryCollision() để kiểm tra va chạm

protected Boolean CheckBoundaryCollision()
{
//Biến trả về khi có va chạm
Boolean aCollision = false;
//Đặt tọa độ cho cạnh màn hình
int aMaxX = Window.ClientBounds.Width - 50;
int aMinX = 0;
int aMaxY = Window.ClientBounds.Height - 50;
int aMinY = 0;//Kiểm tra xem đụng chưa, nếu đụng rồi thì aCollision set bằng true
if (mSpriteX > aMaxX)
{
mHorizontalSpeed *= -1;
mSpriteX = aMaxX;
aCollision = true;
}
else if (mSpriteX < aMinX)
{
mHorizontalSpeed *= -1;
mSpriteX = aMinX;
aCollision = true;
}
if (mSpriteY > aMaxY)
{
mVerticalSpeed *= -1;
mSpriteY = aMaxY;
aCollision = true;
}
else if (mSpriteY < aMinY)
{
mVerticalSpeed *= -1;
mSpriteY = aMinY;
aCollision = true;
}
return aCollision;
}

Rồi, bây giờ tại thủ tục Draw() bạn đưa đoạn code sau vào dưới cái dòng chú thích //TODO…

mSpriteBatch.Begin(SpriteBlendMode.AlphaBlend); //Bắt đầu vẽ
//Vẽ
mSpriteBatch.Draw(mTexture, new Rectangle(mSpriteX, mSpriteY, 50, 50), new Rectangle(mTextureStartX, 0, 256, 256), Color.White);
mSpriteBatch.End(); //Kết thúc

những lệnh vẽ bạn phải đặt vào giữa đoạn Begin-End, hình nào được vẽ trước sẽ nằm phía dưới, hình nào vẽ sau sẽ nằm ở trên.

Xong rồi, giờ chạy thử bạn sẽ được như hình :

Hình ảnh
Nhấn các phím mũi tên thì sprite nó sẽ di chuyển, nhấn ESC sẽ thoát.

Comments
  1. DatBerry says:

    Anh ơi sao em làm theo hướng dẫn nhưng nó vẫn ghi lỗi load file ảnh lên ý ạ😐

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s