本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.csdn.net/poem_qianmo/article/details/16384009

作者:毛星云(浅墨)    邮箱: happylifemxy@163.com  


 

众所周知,GUI是游戏中不可缺少的元素,这篇文章中,我们首先了解了游戏GUI界面的知识与相关概念,然后一起设计了一个封装好GUI图形界面的C++类。这个类有着非常强的扩展性,使用也是极其方便,很适合二次开发。

先看一张实现的效果图吧:



其中的背景音乐,游戏图标和背景图片都出自育碧公司的招牌式大作《刺客信条》。

程序的窗口大小已经被浅墨调成了1366 x768,现阶段比较流行的笔记本分辨率尺寸(其实真的想吐槽这个奇葩万年不变的电脑屏幕分辨率,在如今的后PC时代。手机屏幕都开始对1920 x1080的分辨率不满足了。。。。)


嗯,开始正文吧。

 


 


一、UI和GUI的概述


首先我们看一下UI的比较正统的定义:用户界面(User Interface,简称UI,亦称使用者界面)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。

用户界面是介于用户与硬件之间,为彼此之间交互沟通而设计的相关软件,使得用户能够方便有效地去操作硬件以达成双向之交互,完成所希望的工作,用户界面定义广泛,包含了人机交互与图形用户界面,凡参与人类与机械的信息交流的领域都存在着用户界面。

 

而GUI的正统定义是:图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。

 

我们知道,在游戏中,能够和游戏玩家进行交互是至关重要的。这样的交流可以是文本形式的,视觉显示,声音信号等等。而对于视觉显示而言,绝大多数游戏毋庸置疑就是用图形用户界面(GUI)来和游戏玩家进行交互的。而在游戏过程中,依旧少不了GUI界面的出场,比如说状态显示界面(Head-up Display,HUD),HUD,这个界面提供一切和游戏有关的信息。用于提供玩家剩余任务时间,生命值,坐标位置,以及更多信息。

 


让我们欣赏一部分近期的3A游戏大作的UI界面美图吧:

 

《鬼泣5》:

 

 

 

《英雄无敌6》:

 

 

 

 欣赏完了,我们继续开讲吧。

 

 





 

二、关于状态显示界面(HUD)



这一节里让我们一起科普HUD的概念。

我们知道,通常情况下在游戏中屏幕上会有很多的小的界面模块配上文字,为玩家提供了一些有用的信息,比如玩家剩余任务时间,生命值,魔法值,坐标位置等等更多的信息。而因为在玩家和游戏交互的过程中,这些界面是透过摄像机视角显示出来的,它们被称为HUD(heads-up-display)。在视频游戏中,HUD就是一类可以实时向玩家显示有用信息和符号的GUI,并且它和诸如游戏菜单这样的其他界面不同.HUD中通常没有按钮、编辑框或者适合玩家交互的内容,因为玩家往往都是被游戏本身的画面和内容所吸引,而不是去关注HUD。所以呢,HUD通常并不去使用可以交互的元素,而倾向于使用文本和图像来表示某些信息。所以,游戏选项和偏好设置这样的内容不是HUD的菜,它们直接交由系统菜单来完成。

下面我们看一看更加规范化的HUD的介绍。

HUDheads-up-display,硬着过来翻译就是“抬头显视设备”- -。这是一个从军事领域起源的技术,可以把一些重要的战术信息显示在正常观察方向的视野范围内,而同时又不会影响对于环境的注意,也不用总是转移视线去专门观察仪表板上的那些指针和数据。游戏借鉴了这个概念,把游戏相关的信息以类似HUD的方式显示在游戏画面上,让玩家可以随时了解那些最重要最直接相关的内容。当然玩家要获得游戏信息可以有别的方式,比如菜单。菜单有着专门的界面,可以容纳更大的信息量,但却不能和游戏画面同时出现。调出菜单意味着中断游戏流程,HUD则在提供必要的信息的同时完全避免了这个问题。

虽然菜单提供了大量的信息,然而对于处在自由行动状态下的玩家而言,这些信息都不是立刻需要获取的。HUD只提供了最重要最基本的内容:当前场景的地图。切换到战斗状态下之后,HUD所提供的信息便会转变为那些只和战斗相关的部分。

记得最早的游戏pong在设计的时候就没有HUD的。对于这样一个简单的游戏而言,唯一对玩家有意义需要及时掌握的就是双方的比分,而最早版本的pong没有这个功能,玩家需要自己去记录比分。游戏设计者很快意识到了这个问题,HUD很快就被整合到了后来的游戏之中,并随着游戏的进化一起演变,完善。

 

如果被上面的这些书面语绕晕了没关系,说了这么多,一言以蔽之:菜单的目的是大而全,HUD的目的则是少而精。HUD主要注重的是实时向玩家显示有用信息和符号的GUI,和而系统菜单GUI可以给玩家提供更多更全的信息。

不同类型的游戏玩起来的重点不一样,HUD在提供的信息方面也有很大的差别。我们不妨按照游戏的类别,来看看各种游戏的HUD设计的模式和重点。


1.角色扮演类游戏

取决于游戏是否会在行动场景和战斗场景之间切换,角色扮演游戏的HUD设计会有所不同,关于行动的那一部分内容,比如地图和方向指示之类的信息可能会被单独分列出来。但总体上角色扮演游戏的HUD信息量基本是一致的:玩家的生命,魔法,行动力,状态(或者其它因游戏而异的内容)等等的数值,玩家可以一键接触到的物品魔法等等东西,如果物品和魔法的内容很复杂,那么一般都会把全面调节的功能交给菜单来完成。比如预设快捷键和菜单光标位置记忆功能就是这样的目的,把菜单中全面而细微的调节能力中,挑选出一些最重要的,放到HUD上来,共玩家选择使用。


2.格斗游戏

无论格斗游戏系统本身怎么进化,从2D变到3D,格斗游戏的HUD总是保持着自己一贯的特色。格斗游戏的HUD大多分成两个部分:第一,对战斗数据的统计,第二,对战斗中精彩场面的描述。前者就是那些显眼的血槽,还包括时间,局数计分。后者则是对于连击之类的精彩动作的积分等等信息。其中血槽这个东西是游戏HUD设计上一个非常典型的东西。


3.体育游戏

体育类游戏在设计HUD的问题上有着天然的两个参考坐标系:电视转播画面和球队的战术分析图。游戏的HUD结合了这两者,即体现出了电视转播画面的现场感,也做出了战术分析图那样的清晰感,让玩家尽可能的在有身临其境的感觉的同时也对比赛局面有着清晰的了解。实际上体育类游戏的HUD设计作的是如此的好,以至于最近以来,很多体育项目的电视转播画面开始学习这类游戏的HUD设计,往画面上添加一些即时的比赛信息和战术分析。


4.驾驶模拟类游戏

