本篇将会是这个游戏图形化界面的核心,如何将逻辑和绘图联系,真正吧界面做出来~
其实各位应该已经想到了,在前面的绘图讲解中的那个绘图函数是通过像素操作进行绘图的,那么逻辑处理中也是二维数组的处理,很容易能将二维数组中的数据处理出具有像素数据的绘图用参数。
好了,那么下面我们将来实现这个想法:
首先既然要联系逻辑和绘图,那么逻辑类和绘图类都要做好准备,逻辑类要负责传出数据,绘图类需要提供接收数据的容器,请看下面代码:
int * COthelloLogic::GetColorData(void)
{
return &Color[0][0];
}
int COthelloLogic::Getcolor(void)
{
return color;
}
那么还要建立绘图类中的容器,于是我们要为绘图类添加成员变量和接口函数:
private:
int Color_View[8][8];
int color_View;
public:
void LoadDataFromLogic(int * Color,int color);
成员变量很显然就是View版本的棋盘和棋子颜色,函数从名字都可以知道是从逻辑类中获取数据的函数,参数对于逻辑类中两个输出函数的返回值。
void COthelloView::LoadDataFromLogic(int * Color,int color)
{
memcpy( Color_View, Color, sizeof(int)*8*8);
color_View = color;
}
memcpy是一个复制用函数,大家查百度很容易理解这个函数的。
那么我们在什么场合能在视图和逻辑这两个类以上的高度进行调用这些函数呢?那么就是我们主类的存在意义了,主类由于有这两个类的实例作为成员变量,所以可以轻易调用各种公开的函数:
m_View.LoadDataFromLogic(m_Logic.GetColorData(),m_Logic.Getcolor());
在主类中写入这样的代码编可以将数据传递到绘图类中。
但是这句应该怎么放才好呢?应该是在初始化的时候以及在响应鼠标的时候。具体位置我们后面再讲。
那么我们下面来修改绘图函数OnPaint,既然都得到了逻辑类的数据,那么我们将要使用这些数据画图,下面一次性全部贴出,毕竟要将一个双缓冲绘图的技术,分开不好将:
HDC hdcMem;
HDC hdcScr = GetDC(m_hWnd);
hdcMem = CreateCompatibleDC(hdcScr);
SelectObject(hdcMem,m_hBmpBack);
HDC hdcBlack;
hdcBlack = CreateCompatibleDC(hdcMem);
SelectObject(hdcBlack,m_hBmpBlack);
HDC hdcWhite;
hdcWhite = CreateCompatibleDC(hdcMem);
SelectObject(hdcWhite,m_hBmpWhite);
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
if( Color_View[i][j] == 1)
{
BitBlt(hdcMem,i*60+4,j*60+4,52,52,hdcBlack,0,0,SRCCOPY);
}
if( Color_View[i][j] == 2)
{
BitBlt(hdcMem,i*60+4,j*60+4,52,52,hdcWhite,0,0,SRCCOPY);
}
}
DeleteDC(hdcWhite);
DeleteDC(hdcBlack);
BitBlt(hdcScr,0,0,480,480+80,hdcMem,0,0,SRCCOPY);
DeleteDC(hdcMem);
DeleteDC(hdcScr);
呃,大家先慢慢看,我慢慢更新,今天一天更新的太多了,吃不消= =