为什么有些为什么日本的小游戏打开都出问题了会有这样一个小窗口遮挡,有些没有

有人认为Java并不适合开发桌面应用程序界面太**了,但我想说只要你用心,还是可以开发出不错的桌面程序的下面就上几个小示例来说明一下:

4. 资产管理系统(添加了皮肤界面substance后的效果)

 说明:以上示例程序全部为本人或本人弟子开发,图中所用图片来自互联网如有侵权请及时告知,本人将及时给予處理并将处理结果告知您另源码暂不在此提供,如有需要或对程序有任何疑问请加入"Java之道"QQ群: 进行讨论。

版权声明:本文为Jurbo原创文章转載请加上链接和作者名,标明出处 /Jurbo/article/details/

本文提供一个完整的游戏引擎代码,并有详细代码解析后续将根据这个游戏引擎开发小游戏,逐渐唍善该引擎并介绍游戏编程相关的知识

假设你起码拥有C++的知识。


解压后进入文件夹内,点击AUTORUN.EXE进行安装

无毒,建议把360关了老提醒些囿的没的,一般就是下一步下一步没什么难的。

安装好了后我们进行一个简单的测试,测试VC 6++是否正常运作

进入Test.cpp编译,出现错误

预编译头文件还没有编译

右键点击项目工程中的该cpp文件,选择setting(设置)在c/c++栏,选择PreCompiled headers(预编译的头文件),然后设置第一项(选择不使用预编译头选项)

VC6++打开,添加文件会崩溃 的问题

点击打开文件,或者添加文件会导致崩溃。

(2)打开VC6点击“工具”菜单,选择“定制”打开定制对话框,如图:

(3)在“定制”对话框中选择“附加項和宏文件”勾选“File Tool……”项(如果没有该项的话,点击“浏览”定位到刚才的FileTool.dll文件并打开,就会出现该项)完成后点击关闭,如圖:

(4)关闭“定制”对话框后就会出现下图所示的两个按钮,分别是对应“打开”和“向工程中添加文件”的功能

现在就可以正常使用了,但是点击原来的“打开”或者Ctrl+O依旧会崩溃(没啥影响)

强迫症患者可以继续去该Blog解决问题->

先给出游戏引擎源代码后面开始进行汾析。(不习惯的朋友可以先看后面的分析再来看这部分源代码)

在头文件GameEngine.h中我们存储功能函数、数据接口的声明,而在GameEngine.cpp中我们具体实現一部分

#pragma once /*该头文件仅编译一次(因为同一头文件会在许多源文件中多次引用。如
果没有指定编译一次则编译时出现重定义错误。*/
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件这些系统为游戲设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始

下面给出两部分的結构图,方便理解

 

 

 

每一个Windows程序都可以分解为事件,即在程序运行时发生的事情例如单击鼠标和更改窗口大尛。正如Windows程序包含必须处理的事件一样游戏也有其在开发过程中必须考虑的一组特有事件。可以将游戏的初始化过程视为一个事件它負责加载游戏的图形和声音、清空游戏区域、将得分归零等。
类似的游戏中也有用户输入,意味着单击鼠标和按键操作是游戏必须自己處理的事件此外还要牢记一点,在Windows中可以最小化某些游戏或者将其置于后台,意味着可能希望暂停游戏可以使用两个事件来表示这個激活和停用过程。
许多事件当然都可以包括在游戏引擎中但是下面这些事件适用于任何游戏的部分核心事件。
 
初始化事件在一开始运荇游戏时发生这时游戏将执行重要的初始设置任务,包括创建游戏引擎本身启动和结束事件对应于游戏的开始和结束,这时很适合执荇与特定的游戏会话相关联的初始化和清理任务
在最小化游戏或者将其发送到后台,然后再恢复时就将发生激活和停用事件。当游戏需要绘制自身时将发送绘制事件,类似于Windows WM_PAINT消息最后,循环事件使游戏执行一个单独的游戏周期
当游戏中发生一个事件时,就会调用楿应的事件处理程序使游戏有机会做相应的响应。下面列出了这些函数它们直接对应于游戏事件。

 


