利用C++创建一个游戏(8)游戏中的物理现象(代码+注释)

(1)匀速运动

#include "stdafx.h"      
#include "MyGameFrame.h"      
#include <stdio.h>

//全局变量
HWND              hWnd;
HINSTANCE         hInst;
HDC               hdc, mdc,bufdc;
HBITMAP           ball,bg;
DWORD             tPre, tNow;
int               i;
int               x,y;
RECT              rect;


// 此代码模块中包含的函数的前向声明:     
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                MyPaint(HDC hdc);


int APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR    lpCmdLine,
	int       nCmdShow)
{
	// 初始化全局字符串    
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:     
	if (!InitWindow(hInstance, nCmdShow))//初始化窗口    
	{
		return FALSE;//如果不成功则返回FALSE,并退出程序    
	}

	MSG msg; //创建消息类对象    

	// TODO: 在此放置运行代码。

	//定义局部变量
	HBITMAP           bmp;
	
	//建立内存DC和窗口DC
	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);
	bufdc = CreateCompatibleDC(hdc);

	//建立适用位图
	bmp = CreateCompatibleBitmap(hdc,640,480);
	SelectObject(mdc, bmp);

	//加载图片
	ball = (HBITMAP)LoadImage(NULL, "ball.bmp", IMAGE_BITMAP, 52,26, LR_LOADFROMFILE);
	bg = (HBITMAP)LoadImage(NULL, "bg3.bmp", IMAGE_BITMAP, 640,480, LR_LOADFROMFILE);
	


	// 主消息循环:     
	PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值    
										
	while (msg.message != WM_QUIT) {
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else {
			tNow = GetTickCount();
			if (tNow - tPre >= 30) {
				GetClientRect(hWnd, &rect);//获取的是以其自身的最左上角的点为坐标原点,此窗口的位置
				MyPaint(hdc);
			}
		}
	}

	
	return (int)msg.wParam;
}



//    
//  函数: MyRegisterClass()    
//    
//  注册Windows类,一款游戏有且仅有一个主窗口,与游戏程序唯一对应。创建游戏窗口前要填写窗口类结构体WNDCLASSEX    
//    
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex =
	{
		wcex.cbSize = sizeof(WNDCLASSEX),

		
		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,

		WndProc,0,0,

		hInstance,

		LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),

		LoadCursor(NULL, IDC_ARROW),


		(HBRUSH)(COLOR_WINDOW + 1),NULL,

		_T("GameFrame"),

		LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))
	};
	return RegisterClassEx(&wcex);
}

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

	hWnd = CreateWindow
	(
		_T("GameFrame"),
		_T("游戏框架"),
		WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化    
		100, 100, 640,480, nullptr, nullptr, hInstance, nullptr
	);

	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 msg, WPARAM wparam, LPARAM lparam)
{ 
	switch (msg)                        //判断消息    
	{
	case WM_CREATE:
		//执行初始化代码                  
		return(0);
		break;
	case WM_KEYDOWN:
		if (wparam == VK_ESCAPE)
			PostQuitMessage(0);
		break;
	case WM_DESTROY:
		//关闭程序,发送WM_QUIT消息    
		PostQuitMessage(0);
		return(0);
		break;
	default:
		break;
	}
	return (DefWindowProc(hwnd, msg, wparam, lparam));
}
void MyPaint(HDC hdc)
{
	SelectObject(bufdc, bg);
	BitBlt(mdc, 0, 0, 640, 480, bufdc, 0, 0, SRCCOPY);


	SelectObject(bufdc, ball);
	BitBlt(mdc, x, y, 26, 26, bufdc, 26, 0, SRCAND);
	BitBlt(mdc, x, y, 26, 26, bufdc, 0, 0, SRCPAINT);
	BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);

	x += 4; //计算X 轴方向贴图坐标

	y += 2; //计算Y 轴方向贴图坐标

	//如果小球超出边界
	if (x >rect.right - 26 || y >rect.bottom - 26)
	{
		x = 0;                               //小球回到窗口的左上角
		y = 0;
	}
	tPre = GetTickCount();

}

(2)加速运动

#include "stdafx.h"      
#include "MyGameFrame.h"      
#include <stdio.h>

//全局变量
HWND              hWnd;
HINSTANCE         hInst;
HDC               hdc, mdc, bufdc;
HBITMAP           ball, bg;
DWORD             tPre, tNow;
int               i;
int               x, y;
RECT              rect;
int               vy, gy;


// 此代码模块中包含的函数的前向声明:     
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                MyPaint(HDC hdc);


int APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR    lpCmdLine,
	int       nCmdShow)
{
	// 初始化全局字符串    
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:     
	if (!InitWindow(hInstance, nCmdShow))//初始化窗口    
	{
		return FALSE;//如果不成功则返回FALSE,并退出程序    
	}

	MSG msg; //创建消息类对象    

	// TODO: 在此放置运行代码。

	//定义局部变量
	HBITMAP           bmp;

	//建立内存DC和窗口DC
	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);
	bufdc = CreateCompatibleDC(hdc);

	//建立适用位图
	bmp = CreateCompatibleBitmap(hdc, 640, 480);
	SelectObject(mdc, bmp);

	//加载图片
	ball = (HBITMAP)LoadImage(NULL, "ball.bmp", IMAGE_BITMAP, 52, 26, LR_LOADFROMFILE);
	bg = (HBITMAP)LoadImage(NULL, "bg3.bmp", IMAGE_BITMAP, 640, 480, LR_LOADFROMFILE);



	// 主消息循环:     
	PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值    

	while (msg.message != WM_QUIT) {
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else {
			tNow = GetTickCount();
			if (tNow - tPre >= 30) {
				GetClientRect(hWnd, &rect);//获取的是以其自身的最左上角的点为坐标原点,此窗口的位置
				MyPaint(hdc);
			}
		}
	}


	return (int)msg.wParam;
}



//    
//  函数: MyRegisterClass()    
//    
//  注册Windows类,一款游戏有且仅有一个主窗口,与游戏程序唯一对应。创建游戏窗口前要填写窗口类结构体WNDCLASSEX    
//    
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex =
	{
		wcex.cbSize = sizeof(WNDCLASSEX),


		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,

		WndProc,0,0,

		hInstance,

		LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),

		LoadCursor(NULL, IDC_ARROW),


		(HBRUSH)(COLOR_WINDOW + 1),NULL,

		_T("GameFrame"),

		LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))
	};
	return RegisterClassEx(&wcex);
}

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

	hWnd = CreateWindow
	(
		_T("GameFrame"),
		_T("游戏框架"),
		WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化    
		100, 100, 640, 480, nullptr, nullptr, hInstance, nullptr
	);

	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 msg, WPARAM wparam, LPARAM lparam)
{
	switch (msg)                        //判断消息    
	{
	case WM_CREATE:
		//执行初始化代码                  
		return(0);
		break;
	case WM_KEYDOWN:
		if (wparam == VK_ESCAPE)
			PostQuitMessage(0);
		break;
	case WM_DESTROY:
		//关闭程序,发送WM_QUIT消息    
		PostQuitMessage(0);
		return(0);
		break;
	default:
		break;
	}
	return (DefWindowProc(hwnd, msg, wparam, lparam));
}
void MyPaint(HDC hdc)
{
	SelectObject(bufdc, bg);
	BitBlt(mdc, 0, 0, 640, 480, bufdc, 0, 0, SRCCOPY);


	SelectObject(bufdc, ball);
	BitBlt(mdc, x, y, 26, 26, bufdc, 26, 0, SRCAND);
	BitBlt(mdc, x, y, 26, 26, bufdc, 0, 0, SRCPAINT);
	BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);

	x += 2;                                //计算X 轴方向贴图坐标
	vy = 0;
	gy = 10;
	vy = vy + gy;                         //计算Y 轴方向速度分量
	y += vy - 1 / 2 * gy; 	              //计算Y 轴方向贴图坐标


	//如果小球超出边界
	if (y > rect.bottom - 26)
	{       //小球接触到窗口下边框的判断
		y = rect.bottom - 26;
		vy = -vy - gy;                     //弥补位置变化动能的损失        
										   //竖直方向加速度为-1的曲线运动
	}
	if (x>rect.right - 26)
		x = 0;

	tPre = GetTickCount();

}

 

(3)碰撞现象

 

#include "stdafx.h"      
#include "MyGameFrame.h"      
#include <stdio.h>
#include <math.h>

//全局变量
HWND              hWnd;
HINSTANCE         hInst;
HDC               hdc, mdc;
HBITMAP           bmpball;
int               i;
double            x, y;
double            xlast, ylast;
double            vx=9;
double            vy=5;
RECT              rect;


// 此代码模块中包含的函数的前向声明:     
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                collide(int startX, int startY, int endX, int endY);


int APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR    lpCmdLine,
	int       nCmdShow)
{
	// 初始化全局字符串    
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:     
	if (!InitWindow(hInstance, nCmdShow))//初始化窗口    
	{
		return FALSE;//如果不成功则返回FALSE,并退出程序    
	}

	MSG msg; //创建消息类对象    

	// TODO: 在此放置运行代码。

	//获取窗口
	//GetClientRect用于取得指定窗口的客户区域大小  
	//每个窗口区域可分为两部分,用于显示内容的区域叫Client区(客户区),NonClient(非客户区)用于显示命令按钮及窗口标题等。  
	//非客户区的绘图是由WM_NCPAINT发出的。
	GetClientRect(hWnd, &rect);

	//建立内存DC和窗口DC
	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);


	//加载图片
	bmpball = (HBITMAP)LoadImage(NULL, "ball.bmp", IMAGE_BITMAP, 52, 26, LR_LOADFROMFILE);

	//创建定时器  
	SetTimer(hWnd, 1, 60, NULL);


	// 主消息循环:     
	PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值    

	while (msg.message != WM_QUIT) {
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}



//    
//  函数: MyRegisterClass()    
//    
//  注册Windows类,一款游戏有且仅有一个主窗口,与游戏程序唯一对应。创建游戏窗口前要填写窗口类结构体WNDCLASSEX    
//    
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex =
	{
		wcex.cbSize = sizeof(WNDCLASSEX),


		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,

		WndProc,0,0,

		hInstance,

		LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),

		LoadCursor(NULL, IDC_ARROW),


		(HBRUSH)(COLOR_WINDOW + 1),NULL,

		_T("GameFrame"),

		LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))
	};
	return RegisterClassEx(&wcex);
}

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

	hWnd = CreateWindow
	(
		_T("GameFrame"),
		_T("游戏框架"),
		WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化    
		100, 100, 640, 480, nullptr, nullptr, hInstance, nullptr
	);

	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 msg, WPARAM wparam, LPARAM lparam)
{
	switch (msg)                        //判断消息    
	{
	case WM_CREATE:
		//执行初始化代码                  
		return(0);
		break;
	case WM_TIMER: {
		SelectObject(mdc, bmpball);
		BitBlt(hdc, int(xlast), int(ylast), 26, 26, mdc, 26, 0, WHITENESS);
		BitBlt(hdc, int(xlast), int(ylast), 26, 26, mdc, 0, 0, WHITENESS);
		BitBlt(hdc, int(x), int(y), 26, 26, mdc, 26, 0, SRCAND);
		BitBlt(hdc, int(x), int(y), 26, 26, mdc, 0, 0, SRCPAINT);
		
		xlast = x;                                            //上次贴图X坐标
		ylast = y;                                            //上次贴图Y坐标

		x += vx;
		y += vy;
		if (y < 0) {                                           //是否碰到上边缘
			vy = -vy;
			y = 0;
		}
		if (x < 0) {                                           //是否碰到左边缘
			vx = -vx;
			x = 0;
		}
		collide(rect.right, 20, 400, rect.bottom);     //右边斜面
		
		collide(400, rect.bottom, 0, 200);             
		MoveToEx(hdc, rect.right, 20, NULL);           //画线
		LineTo(hdc, 400, rect.bottom);
		LineTo(hdc, 0, 200);
	}
	break;
	case WM_DESTROY:
		DeleteDC(mdc);
		ReleaseDC(hWnd, hdc);
		DeleteObject(bmpball);
		KillTimer(hWnd, 1);
		//关闭程序,发送WM_QUIT消息    
		PostQuitMessage(0);
		return(0);
		break;
	default:
		break;
	}
	return (DefWindowProc(hwnd, msg, wparam, lparam));
}
void collide(int startX, int startY, int endX, int endY)
{
	float va, vb;                                       //碰撞后速度, int计算误差导致小球出去
	float lx, ly, fx, fy, m, n;
	int ox, oy;                                        //小球球心位置
	lx = (float)endX - startX; 			               //X轴向量
	ly = (float)endY - startY; 			               //Y轴向量
	fx = (float)startY - endY; 			               //X轴法向量
	fy = (float)endX - startX; 			               //Y轴法向量

	圆心X 坐标
	//ox = x + 13;

	//球心X坐标变为小球边缘X坐标
	ox = x + 13 - 13 * fx / sqrt(pow(fx, 2) + pow(fy, 2));

	圆心Y 坐标
	//oy = y + 13;

	//球心Y坐标变为小球边缘Y坐标
	oy = y + 13 - 13 * fy / sqrt(pow(fx, 2) + pow(fy, 2));

	m = (vx*(startY - oy) + vy * (ox - startX)) / (lx*vy - ly * vx);
	n = (lx*(oy - startY) + ly * (startX - ox)) / (vx*ly - vy * lx);
	if (m >= 0 && m <= 1 && n >= 0 && n <= 1)      //碰撞反应
	{
		x += vx * n;                                         //修正小球位置
		y += vy * n;
		va = -2 * (fx*vx + fy * vy)*fx / (pow(fx, 2) + pow(fy, 2)) + vx;
		vb = -2 * (fx*vx + fy * vy)*fy / (pow(fx, 2) + pow(fy, 2)) + vy;
		vx = va; //修正小球速度
		vy = vb;
	}
}

