C++游戏编程:《控制台小游戏系列》之《彩画师-Graphics》

 Graphics类是一个绘图类,用于构造游戏画面,其主要有以下几个功能:   

       1、在指定位置绘制字符串,字符串颜色可以按参数指定

       2、在指定位置绘制空心矩形,矩形边框颜色可以按参数指定

       3、在指定位置绘制实心矩形,矩形填充颜色可以按参数指定
       4、用指定颜色清除控制台画面

      上述描述中提到一个位置的名词,对于控制台来说,缺省是一个80*25的字符界面,单位移动的是一个字符长度,所以控制台中以字符为单位距离而非像素。可以定义一个Point类,用于封装控制台X与Y轴的位置信息与一系列坐标运算。下面是这个Point类的源代码:
Point.h

  1. #ifndef _POINT_H_  
  2. #define _POINT_H_  
  3.   
  4. #include <windows.h>  
  5.   
  6. class Point  
  7. {  
  8. public:  
  9.     Point():m_ix(-1),m_iy(-1){};  
  10.     Point(int ix,int iy):m_ix(ix),m_iy(iy){};  
  11.     friend Point operator-(const Point &ptPoint1,const Point &ptPoint2);  
  12.     friend Point operator+(const Point &ptPoint1,const Point &ptPoint2);  
  13.     friend BOOL operator==(const Point &ptPoint1,const Point &ptPoint2);  
  14.     friend BOOL operator!=(const Point &ptPoint1,const Point &ptPoint2);  
  15.     virtual BOOL Collision(const Point &ptPoint) const;  
  16.     int GetX() const;  
  17.     int GetY() const;  
  18.   
  19. protected:  
  20.     int m_ix;  
  21.     int m_iy;  
  22. };  
  23.   
  24. inline int Point::GetX() const  
  25. {  
  26.     return m_ix;  
  27. }  
  28.   
  29. inline int Point::GetY() const  
  30. {  
  31.     return m_iy;  
  32. }  
  33.   
  34. #endif//_POINT_H_  

Point.cpp

  1. #include "Point.h"  
  2.   
  3. Point operator -(const Point &ptPoint1,const Point &ptPoint2)  
  4. {  
  5.     return Point(ptPoint1.GetX()-ptPoint2.GetX(),ptPoint1.GetY()-ptPoint2.GetY());  
  6. }  
  7.   
  8. Point operator +(const Point &ptPoint1,const Point &ptPoint2)  
  9. {  
  10.     return Point(ptPoint1.GetX()+ptPoint2.GetX(),ptPoint1.GetY()+ptPoint2.GetY());  
  11. }  
  12.   
  13. BOOL operator==(const Point &ptPoint1,const Point &ptPoint2)  
  14. {  
  15.     return (ptPoint1.GetX()==ptPoint2.GetX()&&ptPoint1.GetY()==ptPoint2.GetY());  
  16. }  
  17.   
  18. BOOL operator!=(const Point &ptPoint1,const Point &ptPoint2)  
  19. {  
  20.     return (ptPoint1.GetX()!=ptPoint2.GetX()||ptPoint1.GetY()!=ptPoint2.GetY());  
  21. }  
  22.   
  23. BOOL Point::Collision(const Point &ptPoint) const  
  24. {  
  25.     Point pt=*this-ptPoint;  
  26.     return abs(pt.GetX())<1&&abs(pt.GetY())<1;  
  27. }  

      Point类中Collision()函数功能为判断两个坐标是否相交,用于游戏中的碰撞检测。
      有了坐标类,便可以创建我们的Graphics绘图类,下面是这个类的源代码,函数实现都很简单,就不用多做说明了。
Graphics.h

  1. #ifndef _GRAPHICS_H_  
  2. #define _GRAPHICS_H_  
  3.   
  4. #include <conio.h>  
  5. #include <iostream>  
  6. #include <string>  
  7. #include "Point.h"  
  8.   
  9. using namespace std;  
  10.   
  11. #define MAX_WIDTH  80  //最大绘制区域宽度  
  12. #define MAX_HEIGHT 25  //最大绘制区域高度  
  13.   
  14. /* 
  15.   —前景颜色<<4为背景色— 
  16.   BLACK      黑色 
  17.   BLUE       蓝色 
  18.   GREEN      绿色 
  19.   RED        红色 
  20.   INTENSITY  亮度 
  21. */  
  22. #define BLACK      0x0000  
  23. #define BLUE       0x0001  
  24. #define GREEN      0x0002  
  25. #define RED        0x0004  
  26. #define INTENSITY  0x0008  
  27.   
  28. class Graphics  
  29. {  
  30. public:  
  31.     Graphics();  
  32.     ~Graphics();  
  33.     void DrawString(string szStr,int ix,int iy,int iColor) const;  
  34.     void DrawString(string szStr,const Point &ptPoint,int iColor) const;  
  35.     void DrawRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const;  
  36.     void DrawRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const;  
  37.     void FillRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const;   
  38.     void FillRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const;  
  39.     void Clear(int iColor=BLACK) const;  
  40.     HANDLE GetHandle() const;  
  41. protected:  
  42.     void SetDrawPosition(int ix,int iy) const;  
  43.     void SetDrawColor(int iColor,BOOL bForeground=TRUE) const;  
  44.     void CheckDrawSize(int &ix,int &iy) const;  
  45. private:  
  46.     HANDLE m_hConsole;  
  47. };  
  48.   
  49. inline HANDLE Graphics::GetHandle() const  
  50. {  
  51.     return m_hConsole;  
  52. }  
  53.   
  54. inline void Graphics::CheckDrawSize(int &ix,int &iy) const  
  55. {  
  56.     ix=(ix>=MAX_WIDTH)?MAX_WIDTH-1:ix;  
  57.     iy=(iy>=MAX_HEIGHT)?MAX_HEIGHT-1:iy;  
  58. }  
  59.   
  60. #endif//_GRAPHICS_H_  