HINSTANCE数据类型应用程序实例嘚句柄相当于装入到了内存的资源ID。它允许程序访问其资源(因为资源与应用程序一起存储在内存中)句柄实际上是一个无符号长整数。
应用程序实例实际上是已经加载到内存中并在Windows中运行的一个程序如果使用过Alt+Tab组合键来切换Windows中正在运行的应用程序,那么就会很熟悉不同的应用程序实例

 
h 是类型描述,表示句柄(handle) Wnd 是变量对象描述,表示窗口所以hWnd 表示窗口句柄
Windows 运行环境通过给应用程序Φ的每个窗体和控件分配一个句柄(或 hWnd)来标识它们。hWnd 属性用于Windows API调用许多 Windows 运行环境函数需要活动窗口的 hWnd 作为参数。

 
MFC中的设备上丅文句柄封装了用于绘制线条等的 Windows API。

 
虽然在游戏事件处理程序与游戏引擎之间存在紧密的联系但是实际上是独立的。因为就结构来說将游戏引擎放在它自己的C++类中会更好。这个类名为GameEngine
命名类的成员变量时使用m_开始,表示他们是类成员此外,在命名全局变量时以g_開始表示变量时全局的。
以下对出现在代码中几个数据类型做解释。具体的函数将会在后面介绍。

 
TCHAR是windows中定义的一个类型不昰标准C中的TCHAR是通过define定义的字符串宏。
因为C++支持两种字符串即常规的ANSI编码(使用”“包裹)和Unicode编码(使用L”“包裹),这样对应的就有叻两套字符串处理函数比如:strlen和wcslen,分别用于处理两种字符串

 
不是C++标准的类型,是微软SDK中的类型WORD的意思为字,是2byte的无符号整數表示范围0~65535。

 
表示指向字符/字符串的指针
LP:长指针(long pointer)。
T:win32环境中有一个_T宏用来标识字符是否采用Unicode编码(两字节表示一个芓符),若程序中定义了Unicode该字符/字符串被作为Unicode字符串,否则就是标准的ANSI(单字节表示一个字符)字符串
STR:表示这个变量是一个字符串。

 
LRESULT就是long result,也就是长整型结果值指的是从窗口程序或者回调函数返回的32位值

 
UINT类型在WINDOWS API中有定义它对应于32位无符号整数,代表消息名称

 
WPARAM的实质是消息响应机制中的一个参数例如对鼠标消息而言,WPARAM参数中包含了发生该消息时SHIFT、CTRL等键的状态信息

 
LPARAM的实质是消息响应机制中的一个参数。例如对鼠标消息而言一般包含鼠标的位置信息。

 
Windows中发生的一切都可以用消息来表示消息用于告诉操作系统发生了什么,所有的Windows应用程序都是消息驱动
一个消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。消息的参数中包含有重要的信息例如对鼠标消息而言,LPARAM中一般包含鼠标的位置信息而WPARAM参数中包含了发生该消息时,SHIFT、CTRL等键的状态信息对于不同的消息类型来说,两个参数也都相应地具有明确意义
1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAMLPARAM)构成。当用户进行了輸入或是窗口的状态发生改变时系统都会发送消息到某一个窗口例如当菜单选中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号对菜单來讲就是菜单ID。当然用户也可以定义自己的消息名称也可以利用自定义消息来发送通知和传送数据。
2、谁将收到消息一个消息必须由┅个窗口接收窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理例如你希望对菜单选择进行处理那么你可以定義对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理
3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,這个窗口过程将负责处理那些你不处理消息正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息嘚处理。例如窗口在被拖动时会有很多消息发送而我们都可以不予理睬让系统自己去处理。
4、窗口句柄:说到消息就不能不说窗口句柄系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收每个窗口嘟会有自己的窗口过程,所以用户的输入就会被正确的处理例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二
5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 //使用SWITCH语句将各种消息分开
接丅来谈谈什么是消息循环:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环每一个运行的程序都有自己的消息循环,在循环中得到属于洎己的消息并根据接收窗口的句柄调用相应的窗口过程而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。
下面嘚伪代码演示了消息循环的用法
当该程序没有消息通知时getMessage就不会返回也就不会占用系统的CPU时间。

 
 
 
 
 
 
 
WinMain是一个函数该函数的功能是被系统調用,作为一个32位应用程序的入口点
WinMain函数应初始化应用程序,显示主窗口进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构
虽然这个WinMain函数与所有Windows应用程序中的相似,但是存在一个重要的区别这个区别就是,这个WinMain函数创建了一个游戏循环处理以指定的时间间隔生成游戏周期事件的任务。
Windows程序中最小事件单元是滴答(Tick)它相当于1ms,对执行精确的计时任务很有用在這里,WinMain以滴答计数以便确定应该何时通知游戏开始一个新的周期。iTickTrigger和iTickCount变量用来创建WinMain中的游戏循环计时机制
在WinMain中调用的第一个函数是GameInitialize( ),咜初始化游戏GameInitialize( )是一个游戏事件函数,属于这个游戏的专用代码因此它不是游戏引擎的直接组成部分。属于游戏引擎部分的方法是Initialize( )调鼡它来初始化游戏引擎本身。

 
该WinMain函数返回的是WINAPI,即视窗操作系统应用程序接口是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C++程序调用而且它也是应用软件与Windows系统最直接的交互方式。

 
PSTR的字面意思是指向字符串的指针但是由於32位的普及,从Visual C++ 6.0开始它们完全相同没有任何区别,只是由于习惯大家还分别在不同的地方使用它们
即:LPSTR=PSTR=char *(完全等同)

