`
zy3381
  • 浏览: 157879 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

Win32版弹球程序

阅读更多
    弹球程序是个非常经典的程序,经常容易被问到或者考到,所以非常有必要掌握一下。其思想非常的简单,就是当碰到边缘的时候将所碰撞的边缘的方向上的速度变为反向,例如X方向上碰到了边缘,就将原来X方向上的速度变为负的,Y方向上的同理。然后就会产生一个全反射的碰撞反弹效果,Java下的弹球程序通过AWT或者Swing的低级绘图比较容易实现,个人觉得Win32下的实现更有意思,所以这里我们探索一下Win32下的实现,程序中已经包含了大量的注释,就不作过多解释了,直接上代码,本例在VC6下编译运行通过。

#include<windows.h>
#include<time.h>
/*
Win32版弹球程序
*/
//小球半径
#define RADIUS 50

//窗口类名称
char * className = "main";
//程序标题
char * appName = "弹球";

struct SBall
{
	int posX;
	int posY;
	
	int velX;
	int velY;
	
};
//取x-y范围的随机整数
int	  RandInt(int x,int y) {return rand()%(y-x+1)+x;}

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	WNDCLASSEX wnd;
	wnd.cbClsExtra = 0;
	wnd.cbSize = sizeof(WNDCLASSEX);
	wnd.cbWndExtra = 0;
	wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
	wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wnd.hInstance = hInstance;
	wnd.style = CS_VREDRAW | CS_HREDRAW;
	wnd.lpfnWndProc = WinProc;
	wnd.lpszClassName = className;
	wnd.lpszMenuName = NULL;
	wnd.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

	if(!RegisterClassEx(&wnd))
	{
		MessageBox(NULL,"注册窗口类失败","提示",0);
		return 0;
	}

	HWND hwnd = CreateWindowEx(NULL,className,appName,WS_OVERLAPPEDWINDOW,0,0,400,300,NULL,NULL,hInstance,NULL);

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	MSG msg;

	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);

		InvalidateRect(hwnd,NULL,TRUE);
	}

	UnregisterClass(className,wnd.hInstance);
	
	return msg.wParam;
}

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	//创建画刷
	static HBRUSH redBrush = CreateSolidBrush(RGB(255,0,0));
	static HBRUSH oldBrush = NULL;

	//创建一个小球
	static SBall *ball = new SBall();

	//客户区大小
	static int xClient,yClient;

	switch(msg)
	{
	case WM_CREATE:
		//获取客户区大小
		RECT rect;
		GetClientRect(hwnd,&rect);
		xClient = rect.right;
		yClient = rect.bottom;
		
		//初始化随机数生成器
		srand((unsigned)time(NULL));
		//初始化小球位置
		ball->posX = RandInt(0,xClient);
		ball->posY = RandInt(0,yClient);
		//初始化小球运动速度
		ball->velX = 10;
		ball->velY = 10;
		
		break;
	case WM_SIZE:
		//窗口大小发生变化,重新获取客户区大小
		xClient = LOWORD(lParam);
		yClient = HIWORD(lParam);
		break;
	case WM_PAINT:
		PAINTSTRUCT ps;
		BeginPaint(hwnd,&ps);

		//判断小球是否需要变换方向
		if (ball->posX+RADIUS >= xClient || ball->posX-RADIUS < 0)
		{
			ball->velX = -ball->velX;
		}
		if (ball->posY+RADIUS >= yClient || ball->posY-RADIUS < 0)
		{
			ball->velY = -ball->velY;
		}
		//小球按照当前速度移动一个单位
		ball->posX += ball->velX;
		ball->posY += ball->velY;

		//启用红色画刷
		oldBrush = (HBRUSH)SelectObject(ps.hdc,redBrush);
		//画出小球
		Ellipse(ps.hdc,ball->posX-RADIUS,ball->posY-RADIUS,ball->posX+RADIUS,ball->posY+RADIUS);
		//替换回老画刷
		SelectObject(ps.hdc,oldBrush);

		EndPaint(hwnd,&ps);
		Sleep(100);
		break;
	case WM_DESTROY:
		//退出程序前先清理内存占用
		DeleteObject(redBrush);
		DeleteObject(oldBrush);
		delete ball;
		
		PostQuitMessage (0);
		break;
	}
	return DefWindowProc(hwnd,msg,wParam,lParam);
}










分享到:
评论

相关推荐

    简单的WIN32弹球游戏

    1. **WIN32 API**:这是Microsoft Windows操作系统提供的应用程序编程接口,允许开发者直接与操作系统进行交互,创建和管理窗口、处理用户输入、管理内存等。在弹球游戏中,开发者通常会用到CreateWindowEx、...

    简单的弹球程序

    在编程世界中,"简单的弹球程序"是一个基础级别的项目,通常用于教学目的,帮助初学者理解游戏开发的基本原理和C语言的运用。这个程序可能包含了一些基本的图形用户界面(GUI)元素,如窗口、图像和动画效果,以及...

    简单Windows弹球程序

    标题中的“简单Windows弹球程序”指的是一个基于Windows操作系统开发的简单游戏,它模拟了物理中的弹球运动。这类程序通常用C++或C#等编程语言编写,并使用Windows API来实现图形用户界面和游戏逻辑。 描述中提到的...

    win32 游戏 打砖块

    【win32游戏打砖块】是利用Visual Studio 2013的win32应用程序接口(API)开发的一款经典休闲游戏。Win32 API 是Windows操作系统提供的编程接口,允许开发者创建与操作系统交互的图形用户界面(GUI)程序。在这个...

    自己用C语言写的弹球游戏——核心代码——最简洁1

    WIN32 API(应用程序接口)是微软Windows操作系统提供的一组函数,用于创建窗口、处理输入和绘制图形等任务,非常适合用来开发桌面应用,包括游戏。 游戏的核心代码通常包含以下几个关键部分: 1. **窗口初始化**...

    经典的弹球游戏,用于学习API函数编程很有帮助

    它包含了对Win32 API的广泛支持,因此非常适合用来开发使用API函数的弹球游戏。 在实现这样的弹球游戏时,可能会涉及以下知识点: 1. **窗口程序基础**:使用Win32 API创建和管理窗口,设置消息循环,处理用户输入...

    vc++编程实例 一个小弹球

    在VC++环境中,选择“文件”-&gt;“新建”-&gt;“项目”,然后选择“Win32控制台应用程序”。在向导中,确保选择“空项目”,并为项目命名,例如“BouncingBall”。 接下来,我们需要编写代码来实现游戏逻辑。主要涉及...

    xp的经典游戏三维弹球

    windows xp的经典游戏,三维弹球。 (空格凑字数)

    Win7Games.zip

    重要的是,"Win7Games.zip"针对Windows 10进行了全面的兼容性优化,这意味着无论你是使用Windows 10的哪个版本,无论是家庭版、专业版还是企业版,都可以顺利安装并享受这些游戏。开发者通过深入研究Windows API和...

    Python库 | mpf_mc-0.54.0.dev16-cp36-none-win32.whl

    `mpf_mc-0.54.0.dev16-cp36-none-win32.whl`文件表明这是一个针对Python 3.6编译的预发行版(`dev16`表示开发版本的第16次迭代),适用于Windows 32位操作系统。这种格式的文件可以直接通过Python的`pip`包管理器...

    PyPI 官网下载 | mpf_mc-0.55.0.dev10-cp37-none-win32.whl

    3. **Python 版本和架构匹配**: 文件名中的 `cp37` 表示兼容Python 3.7解释器,`none` 意味着这个包不针对特定的ABI(应用程序二进制接口),而 `win32` 表明它是为32位Windows系统设计的。如果你的环境是Python 3.7...

    pygame-2.0.3-cp38-cp38-win_amd64.zip

    pygame是Python编程语言中一个非常流行的开源库,用于创建多媒体应用程序,尤其是2D游戏。它提供了丰富的图形、声音和事件处理功能,使得开发者能够轻松构建交互式应用。在这个"pygame-2.0.3-cp38-cp38-win_amd64....

Global site tag (gtag.js) - Google Analytics