【游戏程序设计】物体框架检测碰撞_辣条不爱辣的博客-程序员秘密

技术标签: 游戏程序设计  游戏开发  

以框架来检测物体间的碰撞时,在完成游戏角色制作后,会给这个角色附加一个包围角色的框架,该框架的作用就是实现该角色与其他物体的碰撞检测。

对于平面游戏中的角色,最简单的游戏框架就是包围该角色的最小矩形,只要检测一个矩形四个顶点是否在另一个矩形内即可。

公式:

RectVlx <= Vx <= RectVRx 且 RectVBy <= Vy <= RectVTy

其中RectVlx,RectVBy,RectVRx,RectVTy为矩形的对角点,(Vx,Vy)以框架来检测碰撞。

运行结果:

源代码:

#include <windows.h>
#pragma comment(lib, "winmm.lib")									//调用PlaySound函数所需库文件t
#pragma comment(lib, "Msimg32.lib")

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_TITLE L"【游戏程序设计】物体框架检测碰撞"

HINSTANCE hInst;
HDC hdc, mdc, bufdc;
HBITMAP hCar1, hCar2, hBomb, hBackGround;							//位图保存汽车,背景等
int vx1, vx2, x1, y1, x2, y2;										//汽车1,2的速度,汽车1,2的贴图位置
HWND hwnd;

int  MyWindowClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyDraw(HDC);