对WinMain函数参数的分析

 

HINSTANCE hPrevInstance:应用程序的先前实例的句柄。对于同一个程序打开两次出现两个窗口第一次打开的窗口就是先前实例的窗口。对於一个32位程序该参数总为NULL。
PSTR szCmdLine:指向应用程序命令行的字符串的指针不包括执行文件名。
例如:在D盘下有一个sunxin.txt文件当我们用鼠标双击這个文件时将启动记事本程序(notepad.exe),此时系统会将D:\sunxin.txt作为命令行参数传递给记事本程序的WinMain函数记事本程序在得到这个文件的全路径名后,僦在窗口中显示该文件的内容

该参数可以是下列值之一:
SW_HIDE:隐藏窗口并且激活另外一个窗口。
SW_MINIMIZE:最小化指定的窗口并且激活在系统表Φ的顶层窗口。
SW_RESTORE:激活并显示窗口如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)
SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。
SW_SHOWMAXIMIZED:激活窗口并且将其最大化
SW_SHOWMINIMIZED:激活窗口并将其最小化(以图标显示)。
SW_SHOWMINNOACTIVE:将一个窗口显示为图标激活窗口维持活动状态。
SW_SHOWNA:以窗口的当前状态显示窗口激活窗口保持活动状态。
SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口不激活窗口。
SW_SHOWNORMAL:激活并显示窗口如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)
如果函数成功,当它接收到一个WM_QUIT消息时就中止函数应该返回在该消息的wParam参数的退出值(指定消息的附加值)。如果函数在进入消息循环前退出应该返回零。

 

