Post date: Jul 4, 2011 5:25:39 PM
Bản thân "graphics" là một khái niệm khá rộng và đa nghĩa. Trong phạm vi lập trình game, lớp View hay Canvas có thể hiểu như tờ giấy thì lớp graphics là công cụ để vẽ (bút chì, bút lông, hộp màu, ...)
Trong phần trước, ta đã xây dựng được lớp View. Trong phần này, ta xây dựng tiếp lớp Graphics tương tác với lớp View. Trước tiên, ta sẽ làm việc trên nền tảng 2D, do đó, tạm gọi lớp là Graphics2D
Lớp Graphics2D cung cấp các hàm cơ bản cho việc vẽ các đối tượng 2D như:
Lớp Graphics 2D có thể được xây dựng dựa trên nhiều nền tảng đồ họa khác nhau (tạm gọi là video driver)
Trong phiên bản này chỉ xây dựng một video driver GL-pipeline.
Bạn không phải lo lắng nếu chưa biết về OpenGL. Bạn có thể tạm thời chấp nhận các hàm liên quan đến OpenGL. Trong cách thiết kế ở phần sau, các phần lên quan đến OpenGL được tách rời trong một lớp, và không gây ảnh hưởng đến phần còn lại.
Ngoài ra, nếu cần, bạn có thể tham khảo một số link về OpenGL:
Vì sao cần có sự phân lớp?
Trên thực tế, ta có thể code trực tiếp ngay một lớp Graphics để phù hợp với OpenGL, tuy nhiên:
Như một lẽ tất yếu, phân lớp làm cho source trở nên "sạch đẹp" hơn. Tuy nhiên, lại có các nhược điểm:
Tùy vào sở thích, nhu cầu, ..., bạn có thể chọn cho mình một con đường phù hợp hơn. Trong phạm vi, bài này sẽ trình bày theo mô hình trên.
Để ví dụ, bài viết chỉ đề cập đến việc xây dựng một software video driver là GLPipelineDriver thông qua lớp:
class CCGLPipelineDriver
Lớp Graphics2D sẽ là một lớp dạng template:
template <class VideoDriver>
class CGraphics2D
Với cách thiết kế template này, đảm bảo cho lớp CGraphics2D hoạt động với nhiều driver khác nhau.
Ngoài ra, CGraphics cũng là một đối tượng dạng singleton, nên sẽ được thiết kết theo dạng singleton pattern
Bước 1: Thiết kế các lớp dữ liệu hổ trợ cho đồ họa 2D
Bước 2: Thiết kế lớp CCGLPipelineDriver
Bước 3: Thiết kế lớp CGraphics2D
Đến thời điểm hiện tại, lớp Graphics2D chỉ hổ trợ vẽ những hình học cơ bản như đường thẳng, hình vuông, tam giác. Việc vẽ hình ảnh, các đường conic, ... chưa được hổ trợ. Riêng với hình ảnh, sẽ được hộ trợ ở các bài sau.
Lớp CStatePoster được hiệu chỉnh cho ví dụ này:
CStatePoster::Render()
void CStatePoster::Render() { IGraphics2D *g = (IGraphics2D *)CGraphics2D::GetInstance(); g->Clear(SColor(0, 0, 0, 1)); g->SetColor(SColor(1, 0, 0, 1)); g->FillRect(SRect(10, 10, 100, 100)); g->SetColor(SColor(1, 1, 0, 1)); g->FillRect(SRect(100, 100, 100, 100)); g->SetColor(SColor(0, 1, 1, 0.8)); g->FillTriangle(SPosition2D(150, 150), SPosition2D(150, 100), SPosition2D(300, 100)); g->Flush(); }
Class diagram
Download source code ở đây