/*****************************************************************************************************************
在不同的应用程序中,在此处添加相关的全局变量
******************************************************************************************************************/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstace,
									LPSTR lpCmdLine, int nCmdShow) 
{
	MyWindowClass(hInstance);
	PlaySound(L"sound.wav", NULL, SND_FILENAME| SND_ASYNC| SND_LOOP);	//循环播放背景音乐
	if(!InitInstance(hInstance, nCmdShow))
		return FALSE;
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

int MyWindowClass(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 = NULL;
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = L"gamebase";
	wcex.hIconSm = NULL;

	return RegisterClassEx(&wcex); 
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	hInst = hInstance;
	hwnd = CreateWindow(L"gamebase", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
	if(!hwnd)
		return FALSE;
	MoveWindow(hwnd, 10, 10, WINDOW_WIDTH, WINDOW_HEIGHT, true);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	hdc = GetDC(hwnd);
	mdc = CreateCompatibleDC(hdc);
	bufdc = CreateCompatibleDC(hdc);
	HBITMAP bmp = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);		
	SelectObject(mdc, bmp);

	hCar1 = (HBITMAP)LoadImage(NULL, L"car1.bmp", IMAGE_BITMAP, 196, 66, LR_LOADFROMFILE);
	hCar2 = (HBITMAP)LoadImage(NULL, L"car2.bmp", IMAGE_BITMAP, 140, 80, LR_LOADFROMFILE);
	hBomb = (HBITMAP)LoadImage(NULL, L"bomb.bmp", IMAGE_BITMAP, 187, 100, LR_LOADFROMFILE);
	hBackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);

	vx1 = 5;
	vx2 = -5;
	x1 = 0;
	y1 = 165;
	x2 = 520;
	y2 = 150;

	SetTimer(hwnd, 1, 100, NULL);												//建立定时器

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;

	switch(message)
	{
	case WM_TIMER:																//时间消息
		MyDraw(hdc);
		break;
/**************************************************************************************************************
在退出程序前,往往在此处删除创建的相关资源
***************************************************************************************************************/
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}
/***************************************************************************************************************
在函数MyDraw()中进行相关绘制工作
****************************************************************************************************************/
void MyDraw(HDC hdc)
{
	//贴上背景图 最好不要直接贴在hdc上,因为容易造成闪烁的问题,应该现在内存DC中贴完,再映射到hdc上。
	SelectObject(bufdc, hBackGround);
	BitBlt(mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, bufdc, 0, 0, SRCCOPY);
	SelectObject(bufdc, hCar1);
	BitBlt(mdc, x1, y1, 196, 66, bufdc, 0, 0, SRCCOPY);
	SelectObject(bufdc, hCar2);
	BitBlt(mdc, x2, y2, 140, 80, bufdc, 0, 0, SRCCOPY);
	
	if(x1 + 196 > x2)															//用以检测是否发生了碰撞
	{
		SelectObject(bufdc, hBomb);
		TransparentBlt(mdc, x2-100, y2, 187, 100, bufdc, 0, 0, 187, 100, RGB(0,0,0));
		KillTimer(hwnd, 1);
	}

	BitBlt(hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, mdc, 0, 0, SRCCOPY);
	x1 += vx1;																	//设置下一次定时器消息发生时汽车1的位置
	x2 += vx2;																	//设置下一次定时器消息发生时汽车2的位置
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_38304645/article/details/82834714

智能推荐

SpringCloud升级之路2020.0.x版-33. 实现重试、断路器以及线程隔离源码_干货满满张哈希的博客-程序员秘密

本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent在前面两节,我们梳理了实现 Feign 断路器以及线程隔离的思路,并说明了如何优化目前的负载均衡算法。但是如何更新负载均衡的数据缓存,以及实现重试、断路器以及线程隔离的源码还没提,这一节我们会详细分析。首先,从 spring.factories 引入,增加我们自定义 OpenFeign 配置的加载:spring.factories# AutoConfigurationorg.spri..

FMC子卡:4 通道 16bit 250M AD 采集_fmc-asp-134488_F_white的博客-程序员秘密

FMC136 是一款 4 通道 250MHz 采样率 16 位 AD 采集 FMC子卡,符合 VITA57 规范,可以作为一个理想的 IO 模块耦合至 FPGA前端,4 通道 AD 通过高带宽的 FMC 连接器(HPC)连接至 FPGA 从而大大降低了系统信号延迟。该板卡支持板上可编程采样时钟和外部参考时钟以及采样时钟,多片板卡还可以通过触发(输入/输出)信号进行同步采集,该板卡 4路模拟信号通过 50Ω特征阻抗的 SSMC 射频连接器输入,通过巴伦变压器耦合至 ADC 前端。主要用在通信多载波、雷达与智

高通平台添加新的分区_高通添加自己的分区_王大锤扛刀的博客-程序员秘密

diff --git a/device/qcom/msm8909/BoardConfig.mk b/device/qcom/msm8909/BoardConfig.mkindex fe11e06..1ca7871 100755--- a/device/qcom/msm8909/BoardConfig.mk+++ b/device/qcom/msm8909/[email protected]@ -114,6 +114,12 @@ BOARD_PERSISTIMAGE_PARTITION_SIZE := 3

Spark 性能相关参数配置详解-压缩与序列化篇_spark.rdd.compress_彩色蚂蚁的博客-程序员秘密

随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化。- 压缩与序列化篇

Controller接口控制器详解(5)_hebeind100的博客-程序员秘密

4.15、MultiActionController之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(CRUD Create-Read-Update-Delete),那该怎么办呢? 4.15.1 解决方案1、每一个功能对应一个控制器,如果是CR...

宇宙时空 符号世界 对应引理——哥德尔读后之25_weixin_41670255的博客-程序员秘密

宇宙时空 符号世界 对应引理——哥德尔读后之25信息是这个世界的奇异存在,有一些你会不屑一顾,有一些你会无动于衷。但有些信息却会撞击你的灵魂,一听到就为之一震。你不会在乎它的虚实,也不会在乎它的信度,更不会在乎他背后的什么伦理、什么意义。你会感到一种穿透力,一种在感召你的某种神性一般的东西。昨天从微信中获得一个视频,一个美国女孩准备独自登录火星,做一次有可能一去不返的单向宇宙航行。这个视频似乎就是这样一类信息,还真可能就是不可信的信息。但就是能够撼动人,它让你觉得这个世界总有人在为未知所憧憬,即使充满魔

随便推点

Lua学习笔记——Lua作为库嵌入到C中_lua嵌入到c_shanno的博客-程序员秘密

/*C++程序接收用户输入的字符串,把该字符串作为Lua的一个chunk送到stack中编译执行。*/#include #include #include int main(int argc, char* argv[]){ char buff[256]; int error = 0; lua_State* L=lua_open(); if(0 == L){

Centos 6.9端口开放以及端口转发实例_centos6.9开放22端口_冷月宫主的博客-程序员秘密

*filter:INPUT ACCEPT [25350:2120857]:FORWARD ACCEPT [1:20000]:OUTPUT ACCEPT [26183:2224589]-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A I...

idea无法调试的解决方案。之一。_风行水上cs的博客-程序员秘密

我的idea调试时报错。网上查不到解决方案。唯一查到的是什么防火墙吧idea屏蔽了。但我的没屏蔽。报错如下。    ERROR: transport library not found: dt_socketERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509)JDWP exit error AG

spring boot起步-搭建eureka环境_zhang-ml的博客-程序员秘密

在搭建过程中遇到的问题:1.遇到下面的错误:默认情况下,Eureka服务注册中心也会尝试把自己当做客户端来注册自己,就会出现下面的错误,因此需要禁止这种行为eureka: client: register-with-eureka: false fetch-registry: false如果需要注册eureka自己的话,可以配两个端口,启动两个eureka

SQL Server 练习题(初学)_Han1enG的博客-程序员秘密

@TOC一级目录二级目录三级目录use 练习goinsert into 图书(条形码,书名,作者,出版社,出版日期,售价) values ('TP303.5','大学计算机基础','李凯','科学出版社',2018-10-7,50)insert into 图书(条形码,书名,作者,出版社,出版日期,售价) values ('TP304.1','数据库技术及应用','郭栋阳','高教出版社',2017-6-16,42.6)insert into 图书(条形码,书名,作者,出版社,出版日期,售价

集成框架 -- 阿里网关API_徐寿春的博客-程序员秘密

直接用HTTPS 安全校验是可以跳过的,所以相比较HTTP HTTPS 可以任意切换。外部接口,避免复杂配置,增加证书校验,可以选择API 网关。

推荐文章

热门文章

相关标签