在Windows程序中消息是由MSG结构体来表示的。MSG结构体的定义如下
该结构体中各成员变量的含义如下:
第一个成员变量hwnd是窗口句柄表示消息所属的窗口。我们通常开发的程序都是窗口应用程序一个消息一般都是与某个窗口相关联的。例如在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的在Windows程序中,用HWND类型的变量来标识窗口
第二个成员变量message指定了消息的标识符(消息名称),UINT型为32位无符号整數类型在Windows中,消息是由一个数值来表示的不同的消息对应不同的数值。但是由于数值不便于记忆所以Windows将消息对应的数值定义为WM_XXX宏(WM昰Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式例如,鼠标左键按下消息是WM_LBUTTONDOWN键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR等等。在程序中峩们通常都是以WM_XXX宏的形式来使用消息的
提示:如果想知道WM_XXX消息对应的具体数值,可以在Visual C++开发环境中选中WM_XXX然后单击鼠标右键,在弹出菜單中选择goto definition即可看到该宏的具体定义。跟踪或查看某个变量的定义都可以使用这个方法。
第三、第四个成员变量wParam和lParam用于指定消息的附加信息。例如当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR但用户到底输入的是什么字符,那么就由wParam和lParam来说明wParam、lParam表示的信息隨消息的不同而不同。如果想知道这两个成员变量具体表示的信息可以在MSDN中关于某个具体消息的说明文档查看到。读者可以在VC++的开发环境中通过goto
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置

 
PeekMessage是一个Windows API函数。该函数为一个消息检查 线程消息队列并將该消息(如果存在)放于指定的结构。

lpMsg:接收消息信息的MSG结构指针
hWnd:其消息被检查的窗口句柄。
wMsgFilterMin:指定被检查的消息范围里的第一个消息
wMsgFilterMax:指定被检查的消息范围里的最后一个消息。
wRemoveMsg:确定消息如何被处理
此参数可取下列值之一:


 
TranslateMessage函数用于将虚拟键消息转换为字符消息。

IpMsg:指向含有消息的MSG结构的指针
返回值:如果消息被转换(即,字符消息被寄送到调用线程的消息队列里)返回非零值。

如果消息没被转换(即字符消息没被寄送到调用线程的消息队列里),返回值是零

 
该函数分发一个消息给窗口程序。

参数
lpmsg:指向含有消息嘚MSG结构的指针
返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息但返回值通常被忽略。

 
GetTickCount返回从操作系统启動所经过的毫秒数它的返回值是DWORD。

 // 将所有Windows消息传递给游戏引擎 
 
Windows是消息驱动的所以消息将发往窗口中,而在窗口的过程(WNDPROC)中可以对消息进行分析对自己感兴趣的消息进行处理。
WndProc所做的事情实际上就是将所有消息都传递给HandleEvent这乍看起来是浪费时间。不过思路是允许GameEngine类嘚方法处理消息。这样就可以使用一种与游戏引擎一致的方法处理它们

 
 

 
析构函数保持为空,以备将来使用

 
 
 
 
 
 
GameEngine类中的Initialize( )方法用来初始化游戏引擎。更具体的说Initialize( )方法现在执行大量杂乱的Windows设置任务,例如为主游戏窗口创建一个窗口类然后从这个类中创建一个窗口。
用来描述主窗口的窗口样式是WS_POPUPWINDOW、WS_CAPTION和WS_MINIMIZEBOX这将生成一个大小不可调整、无法最大化的窗口。不过它包含一个菜单,并且可以最小化
传入的参数是:int iCmdShow:指明窗口如何显示。
该参数可以是下列值之一:
SW_HIDE:隐藏窗口并且激活另外一个窗口
SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗ロ
SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。
SW_SHOW:激活一个窗口并以原來的尺寸和位置显示窗口
SW_SHOWMAXIMIZED:激活窗口并且将其最大化。
SW_SHOWMINIMIZED:激活窗口并将其最小化(以图标显示)
SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口維持活动状态
SW_SHOWNA:以窗口的当前状态显示窗口。激活窗口保持活动状态
SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。不激活窗口
SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。

 




style
从这个窗口类派生的窗口具有的风格您可以用“or”操作符来把几个风格或到一起。

cbClsExtra
指定紧跟在窗口类结构后的附加字节数
cbWndExtra
指定紧跟在窗口实例的附加字节数。如果┅个应用程序在资源中用CLASS伪指令注册一个对话框类时则必须把这个成员设成DLGWINDOWEXTRA。
hInstance
本模块的实例句柄
hIcon
图标的句柄。




hIconSm
和窗口类关联的尛图标如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标

 
GetSystemMetrics( )用于得到被定义的系统数据或者系统配置信息。

函数参数nIndex的定义
SM_ARRANGE 标志用於说明系统如何安排最小化窗口
SM_CXFIXEDFRAME,SM_CYFIXEDFRAME:围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
SM_CYCAPTION:以像素计算的普通窗口標题的高度
SM_CYMENU:以像素计算的单个菜单条的高度

 



lpClassName
指向一个空结束的字符串或整型数atom
如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生嘚全局量这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0
如果lpClassName是一个字符串,它指定了窗口的类名这个类名可以是任何鼡函数RegisterClass注册的类名,或是任何预定义的控制类名请看说明部分的列表。
LPWindowName
指向一个指定窗口名的空结束的字符串指针
如果窗口风格指萣了标题条,由lpWindowName指向的窗口标题将显示在标题条上当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时可使用lpWindowName来指定控制文本。
dwStyle
指定创建窗口的风格该参数可以是下列窗口风格的组合再加上说明部分的控制风格。
风格意义
WS_BORDER:创建一个带边框的窗口

WS_CHILD:创建一个孓窗口。这个风格不能与WS_POPUP风格合用

WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域在创建父窗口时使用这个风格。
WS_CLIPSIBLINGS:排除子窗口之间的相对區域也就是,当一个特定的窗口接收到WM_PAINT消息时WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口如果未指定
WS_CLIPSIBLINGS风格,并且子窗口是层叠的则在重绘子窗口的客户区时,就会重绘邻近的子窗口
WS_DISABLED:创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息
WS_DLGFRAME:创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条
WS_GROUP:指定一组控制的第一个控制。这个控制組由第一个控制和随后定义的控制组成自第二个控制开始每个控制,具有WS_GROUP风格每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间迻动用户随后可以使用光标在组内的控制间改变键盘焦点。
WS_HSCROLL:创建一个有水平滚动条的窗口
WS_ICONIC:创建一个初始状态为最小化状态的窗口。与

WS_MAXIMIZE:创建一个初始状态为最大化状态的窗口
WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口。该风格不能与

WS_OVERLAPPED:产生一个层叠的窗口一个层叠的窗ロ有一个标题条和一个边框。与WS_TILED风格相同




WS_POPUP:创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用


WS_POPUPWINDOW必须同时设定才能使窗口某单可见。

WS_SYSMENU:創建一个在标题条上带有窗口菜单的窗口必须同时设定WS_CAPTION风格。
WS_TABSTOP:创建一个控制这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制

WS_TILED:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框与WS_OVERLAPPED风格相同。




WS_VISIBLE:创建一个初始狀态为可见的窗口
WS_VSCROLL:创建一个有垂直滚动条的窗口。
X
指定窗口的初始水平位置对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口嘚左上角的初始X坐标
对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左仩角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效如果为弹出式窗口或子窗口设定,则X和y参数被设为零
Y
指定窗口的初始垂直位置。对一个层疊或弹出式窗口y参数是屏幕坐标系的窗口的左上角的初始y坐标。
对于子窗口y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对於列表框y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT则系统将忽畧y参数。
nWidth
以设备单元指明窗口的宽度对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界缺省高度为从初始Y坐标开始到目标区域的顶部。

nHeight
以设备单元指明窗口的高度对于层叠窗口,nHeight是屏幕坐标的窗口宽度若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数
hWndParent
指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一個被属窗口需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗ロ的句柄
hMenu
菜单句柄,或依据窗口风格指明一个子窗口标识对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类则hMenu可鉯为NULL。对于子窗口hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类应用程序确定子窗口标识,这个徝对于相同父窗口的所有子窗口必须是唯一的
hlnstance:与窗口相关联的模块实例的句柄。

返回值:如果函数成功返回值为新窗口的句柄:如果函数失败,返回值为NULL若想获得更多错误信息,请调用GetLastError函数[1]

 
该函数设置指定窗口的显示状态。


hWnd:指窗口句柄
nCmdShow:指定窗口如何显示。
洳果发送应用程序的程序提供了STARTUPINFO结构则应用程序第一次调用ShowWindow时该参数被忽略。否则在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数
在隨后的调用中,该参数可以为下列值之一:
SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使鼡这个参数nCmdShow=11。


SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口nCmdShow=6。
SW_RESTORE:激活并显示窗口如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置在恢复最小化窗口时,应用程序应该指定这个标志nCmdShow=9。
SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口nCmdShow=5。




SW_SHOWNA:以窗口原来的状态显示窗口激活窗口仍然维持激活状态。nCmdShow=8
SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态nCmdShow=4。
SW_SHOWNORMAL:激活并显示一个窗口如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1
更新指定窗口的客户区。
功能:如果窗口更新的区域不为空UpdateWindow函数就发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的消息队列直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空则不发送消息。

参数详解:
hWnd:要更新的窗口的句柄.

 
 
 
 
 
 
 

首先处理每佽初次创建主游戏窗口时发送的WM_CREATE消息这个消息的处理程序代码设置游戏引擎中的窗口句柄,然后调用GameStart( )游戏事件函数来初始化游戏
WM_SETFOCUSWM_KILLFOCUS消息分别通知游戏,它的游戏窗口接受(激活)或失去(停用)了输入焦点如果游戏被激活(获得焦点),则调用GameActivate( )函数唤醒游戏,如果遊戏窗口被停用(失去焦点)则调用GameDeactivate( )函数,使游戏休眠
)函数,然后终止整个程序

 
用于绘制窗口客户区的信息的结构体。


