Graphics類是一個繪圖類,用於構造遊戲畫面,其主要有以下幾個功能:
1、在指定位置繪製字符串,字符串顏色可以按參數指定
2、在指定位置繪製空心矩形,矩形邊框顏色可以按參數指定
3、在指定位置繪製實心矩形,矩形填充顏色可以按參數指定
4、用指定顏色清除控制檯畫面
上述描述中提到一個位置的名詞,對於控制檯來說,缺省是一個80*25的字符界面,單位移動的是一個字符長度,所以控制檯中以字符爲單位距離而非像素。可以定義一個Point類,用於封裝控制檯X與Y軸的位置信息與一系列座標運算。下面是這個Point類的源代碼:
Point.h
- #ifndef _POINT_H_
- #define _POINT_H_
- #include <windows.h>
- class Point
- {
- public:
- Point():m_ix(-1),m_iy(-1){};
- Point(int ix,int iy):m_ix(ix),m_iy(iy){};
- friend Point operator-(const Point &ptPoint1,const Point &ptPoint2);
- friend Point operator+(const Point &ptPoint1,const Point &ptPoint2);
- friend BOOL operator==(const Point &ptPoint1,const Point &ptPoint2);
- friend BOOL operator!=(const Point &ptPoint1,const Point &ptPoint2);
- virtual BOOL Collision(const Point &ptPoint) const;
- int GetX() const;
- int GetY() const;
- protected:
- int m_ix;
- int m_iy;
- };
- inline int Point::GetX() const
- {
- return m_ix;
- }
- inline int Point::GetY() const
- {
- return m_iy;
- }
- #endif//_POINT_H_
Point.cpp
- #include "Point.h"
- Point operator -(const Point &ptPoint1,const Point &ptPoint2)
- {
- return Point(ptPoint1.GetX()-ptPoint2.GetX(),ptPoint1.GetY()-ptPoint2.GetY());
- }
- Point operator +(const Point &ptPoint1,const Point &ptPoint2)
- {
- return Point(ptPoint1.GetX()+ptPoint2.GetX(),ptPoint1.GetY()+ptPoint2.GetY());
- }
- BOOL operator==(const Point &ptPoint1,const Point &ptPoint2)
- {
- return (ptPoint1.GetX()==ptPoint2.GetX()&&ptPoint1.GetY()==ptPoint2.GetY());
- }
- BOOL operator!=(const Point &ptPoint1,const Point &ptPoint2)
- {
- return (ptPoint1.GetX()!=ptPoint2.GetX()||ptPoint1.GetY()!=ptPoint2.GetY());
- }
- BOOL Point::Collision(const Point &ptPoint) const
- {
- Point pt=*this-ptPoint;
- return abs(pt.GetX())<1&&abs(pt.GetY())<1;
- }
Point類中Collision()函數功能爲判斷兩個座標是否相交,用於遊戲中的碰撞檢測。
有了座標類,便可以創建我們的Graphics繪圖類,下面是這個類的源代碼,函數實現都很簡單,就不用多做說明了。
Graphics.h
- #ifndef _GRAPHICS_H_
- #define _GRAPHICS_H_
- #include <conio.h>
- #include <iostream>
- #include <string>
- #include "Point.h"
- using namespace std;
- #define MAX_WIDTH 80 //最大繪製區域寬度
- #define MAX_HEIGHT 25 //最大繪製區域高度
- /*
- —前景顏色<<4爲背景色—
- BLACK 黑色
- BLUE 藍色
- GREEN 綠色
- RED 紅色
- INTENSITY 亮度
- */
- #define BLACK 0x0000
- #define BLUE 0x0001
- #define GREEN 0x0002
- #define RED 0x0004
- #define INTENSITY 0x0008
- class Graphics
- {
- public:
- Graphics();
- ~Graphics();
- void DrawString(string szStr,int ix,int iy,int iColor) const;
- void DrawString(string szStr,const Point &ptPoint,int iColor) const;
- void DrawRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const;
- void DrawRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const;
- void FillRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const;
- void FillRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const;
- void Clear(int iColor=BLACK) const;
- HANDLE GetHandle() const;
- protected:
- void SetDrawPosition(int ix,int iy) const;
- void SetDrawColor(int iColor,BOOL bForeground=TRUE) const;
- void CheckDrawSize(int &ix,int &iy) const;
- private:
- HANDLE m_hConsole;
- };
- inline HANDLE Graphics::GetHandle() const
- {
- return m_hConsole;
- }
- inline void Graphics::CheckDrawSize(int &ix,int &iy) const
- {
- ix=(ix>=MAX_WIDTH)?MAX_WIDTH-1:ix;
- iy=(iy>=MAX_HEIGHT)?MAX_HEIGHT-1:iy;
- }
- #endif//_GRAPHICS_H_
- #include "Graphics.h"
- Graphics::Graphics()
- {
- //獲得當前控制檯句柄
- m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
- }
- Graphics::~Graphics()
- {
- //
- }
- /*
- * 方法:
- * DrawString 繪製字符串
- * 參數:
- * szStr 字符串
- * ix 繪製座標x
- * iy 繪製座標y
- * iColor 繪製字符串顏色
- */
- void Graphics::DrawString(string szStr,int ix,int iy,int iColor) const
- {
- SetDrawPosition(ix*2,iy);
- SetDrawColor(iColor);
- cout<<szStr;
- }
- /*
- * 方法:
- * DrawString 繪製字符串
- * 參數:
- * szStr 字符串
- * ptPoint 繪製座標
- * iColor 繪製字符串顏色
- */
- void Graphics::DrawString(string szStr,const Point &ptPoint,int iColor) const
- {
- DrawString(szStr,ptPoint.GetX(),ptPoint.GetY(),iColor);
- }
- /*
- * 方法:
- * DrawRectangle 繪製矩形
- * 參數:
- * ix1 矩形左上角座標x
- * iy1 矩形左上角座標y
- * ix2 矩形右下角座標x
- * iy2 矩形右下角座標y
- * iColor 矩形邊框顏色
- */
- void Graphics::DrawRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const
- {
- int ix2,iy2;
- ix1*=2;
- iwidth=iwidth>MAX_WIDTH/2?MAX_WIDTH/2:iwidth;
- iheight=iheight>MAX_HEIGHT?MAX_HEIGHT:iheight;
- ix2=iwidth*2+ix1;
- iy2=iheight+iy1;
- SetDrawColor(iColor,FALSE);
- for(int x=ix1;x<ix2;x++)
- {
- SetDrawPosition(x,iy1);
- cout<<" ";
- SetDrawPosition(x,iy2-1);
- cout<<" ";
- }
- for(int y=iy1;y<iy2;y++)
- {
- SetDrawPosition(ix1,y);
- cout<<" "<<" ";
- SetDrawPosition(ix2-2,y);
- cout<<" "<<" ";
- }
- SetDrawPosition(0,0);
- }
- /*
- * 方法:
- * DrawRectangle 繪製矩形
- * 參數:
- * ptPoint1 矩形左上角座標
- * ptPoint2 矩形右下角座標
- * iColor 矩形邊框顏色
- */
- void Graphics::DrawRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const
- {
- Point ptTemp=ptPoint2-ptPoint1;
- int iwidth=ptTemp.GetX();
- int iheight=ptTemp.GetY();
- DrawRectangle(ptPoint1.GetX(),ptPoint1.GetY(),iwidth,iheight,iColor);
- }
- /*
- * 方法:
- * FillRectangle 填充矩形
- * 參數:
- * ix1 矩形左上角座標x
- * iy1 矩形左上角座標y
- * iwidth 矩形寬度
- * iheight 矩形高度
- * iColor 矩形填充顏色
- */
- void Graphics::FillRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const
- {
- int ix2,iy2;
- ix1*=2;
- iwidth=iwidth>MAX_WIDTH/2?MAX_WIDTH/2:iwidth;
- iheight=iheight>MAX_HEIGHT?MAX_HEIGHT:iheight;
- ix2=iwidth*2+ix1;
- iy2=iheight+iy1;
- SetDrawColor(iColor,FALSE);
- for(int y=iy1;y<iy2;y++)
- {
- for(int x=ix1;x<ix2;x++)
- {
- SetDrawPosition(x,y);
- cout<<" ";
- }
- }
- SetDrawPosition(0,0);
- }
- /*
- * 方法:
- * FillRectangle 填充矩形
- * 參數:
- * ptPoint1 矩形左上角座標
- * ptPoint2 矩形右下角座標
- * iColor 矩形填充顏色
- */
- void Graphics::FillRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const
- {
- FillRectangle(ptPoint1.GetX(),ptPoint1.GetY(),ptPoint2.GetX(),ptPoint2.GetY(),iColor);
- }
- /*
- * 方法:
- * Clear 清除繪製畫面
- * 參數:
- * iColor清除背景色
- */
- void Graphics::Clear(int iColor) const
- {
- FillRectangle(0,0,MAX_WIDTH-1,MAX_HEIGHT-1,iColor);
- }
- /*
- * 方法:
- * SetDrawPosition 設置繪製開始座標
- * 參數:
- * ix 座標x
- * iy 座標y
- */
- void Graphics::SetDrawPosition(int ix,int iy) const
- {
- CheckDrawSize(ix,iy);
- COORD pos;
- pos.X=ix;
- pos.Y=iy;
- SetConsoleCursorPosition(m_hConsole,pos);
- }
- /*
- * 方法:
- * SetDrawColor 設置繪製顏色
- * 參數:
- * iColor 繪製顏色
- * bForeground 前景顏色或者背景顏色標誌
- */
- void Graphics::SetDrawColor(int iColor,BOOL bForeground) const
- {
- if(bForeground)
- SetConsoleTextAttribute(m_hConsole,iColor);
- else
- SetConsoleTextAttribute(m_hConsole,iColor<<4);
- }
下面可以對這個類進行一個小測試,看看輸出的圖形是否是我們所期望的。
- #include "Graphics.h"
- void main(){
- //設置控制檯標題
- SetConsoleTitle("Graphics類測試");
- //初始化一個繪圖對象
- Graphics g;
- //在位置(2,2)處畫一個寬5高4的深紅色矩形
- g.DrawRectangle(2,2,5,4,RED);
- //在位置(8,2)處畫一個寬5高8的藍色矩形
- g.DrawRectangle(8,2,5,8,BLUE|INTENSITY);
- //在位置(2,8)處填充一個寬5高8的綠色矩形
- g.FillRectangle(2,8,5,8,GREEN|INTENSITY);
- //在位置(10,4)處畫一個寬10高8的白色矩形
- g.DrawRectangle(10,4,10,8,15);
- //在位置(2,17)處畫一個字符串
- g.DrawString("Hello,ConsoleWorld!",2,17,RED);
- //在位置(3,18)處畫一個字符串
- g.DrawString("I'm 阿理...",Point(3,18),BLUE);
- //
- getch();
- }
所輸出的結果爲:
測試結果是不是非常”酷“,Graphics類提供非常簡便的函數接口,簡單的調用便能創造出色彩繽紛的世界。有了這個類,以後創建遊戲畫面就簡單多了,如果想豐富這個類的功能,大家就發揮自己的創意吧!