【MFC】打砖块小游戏(上)(5)

news2025/7/18 6:46:56

创建WIN32项目的时候,可以去掉勾选【空项目】可以减少工作量。

创建项目

文件-》新建-》 项目-》WIN32项目-》取消勾选空项目,完成创建

创建完成后,多出了很多文件,当然很多代码是前面已经手动写过了的:

stdafx.h  :预编译头文件,把一些常用的头文件包含语句、宏定义语句放在这里,提高系统编译的效率。

Resource.h :资源头文件 对程序中需要使用的资源(图片,光标,菜单等等)进行定义

资源文件目录中多出几个文件:两个ico图标文件,一个rc文件,在关闭Resource.h 文件后,双击rc文件可以打开资源视图,方便可视化添加资源。

以工程名 命名的cpp文件里自动生成了主函数、窗口函数等:

 与前述程序相比,添加了部分内容,可以查阅相关资料。

打砖块游戏

要求:

 键盘控制挡板左右平移,接到球反弹,打中砖块消除,挡板未接到球则游戏结束。

思路:

1、窗口大小的调整;宽度和高度

2、砖块的描述:数组,1表示有,0表示无;

3、碰撞的判断,球与砖块、球与挡板;

4、球的动画、反弹的效果(修改水平和垂直速度);

5、键盘和控制命令的实现。

砖块矩阵 4 (行)* 10(列),砖块图片大小 45(宽度)*20(高度), 为了简化设计,窗口大小直接设置成 450 * 450。

窗口大小调整:

 菜单命令:

双击RC文件,打开资源视图,对菜单进行编辑:删除帮助等

 注意,修改采集命令 开始 的ID ,这样就可以通过ID来判断是否点击开始。

把所需的三张图片(砖块、挡板、球)拷贝到工程目录(推荐、非必要)

 添加到资源:

 选择导入:

 选择三张图片,全部导入到工程:

 可以修改资源ID 

 为了简单,IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3分别是挡板、球、砖块

定义全局数组,初始化资源,编写两个函数,分别在WM_CREATE、WM_PAINT中调用,代码如下:

SDK_3.CPP文件:

// SDK_3.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "SDK_3.h"
#include "resource.h"
#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
void Init(HWND hWnd);
void Draw(HDC hdc );
BYTE brick_array[4][10]={
	{0,1,1,1,1,1,1,1,1,0},
	{0,0,1,1,1,1,1,1,0,0},
	{0,0,0,1,1,1,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0}	
};
HBITMAP ball,brick,baffle;
HDC hMemDC;
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: 在此放置代码。
	MSG msg;
	HACCEL hAccelTable;

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_SDK_3, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SDK_3));

	// 主消息循环:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SDK_3));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_SDK_3);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND	- 处理应用程序菜单
//  WM_PAINT	- 绘制主窗口
//  WM_DESTROY	- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{	
	case WM_CREATE:
		Init(hWnd);
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		Draw(hdc);
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
void Init(HWND hWnd)
{
	baffle = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
	ball = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP2));
    brick = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP3));
   
	::SetWindowPos(hWnd,
		NULL,
		(::GetSystemMetrics(SM_CXFULLSCREEN) - 450)/2,
		(::GetSystemMetrics(SM_CYFULLSCREEN) - 450)/2,
		450,
		500,
		SWP_NOZORDER);	
	HDC hdc = ::GetDC(hWnd);
	hMemDC = ::CreateCompatibleDC(hdc);
	::PatBlt(hMemDC,0,0,450,450,BLACKNESS);
	::ReleaseDC(hWnd,hdc);
}
void Draw(HDC hdc )
{
	int i,j;
	
    ::SelectObject(hMemDC,brick);
	for(i = 0; i < 4; i++)
	{
		for(j = 0; j < 10; j++)
		{
			if(brick_array[i][j] == 1)
			{
				::BitBlt(hdc,j * 45,i * 20,45,20,hMemDC,0,0,SRCCOPY);
			}
		}
	}		
	::SelectObject(hMemDC,ball);
	::BitBlt(hdc,225,420,10,10,hMemDC,0,0,SRCCOPY);
	::SelectObject(hMemDC,baffle);
	::BitBlt(hdc,170,430,111,10,hMemDC,0,0,SRCCOPY);  
}