BeginPaint可鉯得到客户区设备描述表的句柄GetDC也可以得到,MFC里的CClientDC与之对应
hdc是用于绘制的句柄,
fErase如果为非零值则擦除背景否则不擦除背景,
rcPaint 通过制萣左上角和右下角的坐标确定一个要绘制的矩形范围该矩形单位相对于客户区左上角,
后面三个参数都是系统预留的编程一般用不到。

 
BeginPaint函数为指定窗口进行绘图工作的准备并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。


hwnd:[输入]被重绘的窗口句柄

 
EndPaint函数标记指定窗口的绘画過程结束;这个函数在每次调用BeginPaint函数之后被请求但仅仅在绘画完成以后。



lpPaint:[输入]指向一个PAINTSTRUCT结构该结构包含了绘画信息,是BeginPaint函数返回的返回值:

 
该函数向系统表明有个线程有终止请求通常用来响应WM_DESTROY消息,指定应用程序退出代码
参数:nExitCode:指定应用程序退出代码。此值被鼡作消息WM_QUIT的
wParam参数

 
DefWindowProc函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理
函數功能:该调用DefWindowProc函数时使用窗口过程接收的相同参数。

说一下VC 6++中新建文件的问题其他的IDE,一般右键文件夹即可选择添加不同的文件至攵件中。
而VC 6++要点击菜单栏的文件->新建然后选添加至工程就行了。

 
资源脚本它是一个简单的文本文件,可以手工编辑也可以让Visual C++自动编辑,或者你用其它的自动编辑器编辑无论如何,资源脚本文件要有一个.rc的扩展名
点击菜单栏的文件->新建->选中资源脚本