Graphics.cpp
  1. #include "Graphics.h"  
  2.   
  3. Graphics::Graphics()  
  4. {  
  5.     //获得当前控制台句柄  
  6.     m_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);  
  7. }  
  8.   
  9. Graphics::~Graphics()  
  10. {  
  11.     //  
  12. }  
  13.   
  14. /* 
  15.  * 方法: 
  16.  *     DrawString 绘制字符串 
  17.  * 参数: 
  18.  *     szStr      字符串 
  19.  *     ix         绘制坐标x 
  20.  *     iy         绘制坐标y 
  21.  *     iColor     绘制字符串颜色 
  22.  */  
  23. void Graphics::DrawString(string szStr,int ix,int iy,int iColor) const  
  24. {  
  25.     SetDrawPosition(ix*2,iy);  
  26.     SetDrawColor(iColor);  
  27.     cout<<szStr;  
  28. }  
  29.   
  30. /* 
  31.  * 方法: 
  32.  *     DrawString 绘制字符串 
  33.  * 参数: 
  34.  *     szStr      字符串 
  35.  *     ptPoint    绘制坐标 
  36.  *     iColor     绘制字符串颜色 
  37.  */  
  38. void Graphics::DrawString(string szStr,const Point &ptPoint,int iColor) const  
  39. {  
  40.     DrawString(szStr,ptPoint.GetX(),ptPoint.GetY(),iColor);  
  41. }  
  42.   
  43. /* 
  44.  * 方法: 
  45.  *     DrawRectangle 绘制矩形 
  46.  * 参数: 
  47.  *     ix1           矩形左上角坐标x 
  48.  *     iy1           矩形左上角坐标y 
  49.  *     ix2           矩形右下角坐标x 
  50.  *     iy2           矩形右下角坐标y 
  51.  *     iColor        矩形边框颜色 
  52.  */  
  53. void Graphics::DrawRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const  
  54. {  
  55.     int ix2,iy2;  
  56.     ix1*=2;  
  57.     iwidth=iwidth>MAX_WIDTH/2?MAX_WIDTH/2:iwidth;  
  58.     iheight=iheight>MAX_HEIGHT?MAX_HEIGHT:iheight;  
  59.     ix2=iwidth*2+ix1;  
  60.     iy2=iheight+iy1;  
  61.   
  62.     SetDrawColor(iColor,FALSE);  
  63.   
  64.     for(int x=ix1;x<ix2;x++)  
  65.     {         
  66.         SetDrawPosition(x,iy1);  
  67.         cout<<" ";  
  68.         SetDrawPosition(x,iy2-1);  
  69.         cout<<" ";  
  70.     }     
  71.   
  72.     for(int y=iy1;y<iy2;y++)  
  73.     {         
  74.         SetDrawPosition(ix1,y);  
  75.         cout<<" "<<" ";  
  76.         SetDrawPosition(ix2-2,y);  
  77.         cout<<" "<<" ";  
  78.     }     
  79.     SetDrawPosition(0,0);  
  80. }  
  81.   
  82. /* 
  83.  * 方法: 
  84.  *     DrawRectangle 绘制矩形 
  85.  * 参数: 
  86.  *     ptPoint1      矩形左上角坐标 
  87.  *     ptPoint2      矩形右下角坐标 
  88.  *     iColor        矩形边框颜色 
  89.  */  
  90. void Graphics::DrawRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const  
  91. {  
  92.     Point ptTemp=ptPoint2-ptPoint1;  
  93.     int iwidth=ptTemp.GetX();  
  94.     int iheight=ptTemp.GetY();  
  95.     DrawRectangle(ptPoint1.GetX(),ptPoint1.GetY(),iwidth,iheight,iColor);  
  96. }  
  97.   
  98. /* 
  99.  * 方法: 
  100.  *     FillRectangle 填充矩形 
  101.  * 参数: 
  102.  *     ix1           矩形左上角坐标x 
  103.  *     iy1           矩形左上角坐标y 
  104.  *     iwidth        矩形宽度 
  105.  *     iheight       矩形高度 
  106.  *     iColor        矩形填充颜色 
  107.  */  
  108. void Graphics::FillRectangle(int ix1,int iy1,int iwidth,int iheight,int iColor) const  
  109. {  
  110.     int ix2,iy2;  
  111.     ix1*=2;  
  112.     iwidth=iwidth>MAX_WIDTH/2?MAX_WIDTH/2:iwidth;  
  113.     iheight=iheight>MAX_HEIGHT?MAX_HEIGHT:iheight;  
  114.     ix2=iwidth*2+ix1;  
  115.     iy2=iheight+iy1;  
  116.     SetDrawColor(iColor,FALSE);  
  117.   
  118.     for(int y=iy1;y<iy2;y++)  
  119.     {  
  120.         for(int x=ix1;x<ix2;x++)  
  121.         {  
  122.             SetDrawPosition(x,y);  
  123.             cout<<" ";  
  124.         }     
  125.     }  
  126.     SetDrawPosition(0,0);  
  127. }  
  128.   
  129. /* 
  130.  * 方法: 
  131.  *     FillRectangle 填充矩形 
  132.  * 参数: 
  133.  *     ptPoint1      矩形左上角坐标 
  134.  *     ptPoint2      矩形右下角坐标 
  135.  *     iColor        矩形填充颜色 
  136.  */  
  137. void Graphics::FillRectangle(const Point &ptPoint1,const Point &ptPoint2,int iColor) const  
  138. {  
  139.     FillRectangle(ptPoint1.GetX(),ptPoint1.GetY(),ptPoint2.GetX(),ptPoint2.GetY(),iColor);  
  140. }  
  141.   
  142. /* 
  143.  * 方法: 
  144.  *     Clear 清除绘制画面 
  145.  * 参数: 
  146.  *     iColor清除背景色 
  147.  */  
  148. void Graphics::Clear(int iColor) const  
  149. {  
  150.     FillRectangle(0,0,MAX_WIDTH-1,MAX_HEIGHT-1,iColor);  
  151. }  
  152.   
  153. /* 
  154.  * 方法: 
  155.  *     SetDrawPosition 设置绘制开始坐标 
  156.  * 参数: 
  157.  *     ix              坐标x 
  158.  *     iy              坐标y 
  159.  */  
  160. void Graphics::SetDrawPosition(int ix,int iy) const  
  161. {  
  162.     CheckDrawSize(ix,iy);  
  163.     COORD pos;  
  164.     pos.X=ix;  
  165.     pos.Y=iy;  
  166.     SetConsoleCursorPosition(m_hConsole,pos);         
  167. }  
  168.   
  169. /* 
  170.  * 方法: 
  171.  *     SetDrawColor 设置绘制颜色 
  172.  * 参数: 
  173.  *     iColor       绘制颜色 
  174.  *     bForeground  前景颜色或者背景颜色标志 
  175.  */  
  176. void Graphics::SetDrawColor(int iColor,BOOL bForeground) const  
  177. {  
  178.     if(bForeground)  
  179.         SetConsoleTextAttribute(m_hConsole,iColor);  
  180.     else  
  181.         SetConsoleTextAttribute(m_hConsole,iColor<<4);  
  182. }  
      可以看到,函数基本实现思路就是先定位控制台光标位置,并设定文本颜色,再在相应位置输出相应的字符序列,读者可以修改代码中输出的字符,可以得到不同字符边框还有字符填充矩形,我这里输出一个空字符,得到实边框或统一颜色的矩形。

      下面可以对这个类进行一个小测试,看看输出的图形是否是我们所期望的。

  1. #include "Graphics.h"  
  2.   
  3. void main(){  
  4.     //设置控制台标题  
  5.     SetConsoleTitle("Graphics类测试");  
  6.     //初始化一个绘图对象  
  7.     Graphics g;  
  8.     //在位置(2,2)处画一个宽5高4的深红色矩形  
  9.     g.DrawRectangle(2,2,5,4,RED);  
  10.     //在位置(8,2)处画一个宽5高8的蓝色矩形  
  11.     g.DrawRectangle(8,2,5,8,BLUE|INTENSITY);  
  12.     //在位置(2,8)处填充一个宽5高8的绿色矩形  
  13.     g.FillRectangle(2,8,5,8,GREEN|INTENSITY);  
  14.     //在位置(10,4)处画一个宽10高8的白色矩形  
  15.     g.DrawRectangle(10,4,10,8,15);  
  16.     //在位置(2,17)处画一个字符串  
  17.     g.DrawString("Hello,ConsoleWorld!",2,17,RED);  
  18.     //在位置(3,18)处画一个字符串  
  19.     g.DrawString("I'm 阿理...",Point(3,18),BLUE);  
  20.     //  
  21.     getch();  
  22. }  

      所输出的结果为:

      测试结果是不是非常”酷“,Graphics类提供非常简便的函数接口,简单的调用便能创造出色彩缤纷的世界。有了这个类,以后创建游戏画面就简单多了,如果想丰富这个类的功能,大家就发挥自己的创意吧!

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值