C#: Viết trò chơi xếp gạch (tetris) 3D

Chia sẻ: Lại Văn Nghĩa | Ngày: | Loại File: DOC | Số trang:8

0
544
lượt xem
133
download

C#: Viết trò chơi xếp gạch (tetris) 3D

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

WallsGame là trò chơi Xếp gạch không gian ba chiều (phát triển trên môi trường 3D), sử dụng bộ thư viện CsGL (C Sharp OpenGL) của C#. Với ý tưởng phát triển trò chơi Xếp gạch truyền thống (Tetris) lên một mức cao hơn là thực hiện ở dạng 3D, hỗ trợ người dùng nhiều tiện ích hơn

Chủ đề:
Lưu

Nội dung Text: C#: Viết trò chơi xếp gạch (tetris) 3D

  1. C#: Viết trò chơi xếp gạch (tetris) 3D Tuesday, 2. December 2008, 19:04:42 source code WallsGame là trò chơi Xếp gạch không gian ba chiều (phát triển trên môi trường 3D), sử dụng bộ thư viện CsGL (C Sharp OpenGL) của C#. Với ý tưởng phát triển trò chơi Xếp gạch truyền thống (Tetris) lên một mức cao hơn là thực hiện ở dạng 3D, hỗ trợ người dùng nhiều tiện ích hơn như: - Cung cấp giao diện trực quan 3 chiều như thực tế - Cho phép người chơi tùy chọn góc nhìn. - Tùy chọn quy luật chơi. - Tùy chọn cấu hình trong lúc chơi (ánh sáng, màu sắc, tốc độ…) - Hướng dẫn chi tiết người chơi. - Tạo lập bảng thành tích người chơi. -… Luật chơi: + Khi trò chơi bắt đầu, các hình khối ( dạng ngẫu nhiên ) sẽ rơi xuống, bạn phải sắp xếp sao cho đầy các hàng trên trục Ox, Oz hoặc trên mặt phẳng xOz. + Khi đã đầy hàng hoặc mặt, các hộp trên hàng hoặc mặt đó sẽ bị hủy và điểm chơi sẽ tăng lên. + Khi bạn chơi với tốc độ càng cao thì điểm cộng của bạn càng lớn ( vì độ khó tăng lên ). + Nếu bạn để cho các khối hộp chất đầy đến điểm cao nhất thì bạn sẽ bị thua và trò chơi kết thúc => hãy chơi lại ván khác. ð chúc bạn vui vẻ với trò chơi xếp gạch 3D này. Cách chơi: Làm cách nào để di chuyển khối ? ð Bạn bấm F1 để dời hình khối qua trái, F2 để dời qua phải, F3 để di chuyển tới trước, F4 để di chuyển ra sau. ð Bạn bấm F9 để xoay hình khối trên trục Ox, F10 để xoay trên trục Oy, F11 để xoay trên trục Oz. ð Nếu bạn muốn hình khối rơi xuống nhanh thì bấm Enter. ð Nếu hình khối đã lấp đầy trục hoặc măt thì trục hoặc mặt đó sẽ tự động hủy. Bạn có thể click các phím sau trên bàn phím số để di chuyển khối: ð 4: di chuyển qua trái ð 6: di chuyển qua phải. ð 8: di chuyển ra sau. ð 2: di chuyển tới trước. ð , : Xoay trên trục Ox. ð . : Xoay trên trục Oy.
  2. ð / : Xoay trên trục Oz. Bạn có thể kéo thả chuột trên màn hình để xoay góc nhìn. Các thiết lập để chơi ván mới: Trên GameBar >> chọn New Game >> xuất hiện hộp thoại New Game. ð Trên các trackbar X, Y, Z cho phép bạn thiết lập độ rộng của không gian chơi. ð Trong hộp Kill On bạn có thể chọn cho phép hủy hộp trên trục Ox, Oz, hay trên mặt xOz khi nó đã được làm đầy. ð Bạn chọn Ok để chấp nhận chơi ván mới. ð Bạn chọn Cancel để tiếp tục chơi ván cũ. Source code: Đầu tiên, tôi xây dựng lớp điểm cho không gian 3D của mình ở tập tin point3d.cs, trong đó bao gồm 3 số dạng float lưu vị trí theo trục x, y, z. Lớp này khởi tạo theo 2 cách khác nhau. Mặc định là gốc tọa độ, hoặc theo 3 đối số truyền vào để tạo nên đối tượng. class Point3d { public float X, Y, Z; public Point3d() { X = Y = Z = 0.0f; } public Point3d(float fx, float fy, float fz) { X = fx; Y = fy; Z = fz; } } Ở tập tin CCube.cs, tôi xây dựng nên hình khối lập phương qua lớp CCube, Các data field của lớp gồm có: public Point3d Pos; public float Width = 0.3f; public float[] color = new float[3] { 1.0f, 1.0f, 0.0f }; public float AlphaColor = 0.5f; Pos – Lưu giữ điểm trong không gian, nơi mà tại đó, hình khối bắt đầu được vẽ. Width – Độ dài cạnh hình khối color – Mảng chứa giá trị màu theo RGB. AlphaColor – Sắc độ Alpha của hình khối được vẽ (giá trị từ 0 đến 1). Các constructor đảm bảo cho việc đối tượng CCube được tạo theo nhiều cách. Ngoài ra, còn có 2 hàm draw, chuyên vẽ hình khối:
  3. Draw() – vẽ hình khối thông thường DrawTexture(OpenGLTexture2D texture) – vẽ có sử dụng textture Ngoài ra, tôi còn định nghĩa một enum và struct NodeID // Tap hop cac trang thai cua nut. public enum NodeState { Empty, Full, Out } // Luu chi so cua mot nut. public struct NodeID { public int X, Y, Z; public void SetID(int x, int y, int z) { X = x; Y = y; Z = z; } } NodeState với: - Empty: Nút đó chưa được vẽ hay chính xác là không gian tại đó không có hình khối nào. - Full: Có chứa hình khối. - Out: Vượt khỏi biên của không gian trò chơi được tạo ra. NodeID dùng để lưu chỉ số của một nút. Tất cả các xử lý chính, tôi đặt nó trong lớp GameSize, kế thừa từ OpenGLControl. class GameSize: OpenGLControl { // ****************** VARIABLE *************************** public frmMain Parent; public int X, Y, Z; private MouseEventArgs preMouse = new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0); private float dX = 0.0f, dY = 0.0f; public NodeState[, ,] Room; public CCube[, ,] Nodes; // Luu danh sach cac nut dang hoat dong trong phong. public NodeID[] ctrlNodes; public uint CurrObject; public bool OnMoveObj = false; public bool EndGame = false; public int Score = 0; public bool OnErase = false; public bool EnableTexture = false;
  4. public float AlphaColor = 0.5f; public float[] ObjectColor = new float[3] { 0.5f, 0.5f, 0.5f }; // Xac nhan: huy tren truc, X, Z, mat XOZ. public bool KillX = true, KillZ = false, KillXOZ = false; public OpenGLTexture2D texObject = new OpenGLTexture2D("..//..//bmpObject.bmp"); public OpenGLTexture2D texFloor = new OpenGLTexture2D("..//..//bmpFloor.bmp"); public OpenGLTexture2D texOut = new OpenGLTexture2D("..//..//bmpButton.bmp"); public float[] light_position = new float[4] { 0.0f, 1.0f, 0.0f, 1.0f }; // ****************** CONSTRUCTOR ************************ public GameSize() // ****************** HANDLE EVENT *********************** protected override void InitGLContext() protected override void OnSizeChanged(EventArgs e) public override void glDraw() protected override void OnKeyDown(KeyEventArgs e) // ****************** ADDING FUNCTION ******************** // Thiet lap lai can phong. public void ResetTheRoom() // Thiet lap lai do mo cho cac doi tuong. public void ResetAlphaColor() // Thiet lap lai mau vat the. public void ResetObjectColor() // Thiet lap lai toa do diem sang. public void ResetLightPoint() // Kiem tra vung trong de tao doi tuong. public void CreateNewObject(uint type) // Xu ly truong hop doi tuong roi xuong. public void ObjectFall() // Xu ly truong hop di chuyen qua trai. public void MoveRight() // Xu ly truong hop di chuyen qua phai. public void MoveLeft() // Xu ly truong hop di chuyen toi truoc.
  5. public void MoveFront() // Xu ly truong hop di chuyen ra sau. public void MoveBack() // xu ly truong hop xoay theo truc Y. public void RotateY() // Xu ly truong hop xoay theo truc Z. public void RotateZ() // Kiem tra tro choi co ket thuc chua. public bool CheckEnd() // Kiem tra de huy & tinh diem. public void CheckErase() // Huy mot hang tren truc Ox. public void EraseX(int y, int z) // Huy mot mat tren truc XOZ. public void EraseXOZ(int y) // Thiet lap den chieu. public void EnableLighting() // Tat den chieu. public void DisableLighting() // Thiet lap blend. public void EnableBlending() // Ve toan bo man hinh public void DrawScreen() } Link download source code: http://www.mediafire.com/?kw4hxozjimq (source code chạy bằng Visual Studio 2005 hoặc SharpDevelop 2.2) Bạn có thể chạy trực tiếp file ./bin/release/WallsGame.exe để chơi thử game. Hy vọng source code này sẽ hữu ích cho các bạn! • digg • Facebook • Twitter • del.icio.us • StumbleUpon
  6. • reddit C#: Mã hóa và giải mã dữ liệu bằng thuật toán blowfish Comments binhnguyen # 26. May 2009, 16:06 Anh ơi sao em build bị 8 error. Tất cả đều liên quan đến thư viện CsGl could not be found. Làm sao mới có thể sử dụng được thư viện dll trong c#, mong anh chỉ giúp. Em mới chỉ bít dùng dll trong VC++ thôi à. Trong C++ một thư viện thường có những 3 file(.h,.lib,.dll). Còn C# em chưa rành lắm nên mong anh chỉ giáo thêm. Em cũng rất thích làm những game 3D. Có nghe nói tới thư viện OpenGL nhưng chưa tìm hiểu kĩ. Để bắt đầu làm game 3D thì học từ đâu hả anh. Anh có tài liệu gì share cho đàn em học hỏi với. Rất hân hạnh được làm wen với đàn anh. Hiện em đang là SV năm 3 ĐH SPKT.Email của em: abinh88@gmail.com , yahoo: abinh882002. Thanks. Phạm Quang Vinh # 26. May 2009, 16:22 Có nhiều thư viện OpenGL cho .NET, CsGL là một trong số đó, ưu điểm của nó là hướng đối tượng chứ không hướng module như thư viện OpenGL chuẩn. Nhược điểm của nó là quản lý tài nguyên để tương thích với môi trường .NET chưa được hoàn chỉnh. Bạn muốn add thư viện này vào, thì bạn mở project bằng Visual Studio, bạn nhìn vào Solution Explorer (nếu không thấy thanh này, thì bạn chọn View | Solution Explorer). Sau đó kick phải chuột lên mục 'references' rồi chọn 'Add references...', sau đó bạn chọn tab 'Browse' trong cửa sổ mới hiện ra. Tìm đến file CsGL.dll trong thư mục 'csgl' và bấm 'OK'. binhnguyen # 26. May 2009, 17:20 Vẫn còn lỗi running anh ơi. Lúc chạy chương trình thì nó bị lỗi đoạn này: public OpenGLTexture2D texObject = new OpenGLTexture2D("..//..//bmpObject.bmp"); public OpenGLTexture2D texFloor = new OpenGLTexture2D("..//..//bmpFloor.bmp"); public OpenGLTexture2D texOut = new OpenGLTexture2D("..//..//bmpButton.bmp");
  7. Đại loại là lỗi "The type initializer for 'CsGL.OSLib' threw an exception." Làm sao debug lỗi này đây huynh:confused: Phạm Quang Vinh # 29. May 2009, 00:09 Mình đã update lại link download... sao dạo này thằng box.net bèo thế không biết! Chơi với mediafire thôi! hoang thi duong # 24. June 2009, 01:44 bạn nào có trò chơi này viết bằng java ko vậy? up lên nhé! Phạm Văn Thuận # 26. August 2009, 04:03 Chào bạn, Mình xin gửi bạn bản cập nhật cho phép game của bạn có thể chơi với tay game joystick (như tay game vẫn chơi PS2). Với chức năng này, nó sẽ cho phép chương trình dễ sử dụng hơn. Đây là kết quả trong phần thực hành môn học Thiết bị ngoại vi và Kỹ thuật ghép nối của lớp K4 Tin học, Đại học Hùng Vương, Phú Thọ. Trong mã nguồn, mình đã chỉnh sửa ở hai chỗ: - Trong frMain.cs: Thêm timer và khai báo hàm API để làm việc với Joystick - Trong GameSize.cs: mình chuyển thuộc tính dx và dy sang public để cho phép truy xuất từ ngoài (mình lười viết hàm set, get) Mình xin gửi địa chỉ download source code và mô tả cách chơi http://www.mediafire.com/download.php?h41z2j331iv Phạm Quang Vinh # 26. August 2009, 16:10 Cảm ơn bạn, mình có xem qua source code! Đây là một ví dụ rất có ích cho những ai muốn viết game chơi bằng Joystick trên ngôn ngữ C#. Tuy nhiên mình cũng có một vài ý kiến đối với source code của bạn, bởi vì mình đả cố gắng đưa phần xử lý di chuyển đối tượng trên GameSize cho lớp GameSize tự xử lý, và bạn đã đưa phần xử lý di chuyển bằng thiết bị Joystick vào lớp frmMain để nó có thể điều khiển hoạt động của các đối tượng.
  8. Chương trình vẫn sẽ hoạt động được với cả bàn phím máy tính và Joystick nhưng điều này làm mất đi vẻ đẹp của ngôn ngữ lập trình hướng đối tượng khi đánh đồng frmMain với GameSize! NÓi đơn giản hơn, source code của bạn đã bắt buộc lớp frmMain can thiệp quá sâu vào hoạt động của lớp GameSize, điều này là không tốt, bởi vì một khi bạn muốn gắn game này vào một control khác không phải là frmMain (mà là vào một User Control khác chẳng hạn) thì bạn phải Implement lại những hoạt động như bạn hiện giờ bạn đã implement trong source code. Thân Phạm Văn Thuận # 27. August 2009, 03:57 Bạn cho ý kiến rất đúng, mình cũng có biết điều đó nhưng do các bạn sinh viên K4 Hùng Vương chưa biết lập trình C#.NET nên mình phải làm theo cách này cho dễ hiểu (vì mục đích chính của môn học là lập trình ghép nối mà, hiii). Mình sẽ cố gắng chuyển sớm đoạn mã này đóng gói trong lớp GameSize và cập nhật địa chỉ download trong thời gian ngắn nhất
Đồng bộ tài khoản