运行效果:

 值得注意的是:以上代码为了简化,所以很多未规划的处理,

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚醚羰基铑功能化离子液体{[CH3O(CH2CH2O)nmim][Rhx(CO)y]}

聚醚羰基铑功能化离子液体{[CH3O(CH2CH2O)nmim][Rhx(CO)y]} 离子液体种类 目前研究较多的离子液体阳离子&#xff0c;根据有机母体的不同主要可分四种&#xff0c;即咪唑类离子[R1R3Im]、吡啶类离子[RPy]、烷基季铵类离子[NRxH4-x]以及烷基季膦类离子[PRxH4-x]。这四类阳离子…

【Designing ML Systems】第 9 章 :生产中的持续学习和测试

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

MySQL数据库的约束

文章目录一、约束是什么&#xff1f;二、约束的具体操作Not NULLUNIQUE约束的组合使用PRIMARY KEYDEFAULTFOREIGN KEY一、约束是什么&#xff1f; 约束就是&#xff0c;在创建表的时候&#xff0c;对表设置一些规则&#xff0c;只有满足这些规则&#xff0c;才可以插入数据&am…

【微服务】Nacos通知客户端服务变更以及重试机制

&#x1f496;Spring家族源码解析及微服务系列 ✨【微服务】Nacos服务发现源码分析 ✨【微服务】SpringBoot监听器机制以及在Nacos中的应用 ✨【微服务】Nacos客户端微服务注册原理流程 ✨【微服务】SpringCloud中使用Ribbon实现负载均衡的原理 ✨【微服务】SpringBoot启动流程…

字节一面后,我又看了一遍ThreadLocal核心原理

前言&#xff1a;上周在面试字节的时候&#xff0c;问到了ThreadLocal的核心原理&#xff0c;由于这个知识点当时有些淡忘&#xff0c;因此作此篇文章进行知识的记录&#xff0c;同时希望能够帮助到其他的小伙伴儿们。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&a…

动态 SQL

文章目录一、学习目的二、动态 SQL 中的元素三、条件查询操作四、更新操作五、复杂查询操作1.foreach 元素中的属性2.foreach 元素迭代数组3.foreach 元素迭代 List4.foreach 元素迭代 Map一、学习目的 在实际项目的开发中&#xff0c;开发人员在使用 JDBC 或其他持久层框架进…

【汇编 C++】多态底层---虚表、__vfptr指针

前言&#xff1a;如果对多态不太了解的话&#xff0c;可以看我的这篇文章《C多态》&#xff0c;另外本文中出现到的汇编代码&#xff0c;我都会予以解释&#xff0c;看不懂没关系&#xff0c;知道大概意思就行&#xff0c;能不讲汇编的地方我就不讲&#xff1b; 本文使用到的工…

networkx学习记录

networkx学习记录networkx学习记录1. 创建图表2. 节点3. 边4.检查图的元素5.从图中删除元素6.使用图构造函数7.访问边和邻居8.向图、节点和边添加属性9.有向图10. 绘制图形networkx学习记录 1. 创建图表 创建一个空图 import networkx as nx G nx.Graph()此时如果报以下错误…

HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

学姐突然问我键盘怎么选?原来是为了这个...

前言&#xff1a; 上个星期学姐来问我该买啥键盘&#xff0c;说是自己用的笔记本的键盘实在是不太好用&#xff0c;很喜欢机械键盘的手感&#xff0c;但是常规的机械键盘有太大了而且声音十分大&#xff0c;对她们女生来说并不是很友好。于是我给她推荐了我现在正在用的这款键盘…