这类游戏所要模仿的对象就是HUD这个概念的来源的地方,所以驾驶模拟类游戏HUD设计的原则也就变得非常简单而直接:尽可能的去重现模拟对象的原始HUD就可以了。当然根据游戏模拟真实的程度不同,再现真实HUD设计的程度也有所区别。HUD的设计始终存在一个如何抽取最重要的信息提示玩家的问题,过于仿真的游戏HUD设计将大量的信息不加选择的堆在玩家面前。对于游戏本身模拟这个概念而言,是好事,但对于像通过这些游戏来体验现实生活中不可能接触到的东西这个目的而言,高度的仿真模拟往往会成为上手的障碍。游戏毕竟是游戏,游戏的HUD如何在仿真模拟和抽象表现上把握平衡,是这类游戏的一个突出问题。


5.动作射击类游戏

射击类游戏的HUD通常都包括了玩家的状态,玩家的武器状态,地图,以及目标指示这四个方面。第三人称的射击游戏或者团队策略类射击游戏在HUD设计上和传统的第一人称射击游戏区别也不是很大,重点同样在这些要素上。HUD的引入给所有的射击类游戏,无论游戏本身的背景设定是在什么样的时代,都带来了一定的科幻未来的要素。真实的战斗中,对于战场情况的把握从来都是很大的挑战,不断进步的单兵信息化装备正是力求解决这些问题。射击类游戏通过HUD的引入超前的解决了这个问题。就目前而言,感觉做的最好的射击类游戏HUD恰恰就是一些未来题材的射击游戏,等下在HUD进化中我们会看到例子。


6.策略类游戏

最为复杂的一类游戏HUD,事实上在这类游戏里面HUD和菜单往往难以截然区分。因为玩家几乎每时每刻都需要确实的掌握整个游戏空间里大量单位的行动。HUD是简化了的菜单,但在很多的策略类游戏上,简化只是一个美好的愿望,游戏本身的复杂程度和玩家的上帝视角导致了这类游戏必然随时都有大量的信息反馈和大量的命令等待输入。策略类游戏的HUD如此的复杂,以至于在控制器键位相对较少的游戏主机上,这类游戏的流行程度始终达不到PC上同类游戏的流行度。游戏本身机制导致的复杂HUD设计应该是这类游戏受众群体局限性产生的原因之一。

其它类型的游戏,比如平台游戏,益智游戏等等在HUD设计上感觉并没有什么特别的地方。它们的HUD只要能清晰的交代出游戏人物(如果有的话)的状态和游戏的进展程度(得分之类的信息)就可以了。

 

如果看到这里觉得累了,依旧是欣赏一部分近期的3A游戏大作的UI界面美图吧:


《孤岛危机3》:



《仙剑奇侠传五 前传》:

 

 

《刺客信条4黑旗》:


 

 

 




三、开始GUI系统的设计

 

在这篇文章里面,我们将一起去实现一个简单而健全的GUI系统。这个系统既有HUD的功能,也可以创建GUI菜单。依旧是和之前的其他系统一样,封装在一个类中,这次的类是D3DGUIClass。

 

下面又到了天马行空的设计时刻了——在实现GUI系统之前,让我们设计出心目中的GUI系统该有的功能。

 

1.大体说明

首先需要说明的是,我们这次设计的GUI系统主要用于演示之用,扩展性很强,需要的更多功能完全可以在这个GUI的系统上进行二次开发,来增强它的特性和功能。

GUI系统主要由按钮和静态文本控件对象组成,当然,还少不了背景图的显示。由于GUI系统是2D的,这意味着指定对象位置时,是用不到Z轴的。另外,我们决定使用正交投影的方式来渲染GUI,这样可以根据像素的位置来指定屏幕的位置。

让我们来回忆一下,(0,0)对应的是屏幕的左上角。在windows系统中,左上角就是(0,0)。有了这个信息,就可以轻松地确定玩家的鼠标指针是否悬停在GUI系统的控件之上,或者说正在点击这个控件。


2.关于布局规划和背景图

在设计和规划按钮和文本位置时,我们只要牢记窗口左上角的坐标是(0,0),就能随心所欲的创建各式各样的限制的系统范围内的心仪的GUI布局出来。对于背景图的话,其实没必要考虑它的位置,因为这个图像就是一个由两个三角形构成的全屏图像。只要系统知道当前程序的宽度和高度,就可以显示一个全屏纹理图。

 

3.关于按钮控件的实现

必不可少的特性就是可以点击的按钮控件,其实按钮控件的实现比点击图像更容易实现。由于按钮控件的位置是以像素来指定的,因此为了确定鼠标指针是否在按钮上或者按下了按钮,其实就是检查当前鼠标指针的位置是否落在按钮区域内。因为Windows操作系统用像素指定鼠标位置且屏幕的左上角为(0,0),所以检查鼠标的坐标是否处于按钮四个角的坐标范围内就可以了,即检查如下四个方面:

按钮的左侧坐标位置是否小于鼠标指针的X坐标,按钮右侧坐标位置是否大于鼠标指针的X坐标,按钮的上侧坐标是否小于鼠标指针的Y坐标,下侧坐标是否大于鼠标的Y坐标。如果四个都为真的话,那么就可以认定鼠标指针就在按钮控件之上了,然后便通过消息过程来检测是否按下的鼠标左键这个状态,如果按下了鼠标左键,那么就可以确定玩家不仅仅是把鼠标放在了按钮之上,而是同时点击了按钮。我们还在这个GUI系统中实现了通过鼠标的悬停和点击动作,来改变按钮的外观,在按下按钮后有一定的动画效果。

根据上面的描述,我们可以写出的实现代码如下:

 

其中pControl是一个自定义的GUICONTROL结构体的指针对象

 

                            //检查鼠标是否悬停或者点击了按钮if(mouseX> pControl->m_xPos && mouseX < pControl->m_xPos +pControl->m_width &&mouseY> pControl->m_yPos && mouseY < pControl->m_yPos + pControl->m_height){if(LMBDown)status = UGP_BUTTON_DOWN;elsestatus = UGP_BUTTON_OVER;}

 


4.类的框架设计

因为这个GUI系统的实现还有一定的细节需要详细说明,所以决定分两次更新来讲解。这次我们先把功能完整的类的实现结果给大家,并告诉大家如何使用,说明一下main函数相对于之前有哪些细节需要改变,然后GUI系统类的实现细节留待下篇讲解(如果需要额外用一次更新来讲解的话)。

还是把详细注释的头文件贴一下吧:

