`
桔红糕
  • 浏览: 42517 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

俄罗斯方块(七)添加开始按钮

    博客分类:
  • CPP
阅读更多

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

 

先在界面上添加一个开始按钮。打开资源文件中的。。。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);
}

 

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

  • 大小: 27.8 KB
  • 大小: 19.8 KB
分享到:
评论

相关推荐

    俄罗斯方块(基于MFC按钮的)

    《基于MFC按钮实现的俄罗斯方块》 俄罗斯方块是一款经典的电子游戏,以其简洁的规则和无穷的挑战性深受玩家喜爱。在这个项目中,我们采用Microsoft Foundation Classes (MFC) 框架来实现一个基于按钮控制的俄罗斯...

    C#俄罗斯方块,添加音乐

    俄罗斯方块游戏的界面应包含游戏区、得分显示、控制按钮(如开始、暂停、旋转)等元素。利用C#的图形绘制功能,可以实时更新游戏区的方块状态,同时通过事件监听处理用户的键盘输入,实现方块的移动和旋转。 总结,...

    C#俄罗斯方块游戏源代码,带背景音乐和音效

    开发者可能创建了一个`Form`或`Window`类,添加了画布控件来绘制游戏面板,同时添加按钮和状态栏来显示分数、控制游戏暂停和重启。事件驱动编程在这里发挥了重要作用,比如键盘事件监听方块的移动和旋转,以及窗口...

    俄罗斯方块(Qt实现)

    2. **方块类型**:俄罗斯方块有七种不同形状的方块,每种方块由四个单元格组成。这些方块的实例化和旋转逻辑需要编程实现。 3. **游戏状态管理**:包括方块生成、移动、旋转、消除行、得分计算等。游戏状态的更新...

    俄罗斯方块MFC俄罗斯方块带注解

    同时,利用MFC的CButton、CEdit等控件,可以添加菜单、按钮等交互元素,如开始游戏、暂停/继续、重置游戏等功能。 在处理用户输入方面,MFC提供了消息映射机制,可以方便地捕捉键盘事件。例如,通过响应WM_KEYDOWN...

    C#程序设计 之 俄罗斯方块

    在课程的【A184]C#程序设计 俄罗斯方块 第一讲.swf】文件中,你将开始接触到这些基础知识的讲解。讲师可能会逐步演示如何搭建游戏框架,创建基本的窗口界面,以及设置初步的方块生成和移动功能。随着课程的深入,你...

    MFC俄罗斯方块源程序

    MFC的控件库还允许我们创建游戏菜单、设置选项等,如添加开始、暂停、重置等按钮,增强游戏的交互性。通过处理按钮的消息,可以实现游戏的控制逻辑。 在“TetrisV6”这个源文件中,我们可以看到作者如何将这些概念...

    Javascript俄罗斯方块(canvas版)

    《JavaScript实现的Canvas版俄罗斯方块》 在编程领域,JavaScript是一种广泛使用的脚本语言,尤其在Web开发中,它为网页添加了动态交互性。本项目“Javascript俄罗斯方块(canvas版)”就是利用JavaScript的强大...

    jQuery版俄罗斯方块

    《jQuery版俄罗斯方块开发详解》 在网页游戏中,jQuery作为一种强大的JavaScript库,因其简洁的API和丰富的功能,被广泛应用于各种动态效果的实现。本篇文章将深入探讨如何使用jQuery来开发一款网页版的俄罗斯方块...

    c# 俄罗斯方块 c# 俄罗斯方块

    《C#实现的俄罗斯方块游戏详解》 俄罗斯方块是一款经典的电子游戏,自1984年诞生以来,就以其简洁的规则和无尽的挑战性吸引了无数玩家。本篇将详细介绍如何使用C#编程语言来实现这样一个游戏。C#是一种面向对象的、...

    用labview 写的俄罗斯方块,简单实现,性能上还需要优化

    在俄罗斯方块中,可能包括游戏区域显示、控制按钮(如旋转、左右移动、加速下落)、得分显示等。开发者需要设计布局,确保用户能够直观地操作游戏。 5. **事件结构**:LabVIEW的事件结构用于处理用户的输入,比如...

    mfc俄罗斯方块代码

    作为一个基础案例,这个俄罗斯方块游戏可能只实现了基本功能,但MFC提供了足够的灵活性,使得开发者可以进一步扩展,比如添加多级难度、排行榜、音效等功能。同时,为了提高性能,开发者可能会考虑优化绘图算法,...

    一个n年前用vb写的俄罗斯方块游戏源代码

    【标题】中的“一个n年前用vb写的俄罗斯方块游戏源代码”表明这是一个基于Visual Basic(VB)编程语言开发的俄罗斯方块游戏的源代码。VB是微软公司开发的一种面向对象的编程语言,尤其在20世纪90年代至21世纪初非常...

    pygame做的俄罗斯方块游戏

    在“pygame做的俄罗斯方块游戏”项目中,开发者利用pygame库实现了经典游戏——俄罗斯方块的完整功能。 首先,让我们了解一下pygame库的核心功能。pygame包括窗口管理器、事件处理、颜色管理、图像绘制、声音播放等...

    俄罗斯方块 俄罗斯方块 方块

    1. 设计游戏界面:使用VB的Form创建游戏窗口,添加画布(PictureBox)控件作为游戏区域,以及分数显示、暂停/继续按钮等控件。 2. 定义方块类:创建一个Class模块,定义方块的形状、颜色、位置等属性,以及旋转方法...

    搞笑俄罗斯方块delphi源码

    在"搞笑俄罗斯方块"的源码中,我们可以看到Delphi的VCL(Visual Component Library)框架被用来构建用户界面,包括游戏窗口、按钮、计分板等组件。同时,Delphi的事件驱动模型使得游戏响应用户输入变得轻而易举。 ...

    tetris 俄罗斯方块小游戏

    《 Tetris 俄罗斯方块小游戏开发详解》 俄罗斯方块,这款经典的益智游戏自诞生以来,便以其简单易上手、玩法深邃的特点...如果你对编程感兴趣,不妨尝试自己动手开发一款俄罗斯方块小游戏,体验从零开始创造的乐趣。

    用Java编写的俄罗斯方块

    《用Java编写的俄罗斯方块》是一款经典的编程实践项目,它展示了如何利用Java语言实现一个交互式的、基于图形用户界面(GUI)的游戏。这个程序的编写涵盖了多方面的Java技术,包括面向对象编程、事件处理、图形绘制...

    俄罗斯方块

    《Android版俄罗斯方块开发详解》 俄罗斯方块,这个经典的游戏自1984年诞生以来,就深受全球玩家喜爱。它简单易懂、趣味性强,是休闲娱乐的不二之选。随着技术的发展,从最初的家用游戏机到PC,再到现在的移动设备...

    DELPHI 版俄罗斯方块

    对于俄罗斯方块这样的游戏,开发者可能创建了一个TForm对象作为主窗口,并添加了TTimer组件来控制游戏的节奏,比如方块下落的速度。 游戏的核心部分是逻辑处理,这通常涉及到多个类的定义。开发者可能创建了一个名...

Global site tag (gtag.js) - Google Analytics