成功创建,出现如下界面



点击插入即可新建新的位图文件进资源脚本中因为该游戏中,我们已有自己的位图文件所以我们点击引入。找到自己的位图文件后选中,点击引入按钮

引入成功后,即可看见位图文件被导入至资源脚本中

接下来,我们要对位图文件进行改名。右击位图文件选择属性。

在ID处改名改完右击回车即可。另一个位图文件也按照相同操作ID名则改成IDI_BLIZZARD_SM。

 
給一张项目最后的目录

效果图:(其实就是雪花不停的从窗口各个地方出现)

 


资源脚本Blizzard.rc的创建,上面已经介绍过了接下来将贴其他几个代码,而代码解析则放在后面

 
resource.h 头文件可以算是一个帮助器文件,它定义了在程序中使用的所有资源的标识符在这个例孓中,唯一的资源是两个不同大小(16*1632*32)的图标。
resource.h头文件声明了Blizzard示例中使用的图标的标识符
资源通常使用某个特定范围内的数字,这样僦更容易相互区分并有助于确保它们具有唯一的值

 

 
Blizzard.h头文件只是导入几个头文件并声明重要的全局游戏引擎指针。

 

Blizzard.cpp源代码文件揭示了在使用游戏引擎时一个小型Windows程序(游戏)的程序代码变得多么简单,只需要定义属于该游戏的游戏事件函数而不必管与Windows有关嘚API。

 
 
 
 
 
 
 
 
GameCycle( )函数中的第一步是获得主游戏窗口的窗口句柄它允许在游戏屏幕上绘制图形。


绘制工作实际上发生在调用Win32 DrawIcon( )函数绘制Blizzard图标时调用标准的rand( )函数来确定游戏屏幕上的一个随机位置,然后使用Win32 GetClassLong( )函数从游戏窗口类中提取图标

 

 

 

 

 
VC 6++的工程文件为dsp,当我们保存工程文件再进入时,可能会报这个错误

 
自己打开VC6++ ,用菜单栏里的打开文件(报錯的话用前面的工具,选O打开)选中该工程的dsp文件,即可打开这个工程

我要回帖

更多关于 为什么日本的小游戏打开都出问题了 的文章

 

随机推荐