【游戏开发】祖玛游戏(七)添加开始按钮

既然俄罗斯方块和底板的画图都准备好了,那我们开始一局游戏吧。

 

先在界面上添加一个开始按钮。打开资源文件中的。。。DIALOG,打开工具箱,选中按钮,然后在Dialog中适当的地方点击,添加按钮。
【游戏开发】祖玛游戏(七)添加开始按钮

在按钮选中的情况下,打开属性窗口(VS菜单中选择视图-》属性窗口 或者选中按钮,右键弹出菜单中选择属性)。修改属性ID为IDC_BTNSTART, 并且修改Caption为开始


【游戏开发】祖玛游戏(七)添加开始按钮

这样开始按钮就添加好了。当用户点击这个按钮的时候,系统会触发一个BUTTON_CLICKED消息。我们只要对这个消息就行处理就可以了。要创建处理这个消息的函数很简单,只需要在资源文件中双击这个按钮,VS就会自动添加处理消息的函数,处理方式就是调用Panel的Start就可以了

 

void CTetris4Dlg::OnBnClickedBtnstart()

{

// TODO: 在此添加控件通知处理程序代码

m_Panel.start();

 

在Panel的start函数中,我们主要就是随机生成了一个方块。随机生成方块的地方需要稍作修改。

生成方块的函数,需要传递给方块生成位置的x, y 值,这个值是基于逻辑坐标的。

如何获得当前逻辑坐标的MaxX, MaxY呢?

根据画底图的课程,我们知道GetClientDC可以获知当前窗口的像素坐标值。

而在画方块的课程中,我们用了Box::step规定了画一个方块,也就是一个逻辑坐标,占用step的像素点。

所以,我们可以计算出,逻辑坐标的最大值也就是GetClientDC得出的像素坐标最大值除以每个逻辑点占用几个像素,也就是Box::step。

 

我们新建两个获得逻辑最大值位置的函数

int Panel::getWidth()

{

if (width==0)

{

CRect rect;

GetClientRect( rect);

width = rect.Width()/Box::step;

}

return width;

}

int Panel::getHeight()

{

if (height==0)

{

CRect rect;

GetClientRect( rect);

height = rect.Height()/Box::step;

}

return height;

}

 其中width,height保存为Panel成员变量,这样做只是为了第一次计算完成后把值保留下来,下次就不用再计算,提高效率了。

那么现在,随机创建的函数就可以这样写

void Panel::randomCreate()

{

srand(time(NULL));

int i = rand() % 4;

if(i == 0)

element = new Bar(getWidth()/2,0, this);

if(i == 1)

element = new Square(getWidth()/2,0, this);

if(i == 2)

element = new ShapeL(getWidth()/2,0, this);

if(i == 3)

element = new ShapeT(getWidth()/2,0, this);

}

 

完成,运行程序,你可以看到点击开始,会有个随机的黄色俄罗斯方块显示在Panel正中最上方。但是再点击开始,并没有什么改变。这并不是因为后面几次按钮没有起作用,而是因为界面没有刷新。不信,你可以用其他窗口遮挡住Panel,再移开,就可以看到俄罗斯方块已经换成新的一种了。

 

如何解决这个问题呢,只要在每次创建新的俄罗斯方块时,主动要求页面刷新,也就是主动要求发送WM_PAINT消息,让OnPaint函数再次运行就可以了。有一个函数叫做Invalidate();如果调用的时候提供参数false,系统就会发送WM_PAINT消息,跟你用窗口遮住,再移开发送的消息是一样的。

 

 

所以我们只要在start函数中加上这句话就可以了。

void Panel::start()

{

randomCreate();

Invalidate(false);

}

 

这样就完成了。再次运行,点击开始,你可以看到每次点击开始都会有不同的方块显现。

以上是 【游戏开发】祖玛游戏(七)添加开始按钮 的全部内容, 来源链接: utcz.com/a/69991.html

回到顶部