头歌-信息安全技术-Java生成验证码

头歌-信息安全技术-Java生成验证码一、第1关&#xff1a;使用Servlet生成验证码1、任务描述2、编程要求3、评测代码二、第2关&#xff1a;用户登录时校验验证码是否正确1、任务描述2、编程要求3、评测代码三、第3关&#xff1a;使用Kaptcha组件生成验证码1、任务描述2、编程要求…

2023年前端开发未来可期

☆ 对于很多质疑&#xff0c;很多不解&#xff0c;本文将从 △ 目前企业内前端开发职业的占比&#xff1b; △ 目前业内开发语言的受欢迎程度&#xff1b; △ 近期社区问答活跃度&#xff1b; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货&#xff0c;通过深入…

跳槽前恶补面试题,成功上岸阿里,拿到33k的测开offer

不知不觉间&#xff0c;时间过得真快啊。作为一名程序员&#xff0c;应该都清楚每年的3、4月份和9、10月份都是跳槽的黄金季&#xff0c;各大企业在这段时间会大量招聘人才。在这段时间里&#xff0c;有人欢喜有人悲。想必各位在跳槽前都会做好充足的准备&#xff0c;同样做足了…

详细讲解网络协议:TCP和UDP什么区别?

该文章是学习了 B 站 up 主的视频做的总结&#xff0c;讲的很通俗易懂&#xff0c;首先感谢博主的分享。视频地址&#xff1a;https://www.bilibili.com/video/BV1kV411j7hA/?spm_id_from333.337.search-card.all.click&vd_source0a3d4c746a63d737330e738fa043eaf6 重新认…

【HDU No. 3567】八数码 II Eight II

【HDU No. 3567】八数码 II Eight II 杭电OJ 题目地址 【题意】 八数码&#xff0c;也叫作“九宫格”&#xff0c;来自一个古老的游戏。在这个游戏中&#xff0c;你将得到一个33的棋盘和8个方块。方块的编号为1&#xff5e;8&#xff0c;其中一块方块丢失&#xff0c;称之为“…

【python】基础复习

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录python的应用基础语法编码标识符python保留字第一个注释多行语句数字(Number)类型字符串(String)print 默认输出是换行的&#xff0c;如果要实现不换行需要在变量末尾加上 end""&#xff1a;impor…

猿创征文|在校大学生学习UI设计必备工具及日常生活中使用的软件

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 我是一名在校大二的学生&#xff0c;目前在学习关于UI设计方向的一些课程&#xff0c;平时会用到UI设计必备的工…

我终于读懂了适配器模式。。。

文章目录&#x1f5fe;&#x1f306;什么是适配器模式&#xff1f;&#x1f3ef;类适配器模式&#x1f3f0;对象适配器模式⛺️接口适配器模式&#x1f3ed;适配器模式在SpringMVC 框架应用的源码剖析&#x1f5fc;适配器模式的注意事项和细节&#x1f306;什么是适配器模式&am…

基于SDN环境下的DDoS异常攻击的检测与缓解--实验

基于SDN环境下的DDoS异常攻击的检测与缓解--实验基于SDN环境下的DDoS异常攻击的检测与缓解--实验1.安装floodlight2.安装sFlow-RT流量监控设备3.命令行安装curl工具4.构建拓扑5.DDoS 攻击检测6.DDoS 攻击防御7.总结申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&am…

PNG怎么转换成PDF?这篇文章教会你

有时候我们需要查找一些图片资料并将它打印出来&#xff0c;但是在网上的图片大多是以PNG格式存在的&#xff0c;这个时候&#xff0c;我们就需要先利用一些转换软件把PNG转换成PDF文件的格式&#xff0c;从而方便我们进行打印。那么你们知道PNG转PDF怎么转换吗&#xff1f;今天…