//====================================================
// Name: D3DGUIClass.h
//      Des:一个游戏GUI界面系统类的头文件
// 2013年 11月17日  Create by 浅墨
//====================================================#pragma once// 所支持的控件类型宏
#define UGP_GUI_STATICTEXT                 1
#define UGP_GUI_BUTTON                     2
#define UGP_GUI_Background                 3// 鼠标按键状态宏
#define UGP_BUTTON_UP                      1
#define UGP_BUTTON_OVER          	   2
#define UGP_BUTTON_DOWN                	   3// 设置一些GUI中用到的控件ID
#define STATIC_ID_1  1
#define STATIC_ID_2  2
#define BUTTON_ID_1  3
#define BUTTON_ID_2  4
#define BUTTON_ID_3  5
#define BUTTON_ID_4  6// FVF灵活顶点类型的结构体
struct GUIVERTEX
{floatx, y, z, rhw;unsignedlong color;floattu, tv;
};
#define D3DFVF_GUI (D3DFVF_XYZRHW |D3DFVF_DIFFUSE | D3DFVF_TEX1)//控件属性结构体
struct GUICONTROL
{//操作类型,ID和颜色intm_type;  //控件类型intm_id;  //控件IDunsignedlong m_color; //控件颜色intm_listID;   //如果是文字的话,这个变量就表示它使用的字体,否则就表示顶点缓存floatm_xPos, m_yPos;   //控件的起始位置floatm_width, m_height;   // 控件的宽度和高度wchar_t*m_text;   // 文字内容LPDIRECT3DTEXTURE9m_Background;   // 控件背景的填充图像LPDIRECT3DTEXTURE9m_upTex, m_downTex, m_overTex;   // 存放按钮弹起,按下和鼠标经过时的3张纹理图
};class D3DGUIClass
{private:LPDIRECT3DDEVICE9m_pd3dDevice;  //D3D设备对象    LPD3DXFONT*m_pFonts;  //D3D字体对象GUICONTROL*m_pControls;  //控件对象LPDIRECT3DVERTEXBUFFER9*m_pVertexBuffer;   //顶点缓存对象指针GUICONTROLm_Background;  //背景图对象LPDIRECT3DVERTEXBUFFER9m_BackgroundBuffer;   //背景图缓冲区对象boolm_bIsBackgroundUsed;  //一个标识,用于标识是否已经用了背景intm_nTotalFontNum;              //字体数目计数器intm_nTotalControlNum;        //控件数目计数器intm_nTotalBufferNum; //缓冲区数目计数器intm_nWindowWidth;    //窗口宽度intm_nWindowHeight;   //窗口高度public:D3DGUIClass(LPDIRECT3DDEVICE9device, int w, int h);~D3DGUIClass(){ ClearUp(); }LPDIRECT3DDEVICE9GetD3dDevice() { return m_pd3dDevice; } //返回D3D设备对象的函数GUICONTROL*GetBackground() { return &m_Background; } //返回背景的函数LPDIRECT3DVERTEXBUFFER9GetBackgroundBuffer() { return m_BackgroundBuffer; }  //返回背景缓冲区对象的函数intGetTotalFontNum() { return m_nTotalFontNum; } //返回所有字体数目的函数intGetTotalControlNum() { return m_nTotalControlNum; }  //返回所有控件数目的函数intGetTotalBufferNum() { return m_nTotalBufferNum; } //返回总的缓冲区数目的函数intGetWindowWidth() { return m_nWindowWidth; } //返回窗口宽度的函数intGetWindowHeight() { return m_nWindowHeight; } //返回窗口高度的函数boolIsBackgroundUsed() { return m_bIsBackgroundUsed; }     //返回背景是否在使用的bool值的函数voidSetWindowSize(int w, int h) { m_nWindowWidth = w; m_nWindowHeight = h; }  //设置窗口宽度和高度的函数LPD3DXFONTGetFont(int id)  //返回字体ID函数{if(id< 0 || id >= m_nTotalFontNum) return NULL;returnm_pFonts[id];}GUICONTROL*GetGUIControl(int id)  //返回GUI控件ID函数{if(id< 0 || id >= m_nTotalControlNum) return NULL;return&m_pControls[id];}LPDIRECT3DVERTEXBUFFER9GetVertexBuffer(int id) //返回顶点缓存ID函数{if(id< 0 || id >= m_nTotalBufferNum) return NULL;returnm_pVertexBuffer[id];}boolCreateTextFont(wchar_t *fontName, int size, int *fontID);  //字体创建函数boolAddBackground(wchar_t *fileName);  //GUI背景添加函数boolAddStaticText(int id, wchar_t *text, float x, float y, unsigned long color, intfontID); //添加静态文本函数boolAddButton(int id, float x, float y, wchar_t *up, wchar_t *over, wchar_t *down);//添加按钮函数voidClearUp( ); //资源清理函数};void ProcessGUI(D3DGUIClass *gui, boolLMBDown, int mouseX, int mouseY,void(*funcPtr)(intid, int state));  //回调函数




具体的实现细节如果现在讲会有一定的篇幅,我们留待下次讲解吧。

 



 


四、GUI系统类的使用



接下来,一起来研究研究如果要在我们之前的demo框架里使用GUI系统的话,需要添加哪些代码。

 

第一步,依旧是添加一些必要的全局变量:

 

D3DGUIClass      g_gui= NULL;  		//创建GUI类对象
int 		 g_FontID = -1;      	//  GUI中字体对象的ID
bool             g_LMBDown= false;      // GUI中的鼠标状态信息,鼠标左键是否按下的标识
int              g_MouseX= 0, g_MouseY = 0;   //存储鼠标坐标的两个变量


可以看到,在这里我们定义了自己写的GUI系统类D3DGUIClass的类对象,然后是鼠标状态信息相关的变量和一个字体对象。

 


第二步,在消息处理函数的switch中添加一些新的case:

 

//-----------------------------------【WndProc( )函数】--------------------------------------
//      描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINTmessage, WPARAM wParam, LPARAM lParam )  //窗口过程函数WndProc
{switch(message )                               //switch语句开始{caseWM_PAINT:                                          // 客户区重绘消息Direct3D_Render(hwnd,0.0f);          //调用Direct3D_Render函数,进行画面的绘制ValidateRect(hwnd,NULL);   // 更新客户区的显示break;                                                                                 //跳出该switch语句caseWM_KEYDOWN:                // 键盘按下消息if(wParam == VK_ESCAPE)    // ESC键DestroyWindow(hwnd);    // 销毁窗口, 并发送一条WM_DESTROY消息break;caseWM_DESTROY:                                    //窗口销毁消息Direct3D_CleanUp();     //调用Direct3D_CleanUp函数,清理COM接口对象PostQuitMessage(0 );              //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息break;                                                     //跳出该switch语句caseWM_KEYUP:if(wParam== VK_ESCAPE) PostQuitMessage(0);break;caseWM_LBUTTONDOWN:g_LMBDown= true;break;caseWM_LBUTTONUP:g_LMBDown= false;break;caseWM_MOUSEMOVE:g_MouseX= LOWORD (lParam);g_MouseY= HIWORD (lParam);break;default:                                                   //若上述case条件都不符合,则执行该default语句returnDefWindowProc( hwnd, message, wParam, lParam );                  //调用缺省的窗口过程来为应用程序没有处理的窗口消息提供缺省的处理。}return0;                                       //正常退出
}


其实这一步就是在之前消息的基础上,添加了左键按下,左键弹起,和鼠标移动的消息响应。



第三步,在进行渲染资源准备的Object_Init( )函数中,添加载入GUI系统中的资源到内存中的相关代码:

 

//-----------------------------------【Object_Init()函数】--------------------------------------
//      描述:渲染资源初始化函数,在此函数中进行要被渲染的物体的资源的初始化
//--------------------------------------------------------------------------------------------------
HRESULT Objects_Init()
{//创建字体D3DXCreateFont(g_pd3dDevice,36, 0, 0, 1000, false, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY, 0, _T("Calibri"), &g_pTextFPS);D3DXCreateFont(g_pd3dDevice,20, 0, 1000, 0, false, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY, 0, L"华文中宋", &g_pTextAdaperName);D3DXCreateFont(g_pd3dDevice,23, 0, 1000, 0, false, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY, 0, L"微软雅黑", &g_pTextHelper);D3DXCreateFont(g_pd3dDevice,26, 0, 1000, 0, false, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY, 0, L"黑体", &g_pTextInfor);//设置纹理采样参数g_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER, D3DTEXF_NONE);g_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_NONE);g_pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER, D3DTEXF_NONE);//-----------------------------------【GUI系统相关代码】-------------------------------//创建GUI系统g_gui= new D3DGUIClass(g_pd3dDevice, WINDOW_WIDTH, WINDOW_HEIGHT);if(!g_gui)return false;//添加背景图片if(!g_gui->AddBackground(L"GameMedia\\Assassinscreed.jpg")) return false;//添加字体if(!g_gui->CreateTextFont(L"微软雅黑",28, &g_FontID)) return false;//添加静态文本到GUI中if(!g_gui->AddStaticText(STATIC_ID_1,L"Version 浅墨1.0版",1170,735, D3DCOLOR_XRGB(55,155,255), g_FontID)) return false;if(!g_gui->AddStaticText(STATIC_ID_2,L"浅墨DirectX教程第三季之 打造游戏GUI界面",500,10, D3DCOLOR_XRGB(255,255,255), g_FontID)) return false;//添加4个按钮,分别是开始游戏,载入进度,选项和退出游戏,每个按钮对应3幅图if(!g_gui->AddButton(BUTTON_ID_1,650, 340, L"GameMedia\\startUp.png",L"GameMedia\\StartOver.png",L"GameMedia\\startDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_2,650, 385, L"GameMedia\\loadUp.png",L"GameMedia\\loadOver.png",L"GameMedia\\loadDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_3,650, 430, L"GameMedia\\optionsUp.png",L"GameMedia\\optionsOver.png",L"GameMedia\\optionsDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_4,650, 475, L"GameMedia\\quitUp.png",L"GameMedia\\quitOver.png",L"GameMedia\\quitDown.png")) return false;returnS_OK;
}


代码中都注释的比较详细,就不多说明了哈。

 

第四步,添加一个GUI系统的回调函数:

 

void GUICallback(int id, int state)
{switch(id){caseBUTTON_ID_1://“开始游戏”按钮的相关代码实现break;caseBUTTON_ID_2://“载入游戏”按钮的相关代码实现break;caseBUTTON_ID_3://“选项”按钮的相关代码实现break;caseBUTTON_ID_4://如果点击了退出按钮,就退出程序if(state== UGP_BUTTON_DOWN) PostQuitMessage(0);break;}
}


这里是一个switch—case语句总领的回调函数。

大家也许暂时会对这个函数的使用不太理解,其实它和我们自定义的ProcessGUI有着千丝万缕的联系,具体内容我们在出GUI的第二篇文章的时候再详细讲解。这里我们只要知道它是和ProcessGUI搞基的就可以了。

举个例子吧,对其中的BUTTON_ID_1按钮,就是指的GUI界面中的“Start Game”按钮,而点击之后的余下响应代码(也就是消息响应代码就写在这个case之后,比如说点击了新游戏的开始后需要渲染游戏画面等等一系列代码。

 

第五步,在渲染五步曲的第三步中调用一个封装好功能的ProcessGUI函数就可以了。这个函数的具体实现我们在稍后退出的文章中会讲到。

 

 //--------------------------------------------------------------------------------------//【Direct3D渲染五步曲之二】:开始绘制//--------------------------------------------------------------------------------------g_pd3dDevice->BeginScene();                     // 开始绘制//--------------------------------------------------------------------------------------//【Direct3D渲染五步曲之三】:正式绘制//--------------------------------------------------------------------------------------//处理和渲染GUI系统ProcessGUI(g_gui,g_LMBDown, g_MouseX, g_MouseY, GUICallback);//-----------------------------【绘制文字信息】-----------------------------HelpText_Render(hwnd);//--------------------------------------------------------------------------------------//【Direct3D渲染五步曲之四】:结束绘制//--------------------------------------------------------------------------------------g_pd3dDevice->EndScene();                       // 结束绘制

        






五、详细注释的源代码欣赏

 


这次的工程因为是作为GUI的初步演示,自然就有了孑然一身的感觉,除了main.cpp和D3DUtil.h就是D3DGUIClass类的源文件和头文件了。如下图:

 

程序主要是实现了简单的GUI系统,通过GUI系统的功能在屏幕上添加了游戏菜单的四个按钮,并且在屏幕上输出了“浅墨DirectX教程第三季 之 打造游戏GUI界面”,"Version 浅墨1.0版"这两段文字。

而且目前对“quit”退出按钮的功能进行了实行实现,其实就简单一句if(state == UGP_BUTTON_DOWN) PostQuitMessage(0);。。。。。


那么,老规矩,上程序的核心部分,main函数的代码吧:

 

//-----------------------------------【程序说明】----------------------------------------------
// 【Visual C++】游戏开发系列配套源码五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
// VS2010版
// 2013年11月 Create by 浅墨
// 背景音乐素材出处: 刺客信条
//------------------------------------------------------------------------------------------------//-----------------------------------【宏定义部分】--------------------------------------------
// 描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_WIDTH	1366						//为窗口宽度定义的宏,以方便在此处修改窗口宽度
#define WINDOW_HEIGHT	768							//为窗口高度定义的宏,以方便在此处修改窗口高度
#define WINDOW_TITLE	 _T("【致我们永不熄灭的游戏开发梦想】 浅墨DirectX教程二十三 打造游戏GUI界面(一)博文配套示例程序 by浅墨") //为窗口标题定义的宏//-----------------------------------【头文件包含部分】---------------------------------------
//	描述:包含程序所依赖的头文件
//------------------------------------------------------------------------------------------------                                                                                      
#include <d3d9.h>
#include <d3dx9.h>
#include <tchar.h>
#include <time.h> 
#include "D3DUtil.h"
#include "D3DGUIClass.h"//-----------------------------------【库文件包含部分】---------------------------------------
//	描述:包含程序所依赖的库文件
//------------------------------------------------------------------------------------------------  
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib, "dinput8.lib")     // 使用DirectInput必须包含的库文件,注意这里有8
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib, "winmm.lib") // 地板的顶点结构
struct CUSTOMVERTEX
{FLOAT _x, _y, _z;FLOAT _u, _v ;CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v): _x(x), _y(y), _z(z), _u(u), _v(v) {}
};
#define D3DFVF_CUSTOMVERTEX  (D3DFVF_XYZ | D3DFVF_TEX1)//-----------------------------------【全局变量声明部分】-------------------------------------
//	描述:全局变量的声明
//------------------------------------------------------------------------------------------------
LPDIRECT3DDEVICE9					g_pd3dDevice = NULL;				//Direct3D设备对象
LPD3DXFONT								g_pTextFPS =NULL;    //字体COM接口
LPD3DXFONT								g_pTextAdaperName = NULL;  // 显卡信息的2D文本
LPD3DXFONT								g_pTextHelper = NULL;  // 帮助信息的2D文本
LPD3DXFONT								g_pTextInfor= NULL;  // 绘制信息的2D文本
float												g_FPS= 0.0f;       //一个浮点型的变量,代表帧速率
wchar_t										g_strFPS[50] ={0};    //包含帧速率的字符数组
wchar_t										g_strAdapterName[60] ={0};   //包含显卡名称的字符数组D3DGUIClass								*g_gui = NULL;  //创建GUI类对象
bool												g_LMBDown = false;      // GUI中的鼠标状态信息,鼠标左键是否按下的标识
int												g_MouseX = 0, g_MouseY = 0;      //存储鼠标坐标的两个变量
int g_FontID = -1;						//  GUI中字体对象的ID//-----------------------------------【全局函数声明部分】-------------------------------------
//	描述:全局函数声明,防止“未声明的标识”系列错误
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK		WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
HRESULT						Direct3D_Init(HWND hwnd,HINSTANCE hInstance);
HRESULT						Objects_Init();
void								Direct3D_Render( HWND hwnd,FLOAT fTimeDelta);
void								Direct3D_Update( HWND hwnd,FLOAT fTimeDelta);
void								Direct3D_CleanUp( );
float								Get_FPS();
void								HelpText_Render(HWND hwnd);
void								GUICallback(int id, int state);//-----------------------------------【WinMain( )函数】--------------------------------------
//	描述:Windows应用程序的入口函数,我们的程序从这里开始
//------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{//开始设计一个完整的窗口类WNDCLASSEX wndClass={0} ;				//用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化    wndClass.cbSize = sizeof( WNDCLASSEX ) ;	//设置结构体的字节数大小wndClass.style = CS_HREDRAW | CS_VREDRAW;	//设置窗口的样式wndClass.lpfnWndProc = WndProc;				//设置指向窗口过程函数的指针wndClass.cbClsExtra		= 0;wndClass.cbWndExtra		= 0;wndClass.hInstance = hInstance;				//指定包含窗口过程的程序的实例句柄。wndClass.hIcon=(HICON)::LoadImage(NULL,_T("GameMedia\\icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //从全局的::LoadImage函数从本地加载自定义ico图标wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄wndClass.lpszMenuName = NULL;						//用一个以空终止的字符串,指定菜单资源的名字。wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop");		//用一个以空终止的字符串,指定窗口类的名字。if( !RegisterClassEx( &wndClass ) )				//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口return -1;		HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE,			//喜闻乐见的创建窗口函数CreateWindowWS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );//Direct3D资源的初始化,调用失败用messagebox予以显示if (!(S_OK==Direct3D_Init (hwnd,hInstance))){MessageBox(hwnd, _T("Direct3D初始化失败~!"), _T("浅墨的消息窗口"), 0); //使用MessageBox函数,创建一个消息窗口 }PlaySound(L"GameMedia\\Heart - 刺客信条.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP);   //循环播放背景音乐MoveWindow(hwnd,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,true);   //调整窗口显示时的位置,窗口左上角位于屏幕坐标(200,10)处ShowWindow( hwnd, nShowCmd );    //调用Win32函数ShowWindow来显示窗口UpdateWindow(hwnd);  //对窗口进行更新,就像我们买了新房子要装修一样//消息循环过程MSG msg = { 0 };  //初始化msgwhile( msg.message != WM_QUIT )			//使用while循环{static FLOAT fLastTime  = (float)::timeGetTime();static FLOAT fCurrTime  = (float)::timeGetTime();static FLOAT fTimeDelta = 0.0f;fCurrTime  = (float)::timeGetTime();fTimeDelta = (fCurrTime - fLastTime) / 1000.0f;fLastTime  = fCurrTime;if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。{TranslateMessage( &msg );		//将虚拟键消息转换为字符消息DispatchMessage( &msg );		//该函数分发一个消息给窗口程序。}else{Direct3D_Update(hwnd,fTimeDelta);         //调用更新函数,进行画面的更新Direct3D_Render(hwnd,fTimeDelta);			//调用渲染函数,进行画面的渲染			}}UnregisterClass(_T("ForTheDreamOfGameDevelop"), wndClass.hInstance);return 0;  
}//-----------------------------------【WndProc( )函数】--------------------------------------
//	描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )   //窗口过程函数WndProc
{switch( message )				//switch语句开始{case WM_PAINT:					 // 客户区重绘消息Direct3D_Render(hwnd,0.0f);          //调用Direct3D_Render函数,进行画面的绘制ValidateRect(hwnd, NULL);   // 更新客户区的显示break;									//跳出该switch语句case WM_KEYDOWN:                // 键盘按下消息if (wParam == VK_ESCAPE)    // ESC键DestroyWindow(hwnd);    // 销毁窗口, 并发送一条WM_DESTROY消息break;case WM_DESTROY:				//窗口销毁消息Direct3D_CleanUp();     //调用Direct3D_CleanUp函数,清理COM接口对象PostQuitMessage( 0 );		//向系统表明有个线程有终止请求。用来响应WM_DESTROY消息break;						//跳出该switch语句case WM_KEYUP:if(wParam == VK_ESCAPE) PostQuitMessage(0);break;case WM_LBUTTONDOWN:g_LMBDown = true;break;case WM_LBUTTONUP:g_LMBDown = false;break;case WM_MOUSEMOVE:g_MouseX = LOWORD (lParam);g_MouseY = HIWORD (lParam);break;default:						//若上述case条件都不符合,则执行该default语句return DefWindowProc( hwnd, message, wParam, lParam );		//调用缺省的窗口过程来为应用程序没有处理的窗口消息提供缺省的处理。}return 0;					//正常退出
}//-----------------------------------【Direct3D_Init( )函数】----------------------------------
//	描述:Direct3D初始化函数,进行Direct3D的初始化
//------------------------------------------------------------------------------------------------
HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance)
{//--------------------------------------------------------------------------------------// 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以便用该Direct3D对象创建Direct3D设备对象//--------------------------------------------------------------------------------------LPDIRECT3D9  pD3D = NULL; //Direct3D接口对象的创建if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口对象,并进行DirectX版本协商return E_FAIL;//--------------------------------------------------------------------------------------// 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息//--------------------------------------------------------------------------------------D3DCAPS9 caps; int vp = 0;if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) ){return E_FAIL;}if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;   //支持硬件顶点运算,我们就采用硬件顶点运算,妥妥的elsevp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件顶点运算,无奈只好采用软件顶点运算//--------------------------------------------------------------------------------------// 【Direct3D初始化四步曲之三,填内容】:填充D3DPRESENT_PARAMETERS结构体//--------------------------------------------------------------------------------------D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp));d3dpp.BackBufferWidth            = WINDOW_WIDTH;d3dpp.BackBufferHeight           = WINDOW_HEIGHT;d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;d3dpp.BackBufferCount            = 2;d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;d3dpp.MultiSampleQuality         = 0;d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow              = hwnd;d3dpp.Windowed                   = true;d3dpp.EnableAutoDepthStencil     = true; d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;d3dpp.Flags                      = 0;d3dpp.FullScreen_RefreshRateInHz = 0;d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;//--------------------------------------------------------------------------------------// 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口//--------------------------------------------------------------------------------------if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice)))return E_FAIL;//获取显卡信息到g_strAdapterName中,并在显卡名称之前加上“当前显卡型号:”字符串wchar_t TempName[60]=L"当前显卡型号:";   //定义一个临时字符串,且方便了把"当前显卡型号:"字符串引入我们的目的字符串中D3DADAPTER_IDENTIFIER9 Adapter;  //定义一个D3DADAPTER_IDENTIFIER9结构体,用于存储显卡信息pD3D->GetAdapterIdentifier(0,0,&Adapter);//调用GetAdapterIdentifier,获取显卡信息int len = MultiByteToWideChar(CP_ACP,0, Adapter.Description, -1, NULL, 0);//显卡名称现在已经在Adapter.Description中了,但是其为char类型,我们要将其转为wchar_t类型MultiByteToWideChar(CP_ACP, 0, Adapter.Description, -1, g_strAdapterName, len);//这步操作完成后,g_strAdapterName中就为当前我们的显卡类型名的wchar_t型字符串了wcscat_s(TempName,g_strAdapterName);//把当前我们的显卡名加到“当前显卡型号:”字符串后面,结果存在TempName中wcscpy_s(g_strAdapterName,TempName);//把TempName中的结果拷贝到全局变量g_strAdapterName中,大功告成~if(!(S_OK==Objects_Init())) return E_FAIL;SAFE_RELEASE(pD3D) //LPDIRECT3D9接口对象的使命完成,我们将其释放掉return S_OK;
}//-----------------------------------【Object_Init( )函数】--------------------------------------
//	描述:渲染资源初始化函数,在此函数中进行要被渲染的物体的资源的初始化
//--------------------------------------------------------------------------------------------------
HRESULT Objects_Init()
{//创建字体D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1000, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("Calibri"), &g_pTextFPS);D3DXCreateFont(g_pd3dDevice, 20, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"华文中宋", &g_pTextAdaperName); D3DXCreateFont(g_pd3dDevice, 23, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"微软雅黑", &g_pTextHelper); D3DXCreateFont(g_pd3dDevice, 26, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"黑体", &g_pTextInfor); //设置纹理采样参数g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_NONE);g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_NONE);g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);//-----------------------------------【GUI系统相关代码】-------------------------------// 创建GUI系统g_gui = new D3DGUIClass(g_pd3dDevice, WINDOW_WIDTH, WINDOW_HEIGHT);if(!g_gui) return false;// 添加背景图片if(!g_gui->AddBackground(L"GameMedia\\Assassins creed.jpg")) return false;// 添加字体if(!g_gui->CreateTextFont(L"微软雅黑", 28, &g_FontID)) return false;// 添加静态文本到GUI中if(!g_gui->AddStaticText(STATIC_ID_1, L"Version 浅墨1.0版",1170, 735, D3DCOLOR_XRGB(55,155,255), g_FontID)) return false;if(!g_gui->AddStaticText(STATIC_ID_2, L"浅墨DirectX教程第三季 之 打造游戏GUI界面",500, 10, D3DCOLOR_XRGB(255,255,255), g_FontID)) return false;// 添加4个按钮,分别是开始游戏,载入进度,选项和退出游戏,每个按钮对应3幅图if(!g_gui->AddButton(BUTTON_ID_1, 650, 340, L"GameMedia\\startUp.png",L"GameMedia\\StartOver.png", L"GameMedia\\startDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_2, 650, 385, L"GameMedia\\loadUp.png",L"GameMedia\\loadOver.png", L"GameMedia\\loadDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_3, 650, 430, L"GameMedia\\optionsUp.png",L"GameMedia\\optionsOver.png", L"GameMedia\\optionsDown.png")) return false;if(!g_gui->AddButton(BUTTON_ID_4, 650, 475, L"GameMedia\\quitUp.png",L"GameMedia\\quitOver.png", L"GameMedia\\quitDown.png")) return false;return S_OK;
}void GUICallback(int id, int state)
{switch(id){case BUTTON_ID_1: //“开始游戏”按钮的相关代码实现break;case BUTTON_ID_2://“载入游戏”按钮的相关代码实现break;case BUTTON_ID_3://“选项”按钮的相关代码实现break;case BUTTON_ID_4://如果点击了退出按钮,就退出程序if(state == UGP_BUTTON_DOWN) PostQuitMessage(0);break;}
}//-----------------------------------【Direct3D_Update( )函数】--------------------------------
//	描述:不是即时渲染代码但是需要即时调用的,如按键后的坐标的更改,都放在这里
//--------------------------------------------------------------------------------------------------
void	Direct3D_Update( HWND hwnd,FLOAT fTimeDelta)
{//GUI的实现暂时不需要在这里写代码
}//-----------------------------------【Direct3D_Render( )函数】-------------------------------
//	描述:使用Direct3D进行渲染
//--------------------------------------------------------------------------------------------------
void Direct3D_Render(HWND hwnd,FLOAT fTimeDelta)
{//--------------------------------------------------------------------------------------// 【Direct3D渲染五步曲之一】:清屏操作//--------------------------------------------------------------------------------------g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(100, 255, 255), 1.0f, 0);//--------------------------------------------------------------------------------------// 【Direct3D渲染五步曲之二】:开始绘制//--------------------------------------------------------------------------------------g_pd3dDevice->BeginScene();                     // 开始绘制//--------------------------------------------------------------------------------------// 【Direct3D渲染五步曲之三】:正式绘制//--------------------------------------------------------------------------------------// 处理和渲染GUI系统ProcessGUI(g_gui, g_LMBDown, g_MouseX, g_MouseY, GUICallback);//-----------------------------【绘制文字信息】-----------------------------HelpText_Render(hwnd);//--------------------------------------------------------------------------------------// 【Direct3D渲染五步曲之四】:结束绘制//--------------------------------------------------------------------------------------g_pd3dDevice->EndScene();                       // 结束绘制//--------------------------------------------------------------------------------------// 【Direct3D渲染五步曲之五】:显示翻转//--------------------------------------------------------------------------------------g_pd3dDevice->Present(NULL, NULL, NULL, NULL);  // 翻转与显示}//-----------------------------------【HelpText_Render( )函数】-------------------------------
//	描述:封装了帮助信息的函数
//--------------------------------------------------------------------------------------------------
void HelpText_Render(HWND hwnd)
{//定义一个矩形,用于获取主窗口矩形RECT formatRect;GetClientRect(hwnd, &formatRect);//在窗口右上角处,显示每秒帧数formatRect.top = 5;int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() );g_pTextFPS->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_RGBA(0,239,136,255));//显示显卡类型名g_pTextAdaperName->DrawText(NULL,g_strAdapterName, -1, &formatRect, DT_TOP | DT_LEFT, D3DXCOLOR(1.0f, 0.5f, 0.0f, 1.0f));
}//-----------------------------------【Get_FPS( )函数】------------------------------------------
//	描述:用于计算每秒帧速率的一个函数
//--------------------------------------------------------------------------------------------------
float Get_FPS()
{//定义四个静态变量static float  fps = 0; //我们需要计算的FPS值static int    frameCount = 0;//帧数static float  currentTime =0.0f;//当前时间static float  lastTime = 0.0f;//持续时间frameCount++;//每调用一次Get_FPS()函数,帧数自增1currentTime = timeGetTime()*0.001f;//获取系统时间,其中timeGetTime函数返回的是以毫秒为单位的系统时间,所以需要乘以0.001,得到单位为秒的时间//如果当前时间减去持续时间大于了1秒钟,就进行一次FPS的计算和持续时间的更新,并将帧数值清零if(currentTime - lastTime > 1.0f) //将时间控制在1秒钟{fps = (float)frameCount /(currentTime - lastTime);//计算这1秒钟的FPS值lastTime = currentTime; //将当前时间currentTime赋给持续时间lastTime,作为下一秒的基准时间frameCount    = 0;//将本次帧数frameCount值清零}return fps;
}//-----------------------------------【Direct3D_CleanUp( )函数】--------------------------------
//	描述:对Direct3D的资源进行清理,释放COM接口对象
//---------------------------------------------------------------------------------------------------
void Direct3D_CleanUp()
{//释放COM接口对象SAFE_RELEASE(g_pd3dDevice);SAFE_RELEASE(g_pTextFPS)SAFE_RELEASE(g_pd3dDevice)SAFE_DELETE(g_gui)
}


 

那么,最后一起看看运行截图吧:


 

鼠标悬停在options按钮之上,可以发现按钮“下陷”了

 

 

点击quit按钮,游戏程序便会退出:

 

 

 

 嗯,本篇文章到这里就基本结束了,最后放出本篇文章配套示例程序的下载地址。


本篇文章的配套源代码请点击这里下载:



【浅墨DirectX提高班】配套源代码之二十三下载 (CSDN下载频道)


【浅墨DirectX提高班】配套源代码之二十三下载 (百度云盘)



文章最后,依旧是送大家一些正能量,不过今天有所不同,它们是:

 

Seven Things I Would Really Tresure In Life(生命中我将珍视的七个习惯):

 

1) 对某件事(某种物)持久的热爱和坚持。


2)早晨起来写下今天要做的三件事,晚上入睡前能真的将它们做完。


