`

C/C++游戏之旅(三)————键盘控制图形移动之游戏主框架

阅读更多
本文中我们将尝试着控制窗口中的小圆跟随者上下左右键的操作来移动,会涉及键盘事件响应,游戏帧数控制等一些类问题,废话少说,先贴上源码:
#include "main2.h"
#include "MENUs.h"
#define WIN32_LEAN_AND_MEAN
#include <stdlib.h>
#include <windows.h>       
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#include <mmsystem.h>
#define WINDOW_CLASS_NAME "MY_CLASS"
#define WINDOW_WIDTH  GetSystemMetrics(SM_CXFULLSCREEN)
#define WINDOW_HEIGHT GetSystemMetrics(SM_CYFULLSCREEN)

// 图形的移动距离
int xv = 50;
int yv = 50;
// 图形的开始坐标
int ball_x = WINDOW_WIDTH/2;
int ball_y = WINDOW_HEIGHT/2;
int ball_x_old=WINDOW_WIDTH/2;
int ball_y_old=WINDOW_HEIGHT/2;

HWND hwnd=NULL;
HPEN   black_pen=NULL;
HBRUSH black_brush=NULL;
HPEN   white_pen=NULL;
HBRUSH green_brush=NULL;
LRESULT CALLBACK WindowProc(HWND hwnd, 
						    UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
PAINTSTRUCT		ps;//图形绘制结构体	
HDC				hdc=NULL;//句柄	
switch(msg)
	{	
	case WM_CREATE: //窗口创建时
        {
		return(0);
		} break;

	case WM_PAINT: //窗口重绘时
		{
		hdc = BeginPaint(hwnd,&ps);	//开始绘制
        EndPaint(hwnd,&ps);//结束绘制
		return(0);
   		} break;

	case WM_DESTROY://窗口销毁时
		{
		PostQuitMessage(0);
		return(0);
		} break;
	case WM_COMMAND:
		{
			switch(LOWORD(wparam))
			{//老实说:我也不知道这个函数是什么意思,从何而来,起什么作用
                case MENU_FILE_ID_EXIT:
                     {
                     // 退出
                     PostQuitMessage(0);
                     } break;
                case MENU_FILE_ID_OPEN:                 
                     {
                     } break;

                // handle each of sounds
                case MENU_FILE_ID_CLOSE:
                     {
                     } break;

                case MENU_FILE_ID_SAVE:
                     {
                     } break;
			}
		}
	case WM_KEYDOWN:
	{
		switch(wparam)
		{
                case VK_RIGHT:
                     {
						ball_x_old=ball_x;
						ball_y_old=ball_y;
						 //移动图形
						 ball_x+=xv;printf("ball_x_old:%d     ball_x:%d\n",ball_x_old,ball_x);
						 
                     } break;
                case VK_LEFT:                 
                     {
						 ball_x_old=ball_x;
						 ball_y_old=ball_y;
						  //移动图形
						 ball_x-=xv;printf("ball_x_old:%d     ball_x:%d\n",ball_x_old,ball_x);
						 
                     } break;
                case VK_UP:
                     {
						 ball_x_old=ball_x;
						 ball_y_old=ball_y;
						  //移动图形
						 ball_y-=yv;printf("ball_y_old:%d     ball_y:%d\n",ball_y_old,ball_y);
                     } break;

                case VK_DOWN:
                     {
						ball_x_old=ball_x;
						ball_y_old=ball_y;
						   //移动图形
						ball_y+=yv;printf("ball_y_old:%d     ball_y:%d\n",ball_y_old,ball_y);
                     } break;
				case VK_ESCAPE:
					{
						PostQuitMessage(0);
						return(0);	   
					}break;
		}
	}

	default:break;

    }
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));

}
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
			       HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
			       LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
			       int ncmdshow//指明窗口如何显示
				   )
{
WNDCLASSEX winclass;//声明窗体信息结构体
MSG		   msg;		 
HDC		   hdc;

winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_DBLCLKS | CS_OWNDC;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=WindowProc;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空。
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinstance;//系统传给winmain函数的句柄
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄。
winclass.lpszClassName=WINDOW_CLASS_NAME;//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.lpszMenuName=NULL;//菜单资源,以后再作解释
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标

//注册结构体
if(!RegisterClassEx(&winclass)){
	return(0);
}
int x=GetSystemMetrics(SM_CXFULLSCREEN);//获取全屏 x的宽度
int y=GetSystemMetrics(SM_CYFULLSCREEN);//获取全屏 y的高度
//创建窗口
hwnd=CreateWindowEx(
	NULL,
	WINDOW_CLASS_NAME,
	"哥的第一个窗口",
	WS_POPUP|WS_VISIBLE,
	0,
	0,
	x,
	y,
	NULL,
	NULL,
	hinstance,
	NULL
	);
if(NULL==hwnd){
	return(0);
}
//得到图形设备描述表
hdc = GetDC(hwnd);
//创建花笔和刷子
white_pen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
black_pen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
green_brush = CreateSolidBrush(RGB(0,255,0));
black_brush = CreateSolidBrush(RGB(0,0,0));

// 循环发送消息
while(TRUE)
	{          DWORD startTime=GetTickCount();//记录系统启动之后运行到现在的时间
				// 获取消息
				if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
				   { 
				   // 是否退出
				   if (msg.message == WM_QUIT)
					   break;
				   //转换消息
				   TranslateMessage(&msg);
				   // 发送消息
				   DispatchMessage(&msg);
				   }
				 // 图形设备描述表选择画笔和刷子
				SelectObject(hdc, black_pen);
				SelectObject(hdc, black_brush);
				//画圆
				Ellipse(hdc, ball_x_old, ball_y_old, ball_x_old + 50, ball_y_old + 50);
				// 边界检测
				if (ball_x < 0 ){
					ball_x=0;
				}
				if(ball_x > WINDOW_WIDTH - 50)
				{ 
						ball_x=WINDOW_WIDTH - 50;;
				} 
				// 边界检测
				if (ball_y < 0){
					ball_y=0;
				}
				if(ball_y > WINDOW_HEIGHT - 50)
				{ 
					ball_y=WINDOW_HEIGHT - 50;
				}
				 // 图形设备描述表选择画笔和刷子
				SelectObject(hdc, white_pen);
				SelectObject(hdc, green_brush);
				// 画圆
				Ellipse(hdc, ball_x, ball_y, ball_x +50, ball_y + 50);
				//设置游戏帧数为1000/33,即每秒30帧
				while((GetTickCount()-startTime)<33);
	}

//释放所有笔和刷子
DeleteObject(white_pen);
DeleteObject(black_pen);
DeleteObject(green_brush);
DeleteObject(black_brush);

//释放图形设备描述表
ReleaseDC(hwnd,hdc);
return(msg.wParam);
}

当你运行商上面的代码会看到一个小圆,用上下左右键去控制他,看看效果如何?
同时这也是我们后面编写程序的主要框架,也就是说,后面的代码都会在这个基础之上来修改,下一文中我们将会开始研究DirectX.
分享到:
评论

相关推荐

    C_C++语言硬件程序设计——基于TMS320C5000系列DSP

    《C/C++语言硬件程序设计——基于TMS320C5000系列DSP》是一本深入探讨如何使用C和C++编程语言进行数字信号处理(DSP)的专著,特别关注德州仪器(TI)的TMS320C5000系列 DSP 芯片。该书涵盖了从基础概念到高级应用的...

    Qt和C/C++实现的可视化景点旅游信息系统——包含详细注释与txt说明文件

    1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...

    C/C++程序员实用大全-C/C++最佳编程指南

    《C/C++程序员实用大全——C/C++最佳编程指南》是一本专为C/C++开发者设计的详尽参考资料,旨在帮助读者深入理解这两种强大的编程语言,并掌握高效的编程实践。本书涵盖了从基础知识到高级特性的全面内容,对于初学...

    c/c++中文帮助文档(API)

    C/C++是两种广泛使用的编程语言,特别是在系统级编程、游戏开发和高性能计算等领域。C++是C语言的扩展,引入了面向对象编程的概念。在编程过程中,理解并有效地使用库函数是至关重要的,因为它们提供了标准功能,...

    经典才c/c++游戏源代码

    在IT领域,编程语言是构建各种软件和游戏的基础,C和C++作为两种非常重要的编程语言,具有高效、灵活和底层控制的特点。本资源“经典才C/C++游戏源代码”是一个集合,包含了使用C和C++语言编写的经典游戏的源代码。...

    虚拟机的设计与实现——C/C++.pdf

    虚拟机的设计与实现——C/C++.pdf

    MinGW64与32——C/C++快速配置编译环境

    所以通常我们会选择MinGW作为编译环境,这是一个开源免费的C/C++编译器配合一些第三方支持代码提示的编辑器(如VSCode)进行开发学习,然而,mingw-w64.org只能下载到32位安装器,mingw.org部分人反映域名被劫持,...

    c语言/c++信息管理系统 考勤管理系统

    《C语言/C++信息管理系统——考勤管理系统》 在信息技术高度发达的今天,信息管理系统已经广泛应用于各行各业,其中考勤管理系统作为企业管理中的重要一环,能够有效地帮助企业进行员工出勤情况的跟踪与管理。本...

    c/c++语言程序设计课件

    【标签】"C/C++" 标签明确了本课件的主题,C/C++是一种通用的、高级的编程语言,广泛应用于系统软件、嵌入式系统、游戏开发、高性能计算等多个领域。学习C/C++能为理解计算机工作原理提供坚实基础,并且为学习其他...

    密码学:C/C++语言实现(第2版)

    第2版包括了许多全新内容,同时对原有内容进行了修改和完善,使之涵盖密码学领域的近期新技术进展。 ...作为一本算法实现的书籍,本书严格遵循软件开发原则,详细描述了设计思想及错误处理方法,并对所有函数进行了广泛...

    计算机图形学——基于MFC三维图形开发 孔令德版

    在本资源中,"计算机图形学——基于MFC三维图形开发 孔令德版",作者孔令德提供了一套针对MFC(Microsoft Foundation Classes)框架的三维图形编程教程,帮助学习者深入理解计算机图形学在实际应用中的实现方式。...

    c/c++完整视频教程(二)——–Cocos2dX跨平台游戏开发

    ### C/C++与Cocos2dX跨平台游戏开发知识点详解 #### 一、C/C++编程语言概述 - **C语言**:一种结构化编程语言,由Dennis Ritchie在1972年设计,主要用于系统编程。C语言的特点是简洁、高效,能够直接控制硬件资源...

    turbo c/c++ 3.0

    “Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计...

    C/C++/VC项目含视频推箱子小游戏

    该项目是一个基于C/C++语言开发的小游戏——推箱子。推箱子是一种经典的益智类游戏,玩家需要在有限的步数内将所有的箱子推到指定的位置上才能过关。这类游戏不仅考验玩家的空间想象能力和逻辑思维能力,还能够锻炼...

    一个好玩的c++游戏——生死枪战!

    生死枪战游戏目前以3个模式运行(持续更新),玩家可以通过自己的喜好来选择,如:新手训练营,无限闯关,打怪,以及能调用时间而改变战力的暗月阁长老。更多特殊技能、特殊武器等你发掘! 改进或交流该游戏的建议...

    虚拟机的设计和实现(C/C++)part2

    虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++)

    C/C++指针经典资料大全

    在IT领域,C和C++语言中的指针是至关重要的概念,它们是程序设计的基础,也是许多高级技术的基石。本资源包“C/C++指针经典资料大全”收集了多部经典教材,旨在帮助学习者深入理解并掌握指针的使用。 1. **指针基础...

    《Visual C++案例开发》配套代码

    ————|————|————Source(目录,存放API绘图小例程源代码)&lt;br/&gt;| | |&lt;br/&gt;|————|————|————EXE(目录,存放API绘图小例程可执行文件)&lt;br/&gt;| | |&lt;br/&gt;|————|————|————Setup(目录...

    C/c++俄罗斯源代码

    标题 "C/c++俄罗斯方块源代码" 涉及的是一个使用C或C++编写的经典游戏——俄罗斯方块的实现。这个源代码仅由88行组成,因此它是一个简洁而高效的示例,适合实习生学习高级编程技巧。下面我们将深入探讨这个项目中的...

    高质量程序设计指南——C++_C语言(第3版)

    高质量c、c++编程,带目录,介绍了良好的编程规范,c/c++命名规则,及面向对象程序设计方法

Global site tag (gtag.js) - Google Analytics