Visual C++游戏编程基础之追逐移动

2024-01-28 18:58

本文主要是介绍Visual C++游戏编程基础之追逐移动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本思路

1.追逐移动的实现与飞机追随鼠标光标原理类似;

2.现在小鸟作为追逐者,设定其贴图坐标为(nowX-25,nowY-16),其中(nowX,nowY)是飞机的贴图坐标;

3.通过判断小鸟贴图坐标的X坐标与nowX-25谁大谁小,来决定小鸟在飞机左边还是右边,从而决定贴哪张图;

二、效果

三、代码实现


#include "stdafx.h"
#include <stdio.h>HINSTANCE hInst;
HBITMAP bg,ship,bird;
HDC		hdc,mdc,bufdc;
HWND	hWnd;
DWORD	tPre,tNow;
int		x,y,nowX,nowY;
int		w=0;
POINT	p[3];ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void				MyPaint(HDC hdc);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{MSG msg;MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}while( msg.message!=WM_QUIT ){if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ){TranslateMessage( &msg );DispatchMessage( &msg );}else{tNow = GetTickCount();if(tNow-tPre >= 40)MyPaint(hdc);}}return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style			= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;wcex.lpfnWndProc	= (WNDPROC)WndProc;wcex.cbClsExtra		= 0;wcex.cbWndExtra		= 0;wcex.hInstance		= hInstance;wcex.hIcon			= NULL;wcex.hCursor		= NULL;wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName	= NULL;wcex.lpszClassName	= "canvas";wcex.hIconSm		= NULL;return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HBITMAP bmp;POINT pt,lt,rb;RECT	rect;hInst = hInstance;hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}MoveWindow(hWnd,100,100,640,480,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc);bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,648,480,LR_LOADFROMFILE);ship = (HBITMAP)LoadImage(NULL,"ship.bmp",IMAGE_BITMAP,100,148,LR_LOADFROMFILE);bird = (HBITMAP)LoadImage(NULL,"bird.bmp",IMAGE_BITMAP,122,122,LR_LOADFROMFILE);x = 300;y = 300;nowX = 300;nowY = 300;pt.x = 300;pt.y = 300;ClientToScreen(hWnd,&pt);//窗口坐标转换成屏幕坐标SetCursorPos(pt.x,pt.y);//设置鼠标光标位置ShowCursor(false);//隐藏鼠标光标		GetClientRect(hWnd,&rect);//获取窗口区域内矩形lt.x = rect.left;lt.y = rect.top;rb.x = rect.right;rb.y = rect.bottom;//获取左上角和右下角的坐标ClientToScreen(hWnd,&lt);ClientToScreen(hWnd,&rb);rect.left = lt.x;rect.top = lt.y;rect.right = rb.x;rect.bottom = rb.y;ClipCursor(&rect);//限制鼠标光标的移动区域,该函数参数是相对屏幕坐标而言的//设置3只小鸟的贴图坐标p[0].x = 30;p[0].y = 100;p[1].x = 250;p[1].y = 250;p[2].x = 500;p[2].y = 400;MyPaint(hdc);return TRUE;
}void MyPaint(HDC hdc)
{int i;SelectObject(bufdc,bg);BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);if(nowX < x){nowX += 10;if(nowX > x)nowX = x;}else{nowX -=10;if(nowX < x)nowX = x;}if(nowY < y){nowY += 10;if(nowY > y)nowY = y;}else{nowY -= 10;if(nowY < y)nowY = y;}SelectObject(bufdc,ship);BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);SelectObject(bufdc,bird);for(i=0;i<3;i++){if(rand()%3 != 1)		{if(p[i].y > nowY-16)     p[i].y -= 5;elsep[i].y += 5;if(p[i].x > nowX-25)//鸟的贴图坐标为(nowX+25,nowY+16)p[i].x -= 5;elsep[i].x += 5;}if(p[i].x > nowX-25)    //飞机在小鸟的左边,贴方向向左的小鸟图片{BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);}else{BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);//贴方向向右的小鸟图片BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,0,SRCPAINT);}}BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);tPre = GetTickCount();w += 10;if(w==640)w = 0;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_KEYDOWN:				if(wParam==VK_ESCAPE)		PostQuitMessage(0);break;case WM_MOUSEMOVE:x = LOWORD(lParam);			if(x > 530)x = 530;else if(x < 0)x = 0;y = HIWORD(lParam);			if(y > 380)y = 380;else if(y < 0)y = 0;break;case WM_DESTROY:				ClipCursor(NULL);			DeleteDC(mdc);DeleteDC(bufdc);DeleteObject(bg);DeleteObject(ship);DeleteObject(bird);ReleaseDC(hWnd,hdc);PostQuitMessage(0);break;default:						return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

 

这篇关于Visual C++游戏编程基础之追逐移动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654501

相关文章

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键