3)永远对未知和未见的充满着好奇,当它们出现时毫不犹豫地去拥抱它们。


4)并不因他人的非议或外界的阻力而改变对自己的看法的坚持,当要被迫使违背心愿去做某事时坚定不移地说"不"。


5)活在当下,珍视已有的一切,someday you will miss today.


6)对和自己完全无关的人,仅因其所处的境遇而产生同情与关心,并尽己所能去帮助。


7)对一个更好的世界和一个更好的自己的向往与不放下的执念。


 

是的,塑造自己的过程会很疼,但是最终你能收获一个更好的自己。加油:)


 


 

 

下周一,让我们离游戏开发的梦想更近一步。

下周一,游戏开发笔记,我们,不见不散。

 

 

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. .NET开发者常用网站

    前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一&#xff0c;或者想要成为其中之一的话&#xff0c;我下面将要列出的每一个站点都应该是你的最爱&#xff0c;都应该收藏到书签中去。 对于不熟悉.NET技术的朋友&#xff0c;需要说明一下&#xff0c;.NET提供了…...

    2024/4/7 0:50:43
  2. 连接postgresql出错

    Navicat客户端PostgreSQL连接报错&#xff1a;Could not connect to server:Connection refused(0x00002740/10061)_datouniao1的博客-CSDN博客b 把IP改成0.0.0.0/0 所有ip都能修改...

    2024/4/23 16:17:05
  3. 最近两个springboot 的报错解决心得

    1.数据库datasourse加载失败 读取url失败 解决方式&#xff1a;重新新建项目 看了网上的教程没办法排除错误&#xff0c;大概率pom文件 改了没改对 配置数据库url 的JDBC 读取不了 2.Whitelabel Error Page 创建的controller文件位置应该项目文件的子文件 解决办法是&a…...

    2024/4/15 4:50:36
  4. 数字前端设计——CPU设计(1)

    数字前端设计——CPU设计&#xff08;1&#xff09;ALU的设计实验ALU的实验要求ALU的设计实验 如图所示&#xff0c;给出一个具有N位输入和N位输出的算术逻辑单元。此单元接收控制信号F&#xff0c;执行对应功能后&#xff0c;得到N位输出&#xff1b; F2:0功能000A B001A - …...

    2024/4/15 4:50:41
  5. 横波的matlab程序

    x0:.2:10; %离散波线nlength(x)yzeros(1,n)u1 %波速plot(x,y,or,x,y) %波线的各个质元都在平衡位置axis([0,10,-1,1])grid on pause %按任意键继续&#xff0c;波线上各个质元从波源开始由近及远依次振动for t0:0.1:20 %时间离散 y0.5*cos(t-x-pi/2).*(t>x/u);%波动方程…...

    2024/4/5 6:21:34
  6. Selenium定位不到元素常见原因及解决办法

    Python3 Selenium定位不到元素常见原因及解决办法 一、问题描述 **  在做web应用的自动化测试时&#xff0c;定位元素是必不可少的&#xff0c;这个过程经常会碰到定位不到元素的情况&#xff1a;** **  报错信息&#xff1a; no such element: Unable to locate elemen…...

    2024/4/15 4:51:22
  7. 京东呆瓜青龙面板+xdd-puls教程整合(附加QQ机器人教程)【2021.11.4更新】

    目录前言第一步 安装宝塔第二步 拉取青龙面板第三步 安装xdd-plus第四步 安装配置文件及依赖结尾前言 建议服务器2核2G及以上再看这个教程哦&#xff0c;1核2G的跑起来很吃力的。 装完就是有QQ机器人查询功能的&#xff0c;上个图吧 差不多就是这个效果。 加入交流群33499663…...

    2024/4/26 5:07:44
  8. 快捷方法操作

    cmd /c start www.baidu.com cmd /c start google...

    2024/4/20 15:57:10
  9. 第八章:外部设备

    8.1外部设备概述 中央处理器&#xff08;CPU&#xff09;和主存储器&#xff08;MM&#xff09;构成计算机的主机。除主机以外&#xff0c;而又围绕着主机设置的各种硬件装置称为外部设备或外围设备。它们主要用来完成数据的输入、输出、成批存储以及对信息加工处理的任务。 …...

    2024/4/15 4:51:07
  10. 身份证效验规则--vue

    JS代码 /***校验规则存放*/ const telephoneValidate (rule, phoneNo, callback) > {const regPhoneNo /^1[3|4|5|7|8][0-9]\d{8}$/if(!phoneNo) {callback(new Error(请输入电话号码))}else if(!regPhoneNo.test(phoneNo)) {callback(new Error(请输入正确的11位手机号码…...

    2024/4/25 21:04:18
  11. VTK笔记-VTK的数学工具vtkMath类(未完)

    vtkMath vtkMath提供了执行常见数学运算的方法。这些包括提供常数&#xff0c;如Pi&#xff1b;从度到弧度的转换&#xff1b;向量运算&#xff0c;如点积、叉积和向量范数&#xff1b;2x2和3x3矩阵的矩阵行列式&#xff1b;一元多项式求解器&#xff1b;用于随机数生成&#x…...

    2024/4/17 12:10:08
  12. 利用爬虫获取app数据

    前言&#xff1a;网页的数据一般可以直接通过network来查看其发送的请求url&#xff0c;爬取较为容易。但是对于app来说&#xff0c;不能直接看到它的url&#xff0c;就需要有抓包工具。 1 fiddler介绍 fiddler是一个web调试工具&#xff0c;能够抓取客户端和服务端之间的交互…...

    2024/4/15 4:52:23
  13. 北森,SaaS风口上的「新范式」

    ​ 在单纯的战略表象背后&#xff0c;成立19年&#xff0c;北森在每一个节点做选择的核心驱动力是什么&#xff1f;这家公司是否拥有自己内部的“组织密码”&#xff1f; 作者|皮爷 出品|产业家 2013年&#xff0c;纪伟国决定要去美国“取取经”。和他同行的还有参与了北森A…...

    2024/4/25 14:28:03
  14. React 使用 swiper 6

    React 使用 swiper 6安装基本使用如何做双向控制安装 npm i swiper基本使用 官方文档地址&#xff1a; Swiper React Components // 引入Swiper组件 import { Swiper, SwiperSlide } from swiper/react;// 引入Swiper样式 import swiper/swiper.scss;export default () >…...

    2024/4/15 4:51:02
  15. python 读取csv文件内容

    with open(rChina-City-List-latest-1.csv) as f:f_csv csv.DictReader(f)for row in f_csv:print(row) f.close()...

    2024/4/25 23:29:54
  16. 天猫精灵开发技能【2】

    阿里云云开发平台名称以及网址workbench.aliyun.com 阿里云 - 云开发平台 (aliyun.com) 一、配置语音交互模型 点击创建意图按钮进入创建意图页面&#xff0c;并且设置默认意图。 意图是用户使用语音技能的目的&#xff0c;语音技能至少要有一个意图&#xff08;至少向用户提…...

    2024/4/20 7:32:25
  17. layui应用(一)--- laydate问题

    laydate控件清空后&#xff0c;刷新表格&#xff0c;仍然会使用历史日期进行查询&#xff0c;问题在于table.js的代码片段&#xff1a; i.configt.extend(!0,{},i.config,e) 解决方法为&#xff0c;将table.js代码片段改为&#xff1a; ,i.configt.extend(!0,{},i.config,e)…...

    2024/4/19 11:27:34
  18. 小笔记-简单但够用系列_CPU 性能指标

    记录服务器 CPU 的一些性能指标 文章目录CPU 指标CPU 使用率CPU 负载CPU 指标 Linux 机器使用 top 命令或 vmstat 命令查看。 需要注意当 CPU 使用率较大时&#xff0c;使用 vmstat 命令查看到的结果可能有延迟误差&#xff0c;此时可用 top 命令查询单个 CPU 的情况。 CPU 使…...

    2024/4/18 8:19:54
  19. mysql-06讲全局锁和表锁:给表加个字段怎么有这么多阻碍

    mysql-06讲全局锁和表锁&#xff1a;给表加个字段怎么有这么多阻碍...

    2024/4/15 4:51:17
  20. 将字符串按单词对其逆序

    思路&#xff1a; 将各个单词逆序&#xff0c;然后整体逆序。 例如&#xff1a; I like beijing; ①I ekil gnijieb ②整体逆置&#xff1a;beijing like I 代码实现如下&#xff1a; /************************************************* 题目: 给定一个字符串&#xff0c;按…...

    2024/4/20 1:40:08

最新文章

  1. 空间数据索引的利器:R-Tree原理与实现深度解析

    空间数据索引的利器&#xff1a;R-Tree原理与实现深度解析 R-Tree的原理插入操作分裂操作查询操作 R-Tree的伪代码R-Tree的C语言实现讨论结论 R-Tree是一种平衡树&#xff0c;用于空间数据索引&#xff0c;特别是在二维或更高维度的几何对象存储和检索中。它由Antony Guttman和…...

    2024/4/26 14:21:53
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C#简单——多选框控件相关的神奇问题

    他们真的很简单&#xff0c;但我怎么总是忘记啊QAQ 还是记下来吧&#xff0c;下次直接copy 点开后出现 有列名 列名有数据&#xff0c;有表 表里有数据但不显示的情况 解决&#xff1a;点击小三角-点击Design View-Columns-需要在这里对下拉列表里的内容进行对应配置。 多选框…...

    2024/4/22 16:28:51
  4. 达梦DMHS-Manager工具安装部署

    目录 1、前言 1.1、平台架构 1.2、平台原理 2、环境准备 2.1、硬件环境 2.2、软件环境 2.3、安装DMHS 2.3.1、源端DMHS前期准备 2.3.2、源端DMHS安装 2.3.3、目的端DMHS安装 3、DMHS-Manager客户端部署 3.1、启动dmhs web服务 3.2、登录web管理平台 4、添加DMHS实…...

    2024/4/25 21:35:41
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57