弹球程序是个非常经典的程序,经常容易被问到或者考到,所以非常有必要掌握一下。其思想非常的简单,就是当碰到边缘的时候将所碰撞的边缘的方向上的速度变为反向,例如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弹球游戏 WIN32弹球 GDI
ava弹球程序弹球程ava弹ava弹球程序弹球程序程序ava弹球程序弹球程序球程序
一个简单的C语言写的弹球程序
STM32F103 弹弹球游戏 程序,可自行移植,平台野火 指南者STM32F103
详细描述,请看下面博客: http://blog.csdn.net/kenden23/article/details/17268877
JAVA上机弹球程序,非常好用,包含结果截图
编写程序,该程序通过一个发射按钮可以发射一个弹球,该球遇到边界时会自动弹回,在移动固定次数后,该球停止运动。要求每次点击发射按钮都会发射一个弹球,如果点击多次,则多个弹球同时运动。该程序通过另一个结束...
(2) 弹球程序。编写程序,该程序通过一个发射按钮可以发射一个弹球,该球遇到边界时会自动弹回,在移动固定次数后,该球停止运动。要求每次点击发射按钮都会发射一个弹球,如果点击多次,则多个弹球同时运动。该程序...
经典小游戏弹球程序 JAVA语言编写的。
纯java语言编写的弹球小程序,希望对初学者学习java语言有所帮助。
用vs2013 win32编写的打砖块游戏,含有全部代码,可直接使用
编写程序,该程序通过一个发射按钮可以发射一个弹球,该球遇到边界时会自动弹回,在移动固定次数后,该球停止运动。要求每次点击发射按钮都会发射一个弹球,如果点击多次,则多个弹球同时运动。该程序通过另一个结束...
java 课程中的一个小程序有三个部分构成,分别为: Ball.java,BallComponent.java,BounceThread.java 通过BounceThread调用Ball和BallComponent来实现程序
基于C#的弹球软件,过程很简单,模仿手机内存清理功能。
这是我自己根据斯坦福大学的视频的演示效果自己做的,可以实现每次触地变换颜色。
在微软WINXP里的名字叫太空军校生的3D弹球游戏
蓝桥杯EV3 5-6题程序 程序包含。
下载解压完可以直接使用vs2013进行运行调试,旨在帮助学习操作系统的初学者来了解多线程的使用,包括了互斥信号量的使用,和c#里面delegate的使用方法,如果有不同见解或对代码有疑问,可以给我留言,分享学习心得。
一款仿抖音的JS网页版弹球打砖块小游戏代码,玩法很简单,左右移动鼠标用挡板把弹球挡回去。
桌面弹弹球程序,可以实现小球在窗体框架内不断反弹!