(4)粒子瀑布

#include "stdafx.h"      
#include "MyGameFrame.h"      
#include <stdio.h>
#include <math.h>
#include <time.h>
//粒子数组大小 
#define dm 1000

//粒子结构体
typedef struct {
	float cx, cy;
	float vx, vy;
	float vyacc;
	float life;
	float decay;
} PARTICLE;

//全局变量
HWND              hWnd;
HINSTANCE         hInst;
HDC               hdc, mdc;
HBITMAP           bmp;
PARTICLE          Drop[dm];
DWORD             tPre, tNow;

// 此代码模块中包含的函数的前向声明:     
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitWindow(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                InitializeDrop(int x, int y);
void                MoveDrop(void);
void                MyPaint(HDC hdc);



int APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR    lpCmdLine,
	int       nCmdShow)
{
	// 初始化全局字符串    
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:     
	if (!InitWindow(hInstance, nCmdShow))//初始化窗口    
	{
		return FALSE;//如果不成功则返回FALSE,并退出程序    
	}

	MSG msg; //创建消息类对象    

	// TODO: 在此放置运行代码。

	srand((unsigned)time(NULL));

	//建立内存DC和窗口DC
	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);

	//建立适用位图
	bmp = CreateCompatibleBitmap(hdc, 640, 480);
	SelectObject(mdc, bmp);

	InitializeDrop(30, 30);
	MyPaint(hdc);

	// 主消息循环: 
	//初始化msg
	PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);  

	while (msg.message != WM_QUIT) {
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			tNow = GetTickCount();
			if (tNow - tPre >= 10)
				MyPaint(hdc);
		}
	}
	return (int)msg.wParam;
}



//    
//  函数: MyRegisterClass()    
//    
//  注册Windows类,一款游戏有且仅有一个主窗口,与游戏程序唯一对应。创建游戏窗口前要填写窗口类结构体WNDCLASSEX    
//    
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex =
	{
		wcex.cbSize = sizeof(WNDCLASSEX),


		CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,

		WndProc,0,0,

		hInstance,

		LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),

		LoadCursor(NULL, IDC_ARROW),


		(HBRUSH)(COLOR_WINDOW + 1),NULL,

		_T("GameFrame"),

		LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))
	};
	return RegisterClassEx(&wcex);
}

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

	hWnd = CreateWindow
	(
		_T("GameFrame"),
		_T("游戏框架"),
		WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化    
		100, 100, 640, 480, nullptr, nullptr, hInstance, nullptr
	);

	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 msg, WPARAM wparam, LPARAM lparam)
{
	switch (msg)                        //判断消息    
	{
	case WM_CREATE:
		//执行初始化代码                  
		return(0);
		break;
	case WM_DESTROY:
		//关闭程序,发送WM_QUIT消息    
		PostQuitMessage(0);
		return(0);
		break;
	default:
		break;
	}
	return (DefWindowProc(hwnd, msg, wparam, lparam));
}
void InitializeDrop(int x, int y) {
	int i;
	for (i = 0; i<dm; i++) {
		if (Drop[i].life <= 0) {
			Drop[i].cx = (float)x;
			Drop[i].cy = (float)y;
			Drop[i].vx = (float)(0.0007*(rand() % 500 + 500));
			Drop[i].vy = (float)(0.1*(rand() % 10));
			Drop[i].vyacc = 0.05f;
			Drop[i].life = 1.0f;
			Drop[i].decay = (float)(0.0005*(rand() % 250));
		}
	}
}
void MoveDrop(void) {
	for (int i = 0; i<dm; i++) {
		if (Drop[i].life>0) {
			Drop[i].cx += Drop[i].vx;
			Drop[i].cy += Drop[i].vy;
			Drop[i].vy += Drop[i].vyacc;
			Drop[i].life -= Drop[i].decay;
			if (Drop[i].cx >= 500)
				Drop[i].vx *= (-1);
			if ((Drop[i].cy <= 10) || (Drop[i].cy >= 350)) {
				Drop[i].vy *= (-1);
				Drop[i].decay += 0.05f;
				Drop[i].vy += 0.1f;
			}
		}
	}
}
void MyPaint(HDC hdc) {
	HDC dc = CreateCompatibleDC(hdc);
	BitBlt(mdc, 0, 0, 640, 480, dc, 0, 0, BLACKNESS);  //清理mdc
	MoveDrop();
	InitializeDrop(30, 30);
	for (int i = 0; i<dm; i++)	  	  	                               	   	   
          SetPixel(mdc, (int)Drop[i].cx, (int)Drop[i].cy,RGB(128, 255, 255));
	BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);
	tPre = GetTickCount();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值