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类提供非常简便的函数接口,简单的调用便能创造出色彩缤纷的世界。有了这个类,以后创建游戏画面就简单多了,如果想丰富这个类的功能,大家就发挥自己的创意吧!