DirectX 包装器






4.69/5 (19投票s)
2003 年 7 月 19 日
33分钟阅读

187751

4312
DirectX 包装器
目录
安装
将项目解压到您选择的任何目录。主工作区可以使用“DXSmithLib.dsw”工作区打开。该程序至少需要 DirectX 7.0 才能编译和运行。
[编辑注 - 这些程序已成功使用 VS6 在装有 DirectX 9.0 SDK 的 Win2K 机器上编译和运行]
- testwin - 一个简单的演示程序(参见上面的屏幕截图)
- testgui - 测试一个全屏 GUI。这是一个命令行应用程序。运行批处理文件“use_testgui.bat”。mouse_cursor.bmp 必须位于 testgui.exe 所在目录下的名为 data 的子目录中。
- testsprite - 全屏查看一个精灵,看看它在黑色背景上的外观。它主要是使用精灵的简单程序中的一个示例。它只需要一个参数:由 SpriteEdit 创建的精灵库(file.spr)的名称。.SPR 文件及其所需的 .BMP 文件必须位于名为 data 的子目录中,该子目录位于 exe 所在的位置。
- SpriteEdit - 精灵编辑器
- GuiEdit - GUI 编辑器
DXSmith - 概述
DXSmith 是 Microsoft DirectX 图形库的封装。当前版本封装了 DX7 的 Direct Draw 2D 图形、I/O、声音和音乐。不封装或使用任何 3D 功能。DXSmith 封装库提供了一组比 DirectX API 更易于使用和学习的更高级别的函数。DXSmith 使初学者更容易使用 DirectX。DirectX 是一个非常灵活的 API,但其灵活性也使其相当复杂。DXSmith 还提供了工具来创建和绘制动画精灵以及简单的 GUI,而无需使用 MFC 调用。还封装了许多 GDI 调用,以提供更高级别的函数,如线条、圆形、文本和饼图扇区。DXSmith 还提供“资源管理”。将所有数据文件放在子目录中,或将库放在子目录中,资源管理器将加载、卸载和跟踪内存中的资源。
DXSmith 为业余游戏程序员提供了开始使用 DirectX 的所有内容。
DXSmith I/O 库
- I/O 库提供了构成所有其他 DXSmith 实用程序的图形图元、用户输入以及声音和音乐功能。
- 请参阅 testwin 以了解使用 DXSmith 库的示例。TestWin 是一个使用 DXSmith i/o 库的简陋 Windows 程序。它是使用该库的绝佳示例,并且足够简单,可以轻松修改供您自己使用。
- Test1 是一个控制台程序,它测试该库的所有关键部分。
- TestGUI 允许您测试使用 GUIEdit 创建的 GUI 面板。
杂项函数
GetLastError
int GetLastError(CString *errStr);
返回由 CgsdxIO()
函数设置的最后一个错误代码和字符串。如果没有发生错误,则返回 GSDX_OK
。errStr:最后一个错误字符串将被复制到此处。
返回值:最后一个错误代码。
GetINI(版本 1)
DWORD GetINI(LPCSTR pSectionName, LPCSTR pKeyName, LPCSTR \
pDefault, char *pReturnedString, DWORD sizeRetStr, LPCSTR pFileName);
从普通的文本 INI 文件读取文本数据。
pSectionName |
要从中读取数据的节的名称。请勿在节名称中包含“[ ]”。 |
pKeyName |
要从中读取的节内的键的名称。 |
pDefault |
如果找不到节或键,则返回的值。 |
pReturnedString |
用于从 INI 文件将请求的值复制到的字符串。 |
sizeRetStr |
pReturnedString 的长度。如果数据长度超过 sizeRetStr,则将被截断。 |
pFileName |
要从中读取的 INI 文件名。如果文件名包含路径(通过查找反斜杠“\”字符来检测),则不搜索资源路径。如果文件名没有路径,则在当前注册的资源路径中搜索 INI 文件。 |
返回值:复制到 pReturnedString 的字符串的长度。
示例
char str[90]; GetINI("main_section", "one_key", "default_value", str, 90, "foobar.ini");
GetINI(版本 2)
DWORD GetINI(LPCSTR pSectionName, LPCSTR pKeyName, long \
defaultValue, long *pReturnedLong, LPCSTR pFileName);
从普通的文本 INI 文件读取整数数据。尝试将文本转换为整数。
pSectionName |
要从中读取数据的节的名称。请勿在节名称中包含“[ ]”。 |
pKeyName |
要从中读取的节内的键的名称。 |
pDefault |
如果找不到节或键,则返回的值。 |
pReturnedLong |
用于从 INI 文件将请求的值复制到的整数。 |
pFileName |
要从中读取的 INI 文件名。如果文件名包含路径(通过查找反斜杠“\”字符来检测),则不搜索资源路径。如果文件名没有路径,则在当前注册的资源路径中搜索 INI 文件。 |
返回值:复制到 pReturnedLong
的表示整数的字符串的长度。
示例
long val; GetINI("main_section", "one_key", 999, &val, "foobar.ini");
SetINI(版本 1)
int SetINI(LPCSTR pSectionName, LPCSTR pKeyName, LPCSTR pString, LPCSTR pFileName);
将文本数据写入普通的文本 INI 文件。
pSectionName |
要将数据写入的节的名称。请勿在节名称中包含“[ ]”。 |
pKeyName |
要设置的节内的键的名称。 |
pString |
用于将键设置为的值。 |
pFileName |
要写入的 INI 文件名。如果文件名包含路径(通过查找反斜杠“\”字符来检测),则不搜索资源路径。如果文件名没有路径,则在当前注册的资源路径中搜索 INI 文件。 |
返回值:成功时返回非零。
示例
SetINI("main_section", "one_key", "key_value", "foobar.ini");
SetINI(版本 2)
int SetINI(LPCSTR pSectionName, LPCSTR pKeyName, long value, LPCSTR pFileName);
将整数数据写入普通的文本 INI 文件。将整数转换为文本。
pSectionName |
要将数据写入的节的名称。请勿在节名称中包含“[ ]”。 |
pKeyName |
要设置的节内的键的名称。 |
value |
用于将键设置为的值。 |
pFileName |
要写入的 INI 文件名。如果文件名包含路径(通过查找反斜杠“\”字符来检测),则不搜索资源路径。如果文件名没有路径,则在当前注册的资源路径中搜索 INI 文件。 |
返回值:成功时返回非零。
示例
SetINI("main_section", "one_key", 1234, "foobar.ini");
图形
- Blit
- ConvertRGB
- EnableClipping
- EllipseFill
- Flip
- GetGraphicModeInfo
- GetModes
- GetNumGraphicModes
- InitGraphics
- IsMode
- Line
- LoadBitmap
- PieFill
- RectFill
- SetBlitOptions
- SetClipping
- UnLoadAllBitmaps
Blit
int Blit(RECT *pDest, gsdxBitmap_t *pSrc, int transparent=1, HDC hdc=NULL);
将位图绘制到屏幕外缓冲区。调用 Flip()
来显示当前的屏幕外缓冲区。使用 pDest 设置位图的大小和位置。通过更改目标大小,您可以将位图缩放到任何所需的大小。支持剪裁。如果禁用了剪裁,请确保 pDest
不超过屏幕外缓冲区的边界。
pDest | 要进行位块传输的位图的目标位置和大小。请注意,(right - left) 等于宽度,而不是宽度 - 1,并且 (bottom - top) 等于高度。 |
pScr | 源位图,由 LoadBitpmap() 加载。透明--如果为非零,则所有与左上角像素匹配的像素都将是透明的。GDI 模式不支持透明度。 |
hdc | 如果不为 NULL,则使用指定的 hdc 而不是默认的全屏 hdc。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
Blit
int Blit(POINT *pDest, gsdxBitmap_t *src, int transparent=1, HDC hdc=NULL);
将位图绘制到屏幕外缓冲区。调用 Flip()
来显示当前的屏幕外缓冲区。使用 pDest
设置位图的位置。位图以其原始大小显示。如果禁用了剪裁,请确保位图不会超出屏幕外缓冲区的边界。
pDest | 要进行位块传输的位图的目标位置。 |
pScr | 源位图,由 LoadBitpmap() 加载。透明--如果为非零,则所有与左上角像素匹配的像素都将是透明的。GDI 模式不支持透明度。 |
hdc | 如果不为 NULL,则使用指定的 hdc 而不是默认的全屏 hdc。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
ConvertRGB
DWORD CgsdxIO::ConvertRGB(DWORD rgb);
Line()
、Ellipse()
、PieFill()
)不是必需的。应将其用于任何使用颜色参数的 DirectX 函数(Blit()
)。仅对全屏模式有效,并且要求之前已调用 InitGraphics()
。返回值:已转换颜色的 DWORD。
EnableClipping
int EnableClipping(int enable=1);
SetClipping()
。enable:如果为非零,则启用剪裁;如果为零,则禁用剪裁。
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
EllipseFill
int EllipseFill(int left, int top, int right, int bottom, DWORD colour, HDC hdc);
返回值:成功时返回零。
Flip
int Flip(void);
Flip()
来显示它。返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetGraphicModeInfo
inline gsdxMode_t *GetGraphicModeInfo(int index);
GetModes()
。使用 GetNumGraphicModes()
获取检测到的图形模式的数量。index:要获取信息的图形模式的索引。索引从零开始。
typedef struct { int width, height; // size of logical screen int colorBits; // color depth } gsdxMode_t;返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetModes
int GetModes(void);
GetGraphicModeInfo()
和 GetNumGraphicModes()
来获取有关所有支持的图形模式的信息。返回值:成功时返回零。失败时返回 GSDX_ERROR_... 代码。
GetNumGraphicModes
inline int GetNumGraphicModes(void);
GetModes()
。返回值
检测到的视频模式的数量。
InitGraphics
int InitGraphics(int width, int height, int colorDepth, DWORD options);
GetModes()
和 GetGraphicsModeInfo()
来检测支持的宽度、高度和颜色深度。如果选择了 GDI 模式,则不更改当前视频模式,也不准备任何缓冲区。在调用任何其他图形函数之前必须调用此函数。
width | 屏幕宽度(以像素为单位)。 |
height | 屏幕高度(以像素为单位)。 |
colorDepth | 每像素位数。 |
options | 全屏或 GDI。如果是全屏,如果 exe 是控制台应用程序,则还必须使用 GDSX_CONSOLE_MODE 选项。 |
GSDX_FULL_SCREEN | 独占全屏模式,带双缓冲。 |
GSDX_WINDOWED_GDI | 保留当前视频模式。(注意:某些函数将不支持或功能受限)。 |
GSDX_CONSOLE_MODE | 仅与控制台应用程序的全屏选项一起使用。如果控制台应用程序未使用此选项,则应用程序将崩溃。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
IsMode
int IsMode(int width, int height, int colorDepth);
如果指定的视频模式在全屏模式下受支持,则返回非零。
width | 要检查的模式的宽度(以像素为单位)。 |
height | 要检查的模式的高度(以像素为单位)。 |
colorDepth | 要检查的模式的颜色深度(以位为单位)。 |
返回值:如果支持指定的视频模式,则返回非零;如果模式不受支持,则返回零。
Line
int Line(int x0, int y0, int x1, int y1, int width, DWORD colour);
使用指定的宽度和颜色绘制从 (x0, y0) 到 (x1, y1) 的线。请注意,传递给颜色的值取决于所选模式的像素格式。
x0 | 起始 X 位置 |
y0 | 起始 Y 位置 |
x1 | 结束 X 位置 |
y1 | 结束 Y 位置 |
width | 线的宽度(以像素为单位) |
colour | 线的颜色。请注意,相同的颜色值在屏幕上会产生不同的颜色,具体取决于当前视频模式和该模式的像素格式。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
LoadBitmap
gsdxBitmap_t *LoadBitmap(LPCSTR pFileName, RECT *pRect);
从文件加载位图并为其准备好以进行当前选定视频模式的位块传输。必须先调用 InitResource()
。
如果图像已加载,则使用当前加载的图像作为位图。一个图像可以存储多个位图。每个位图将指向包含其区域的主图像区域。
返回的位图在不再需要时必须被“删除”。这只会删除该特定位图(包括指向主源图像的指针),而不会删除内存中的主源图像。调用 UnLoadAllBitmaps()
来卸载所有主源图像。
pFileName | 要加载的位图的名称。如果名称中没有包含路径,则会搜索资源路径和库。目前仅支持 BMP 格式文件,并且必须具有 .bmp 文件扩展名。 |
pRect | 如果为 NULL,则返回的位图是整个源图像。如果 pRect 不为 NULL 且 right 和 bottom 不为零,则它定义了要作为位图返回的源图像区域。这使得可以从单个图像文件中存储多个位图。如果 pREct 不为 NULL,但 right 和 bottom 为零,则 pRect 将被填充为整个源图像的大小。 |
返回值:指向已加载位图的指针。
PieFill
int PieFill(int left, int top, int right, int bottom, \
int x1, int y1, int x2, int y2, DWORD colour,HDC hdc=NULL);
RectFill
int RectFill(RECT *rect, DWORD color, HDC hdc=NULL);
绘制实心填充矩形。请注意,相同的颜色值在屏幕上会产生不同的颜色,具体取决于当前视频模式的像素格式。使用 ConvertRGB()
将 RGB()
值更改为特定于视频模式的值。对于垂直和水平线,此函数可能比 Line()
更快。
rect | 定义要填充的矩形区域。 |
color | 填充矩形的颜色。请注意,相同的颜色值在屏幕上会产生不同的颜色,具体取决于当前视频模式的像素格式。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
SetBlitOptions
int SetBlitOptions(DWORD optionFlags);
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
SetClipping
int SetClipping(RECT *pClipRect, int numRects=1);
定义多个剪裁区域。调用此函数后,使用 EnableClipping()
来启用定义的剪裁区域。所有落在定义区域之外的 Blits()
和 RectFills()
都将被剪裁(不显示)。第二次调用 SetClipping()
将删除之前的剪裁区域并设置新的区域。
pClipRects | RECT 数组,每个 RECT 定义一个剪裁区域。 |
numRects | pClipRects 中 RECT 的数量。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
示例
RECT *clips, r; clips=new RECT[2]; clips[0].right=900; clips[0].left=100; clips[0].top=100; clips[0].bottom=500; clips[1].right=90; clips[1].left=0; clips[1].top=0; clips[1].bottom=90; SetClipping(clips, 2); r.left=100; r.right=900; r.top=100; r.bottom=500; SetClipping(&r); // default 1 rect EnableClipping(); // default ON
UnLoadAllBitmaps
int UnLoadAllBitmaps(void);
返回值:成功时返回零。失败时返回 GSDX_ERROR_... 代码。
文本函数
DrawText
int DrawText(HFONT font, int x, int y, DWORD fore, DWORD back, \
LPCSTR s, SIZE *size=NULL, HDC hdc=NULL);
int DrawText(HFONT font, int x, int y, DWORD fore, DWORD back, \
LPCSTR s, int len, SIZE *size, HDC hdc);
int DrawText(HFONT font, int x, int y, DWORD fore, DWORD back, char \
a, SIZE *size, HDC hdc);
使用指定的字体、颜色和位置在屏幕上绘制文本。
font | 如果为 NULL,则使用默认字体。如果不为 NULL,则它必须是 CreateFont() 创建的字体。 |
x, y | 文本左上角像素在屏幕上的位置。 |
fore | 文本颜色。请注意,相同的颜色值会显示不同的颜色,具体取决于当前视频模式的像素格式。 |
back | 背景颜色。使用 GSDX_TRANSPARENT_TEXT 表示透明背景。 |
s | 如果使用不带“len”的版本,则 s 是一个 null 终止字符串。如果指定了 len,则 s 至少为 len 长。 |
len | 字符串 s 的长度。 |
size | 如果非 NULL,则填充为文本绘制到的区域。 |
hdc | 如果非 NULL,则覆盖默认的全屏 hdc。 |
返回值
成功时返回零。失败时返回 GSDX_ERROR_ 代码。
DeleteFont
int DeleteFont(HFONT font);
CreateFont()
创建的字体。返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
CreateFont
HFONT CreateFont(int height, int weight, int proportional=1, int serif=1);
创建要与 DrawText()
一起使用的字体。
height | 字体的逻辑高度。不完全等于像素。 |
weight | 字体的“粗细”。0 表示“不关心”,将使用默认值。必须在 0 到 1000 之间。 |
proportional | 设置为非零表示比例字体(每个字母宽度不同),或设置为零表示固定宽度字体(每个字母宽度相同)。通常,比例字体看起来更好。 |
serif | 设置为非零表示衬线字体,设置为零表示无衬线字体。衬线字体有字母末端的短横线(例如 Times),无衬线字体则没有这些短横线(例如 Arial)。 |
可以使用这些 MS 定义的值
FW_THIN | 100 |
FW_EXTRALIGHT | 200 |
FW_LIGHT | 300 |
FW_NORMAL | 400 |
FW_MEDIUM | 500 |
FW_SEMIBOLD | 600 |
FW_BOLD | 700 |
FW_EXTRABOLD | 800 |
FW_HEAVY | 900 |
返回值:可与 DrawText()
一起使用的字体的指针。
示例
HFONT font=NULL; font=CreateFont(24, FW_MEDIUM, 0, 1); DrawText(font, 10, 100, RGB(255, 0,0), 0, "Hi World"); DeleteFont(font);
GetTextSize
int GetTextSize(HFONT font, char *s, SIZE *size, HDC hdc=NULL);
返回值:成功时返回零。
示例
HFONT font; SIZE size; Font=CreateFont(24, 300, 1,1); GetTextSize(font, "hi world", &size);
UnLoadAllFonts
int UnLoadAllFonts(void);
CreateFont()
创建的所有字体。返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
资源
- AddResourcePath
- GetFullResourcePath
- GetResource
- InitResource
- LoadResource
- UnLoadAllResources
- UnLoadResource
AddResourcePath
int AddResourcePath(LPCSTR path);
资源加载函数搜索以下目录
exe_path/DATA
CD_DRIVE:/DATA
通过
AddResourcePath()
添加的路径path:要添加的 null 终止路径。
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
示例
AddResourcePath("c:\\data\\maps\\");
GetFullResourcePath
int GetFullResourcePath(LPCSTR pName, char *fullPath);
在资源目录中搜索 pName,如果找到,则将其完整路径返回到 fullPath 中。
pName | 要查找的文件名。请勿包含任何路径,但要包含扩展名。 |
fullPath | 如果找到文件,则将完整路径和文件名复制到 fullPath。请确保 fullPath 足够长,可以容纳最长的合法路径和文件名。 |
返回值
成功时返回零。失败时返回 GSDX_ERROR_ 代码。
示例
char path[MAX_PATH = 1]; GetFullResourcePath("foo.map", path);路径将设置为类似于:c:\data\foo.map
GetResource
void * GetResource(DWORD index);
index:先前加载的资源的索引,由
LoadResource()
返回返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
示例
long index; Mapt_t *map1, *map1_alias; map1=LoadResource("foo.map", &index); map1_alias=GetResource(index);
InitResource
int InitResource(DWORD options);
LoadBitmap()
和 LoadSound()
也需要调用此函数,因为它们使用资源函数。不依赖于 InitGraphics()
。添加默认路径:exe_path\data 和 cd_drive:\data,其中 exe_path 是 exe 运行的路径。cd_drive 是检测到的任何 cd 驱动器的驱动器号。例如
Foo.exe 在 c:\myexe 中运行,该计算机有两个 cd 驱动器 e: 和 f:,并调用
InitResource()
将搜索以下默认路径
C:\myexe\data
E:\data
F:\data
options:未定义,设置为零。
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
LoadResource
void * LoadResource(LPCSTR pName, DWORD *pIndex=NULL, DWORD *pSize=NULL);
将文件加载到内存中。资源路径将用于搜索文件。资源路径中的库也将被搜索。最后一个“良好”的路径或库将首先被搜索 - 如果可能,请始终分批调用 LoadResource()
来加载同一目录中的文件。如果文件已加载,则增加其计数并返回现有指针。
pName | 要加载到内存中的文件名。 |
pIndex | 指向 DOWRD 的指针,用于返回索引。GetResource() 可以使用它来快速获取指向先前加载的资源的指针。使用 GetResource() 比调用 LoadResource() 快得多。 |
pSize | 指向 DWORD 的指针,用于保存加载到内存中的文件的大小(以字节为单位)。 |
返回值:错误时返回 NULL,成功时返回指向已加载文件的指针。调用 GetLastError()
获取详细错误信息。
示例
Map_t *map; DWORD index, size; map=LoadResource("foo.map"); map=LoadResource("foo.map", &index, &size);
UnLoadAllResources
int UnLoadAllResources(void);
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
UnLoadResource
int UnLoadResource(LPCSTR pName);
int UnLoadResource(DWORD index);
递减资源计数,并在计数达到零时将其从内存中卸载。
pName | 先前加载的资源的名称,不带路径。 |
index | 资源索引,如 LoadResource() 所返回 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
声音与音乐
InitSound
int InitSound(DWORD options, WORD bits=8, WORD rate=22050);
初始化声音和音乐。必须先调用 InitSound()
。在调用 InitSound
之前,任何声音或音乐功能都将无效。
options | 未定义,使用零。 |
bits | 数字声音的采样大小。 |
rate | 数字声音的采样率。 |
注意:为了获得最佳性能,所有数字声音都应使用相同的 bits 和 rate 值创建,这些值应在调用 InitSound() 时正确设置。
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
LoadSound
int LoadSound(LPCSTR pName, DWORD *pID);
预加载声音,以便通过 Playsound()
播放。在此之前必须调用 InitResource()
。
pName | 要预加载的 WAV 文件名。将搜索资源路径和库。 |
pID | 声音的 ID 将被复制到 pID,并用于通过 PlaySound() 播放声音。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
PlayMusic
int PlayMusic(LPCSTR pName, int loop=1);
加载并播放 MIDI 歌曲。如果正在播放歌曲,则将在开始下一首之前停止并卸载当前歌曲。
pName | 要播放的 MID 文件名。将搜索资源路径,但库不能用于存储 MIDI 歌曲。如果 pName 为 NULL,则当前歌曲将被停止并卸载。 |
loop | 设置为非零以无限循环。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
PlaySound
int PlaySound(DWORD id, int loop=0, int pan=0, int pan_speed=0);
播放先前加载的声音。
id | 由 LoadSound() 设置的 ID 值。 |
loop | 设置为非零以无限循环。设置为 -1 以停止当前正在播放的声音。停止播放时不会卸载声音。 |
pan | 未实现,设置为零。 |
pan_speed | 未实现,设置为零。 |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
UnLoadAllSounds
int UnLoadAllSounds(void);
UnLoadAllSounds()
之后,必须使用 LoadSound()
重新加载声音,然后才能再次播放。返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
用户 I/O
- AcquireAllDevices
- GetAutoRepeat
- GetAutoRepeatStart
- GetCapState
- GetEvent
- GetIoMode
- GetJoystickInfo
- GetJoystickState
- GetNumberOfJoysticks
- GetNumState
- GetMouseInfo
- GetMouseState
- GetScrollState
- InitIO
- IsKeyDown
- SetAutoRepeat
- SetAutoRepeatStart
- SetIoMode
AcquireAllDevices
int AcquireAllDevices(void);
WndProc()
函数的 WM_ACTIVATE 消息中使用。返回值:成功时返回零。
GetAutoRepeat
DWORD GetAutoRepeat(void);
GetAutoRepeatStart
DWORD GetAutoRepeatStart(void);
GetCapState
int GetCapState(void);
GetEvent
gsdxEvent_t * GetEvent(gsdxEvent_t *pEvent=NULL);
如果 pEvent 为 NULL,则处理用户 I/O,但丢弃最新的事件。每次调用此函数时,都会更新所有状态信息(例如操纵杆和鼠标的 x、y 位置)。必须使用启用了所需事件的选项调用
InitIO()
。如果传入了 gsdxEvent_t 指针,则最旧的事件将被复制到其中。事件
- 键盘:每次按键和释放都是一个事件。
操纵杆
- X、Y、油门:向左/右/上/下移动或返回中心会生成一个事件。
- 油门(Z):每次移动超过总油门范围的 100 分之一都会生成一个事件。
- 按钮:所有按下和释放都会生成一个事件。
- HAT:任何变化都会生成一个事件。
鼠标
- 按钮:每次按下和释放都会生成一个事件。
- X、Y:任何移动都会生成一个事件。
- 滚轮:每次“单击”都会生成一个事件。
请参阅 gsdxEvent_t 的定义以获取事件中返回的数据的详细信息。
pEvent:指向 gsdxEvent_t 的指针,用于保存事件信息。
返回值:如果不存在事件或未传入事件,则返回 NULL。如果事件可用,则返回指向 pEvent 的指针。
GetIoMode
DWORD GetIoMode(void);
返回当前的 I/O 模式。包含以下选项的位掩码
GSDX_IO_WANT_MOUSE_EVENTS |
GSDX_IO_WANT_KEY_EVENTS |
GSDX_IO_WANT_JOYSTICK_EVENTS |
GSDX_IO_KEY_AUTO_REPEAT |
GSDX_IO_WANT_ALL_EVENTS |
GetJoystickInfo
int GetJoystickInfo(gsdxJoystickInfo_t *pJinfo, int index=0);
返回有关检测到的操纵杆的信息。
pJinfo | 指向用于保存所选操纵杆信息的结构的指针。 |
index | 要获取信息的操纵杆的索引号。操纵杆索引从零(0)开始。 |
使用 GetNumberOfJoysticks()
获取最大索引。
// joystick enumeration information typedef struct { int num_buttons; // joy buttons int num_axis; // x, y, throttle, rudder etc... int num_povs; // number of pov devices, eg a 'hat' } gsdxJoystickInfo_t;返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetJoystickState
int GetJoystickState(gsdxJoystickState_t *pState, int index=0);
返回所选操纵杆的当前状态,即当前的 X、Y 油门等值。
pState | 指向用于保存所选操纵杆状态的结构的指针。 |
index | 用于选择操纵杆的索引,索引从零开始。 |
// current joystick state typedef struct { int x, y, z; // z is throttle on MS sidewinder int rx, ry, rz; // three 'rudders' rz is used by MS sidewinder int pov[GSDX_MAX_POV]; // multiple pov's DWORD buttons; // 32 buttons, if a bit is set the button is DOWN } gsdxJoystickState_t;示例
gsdxJoystickState_t joyState; char temp[100], *t1; DWORD mask; GetEvent(NULL); GetJoyStickState(&joyState); // check the first 10 buttons t1=temp; for ( mask=1,i=0; i < 10; i++, mask<<=1 ) { if ( (mask & joyState.buttons) ) *t1='*'; else *t1=' '; t1++; }返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetNumberOfJoysticks
inline int GetNumberOfJoysticks(void);
返回值:检测到的活动操纵杆的数量。
GetNumState
int GetNumState(void);
GetMouseInfo
int GetMouseInfo(gsdxMouseInfo_t *pMinfo);
pMinfo:指向 gsdxMouseInfo_t 的指针,用于保存鼠标信息。
typedef struct { int num_buttons; // left, right, wheel button, other buttons int num_axis; // X Y are 2 axis, wheel mouse adds a third axis. } gsdxMouseInfo_t;返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetMouseState
int GetMouseState(gsdxMouseState_t *pState);
pState:指向用于保存当前鼠标状态的结构的指针。
// current mouse state typedef struct { int x, y, z; // wheel is z, current value for each of these int dx, dy, dz; // wheel is z, change in each value since last call DWORD buttons; // if a bit is set the button is down. int max_x, max_y, max_z; // Max_x and max_y // default to the screen resolution in pixels. } gsdxMouseState_t;返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
GetScrollState
int GetScrollState(void);
InitIO
int InitIO(DWORD options=GSDX_IO_WANT_ALL_EVENTS);
InitGraphics()
。options:控制 GetEvent()
生成的事件类型。使用逻辑 OR 来组合所需的事件。
GSDX_IO_WANT_MOUSE_EVENTS |
GSDX_IO_WANT_KEY_EVENTS |
GSDX_IO_WANT_JOYSTICK_EVENTS |
GSDX_IO_KEY_AUTO_REPEAT |
GSDX_IO_WANT_ALL_EVENTS |
返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。
IsKeyDown
int IsKeyDown(DWORD index);
index:要查询的键的 DIK_ 代码(由 MS include 文件定义)。
返回值:如果键当前未按下,则返回零;如果键当前已按下,则返回非零。
示例
if ( IsKeyDown(DIK_ESCAPE) ) printf("ESC is pressed\n");所有支持的 DIK 代码(并非所有键盘都有这些键)
[编辑注:这是一个很长的列表]
DIK_ESCAPE
DIK_1
DIK_2
DIK_3
DIK_4
DIK_5
DIK_6
DIK_7
DIK_8
DIK_9
DIK_0
DIK_MINUS
DIK_EQUALS
DIK_BACK
DIK_TAB
DIK_Q
DIK_W
DIK_E
DIK_R
DIK_T
DIK_Y
DIK_U
DIK_I
DIK_O
DIK_P
DIK_LBRACKET
DIK_RBRACKET
DIK_RETURN
DIK_LCONTROL
DIK_A
DIK_S
DIK_D
DIK_F
DIK_G
DIK_H
DIK_J
DIK_K
DIK_L
DIK_SEMICOLON
DIK_APOSTROPHE
DIK_GRAVE
DIK_LSHIFT
DIK_BACKSLASH
DIK_Z
DIK_X
DIK_C
DIK_V
DIK_B
DIK_N
DIK_M
DIK_COMMA
DIK_PERIOD
DIK_SLASH
DIK_RSHIFT
DIK_MULTIPLY
DIK_LMENU
DIK_SPACE
DIK_CAPITAL
DIK_F1
DIK_F2
DIK_F3
DIK_F4
DIK_F5
DIK_F6
DIK_F7
DIK_F8
DIK_F9
DIK_F10
DIK_NUMLOCK
DIK_SCROLL
DIK_NUMPAD7
DIK_NUMPAD8
DIK_NUMPAD9
DIK_SUBTRACT
DIK_NUMPAD4
DIK_NUMPAD5
DIK_NUMPAD6
DIK_ADD
DIK_NUMPAD1
DIK_NUMPAD2
DIK_NUMPAD3
DIK_NUMPAD0
DIK_DECIMAL
DIK_OEM_102
DIK_F11
DIK_F12
DIK_F13
DIK_F14
DIK_F15
DIK_KANA
DIK_ABNT_C1
DIK_CONVERT
DIK_NOCONVERT
DIK_YEN
DIK_ABNT_C2
DIK_NUMPADEQUALS
DIK_PREVTRACK
DIK_AT
DIK_COLON
DIK_UNDERLINE
DIK_KANJI
DIK_STOP
DIK_AX
DIK_UNLABELED
DIK_NEXTTRACK
DIK_NUMPADENTER
DIK_RCONTROL
DIK_MUTE
DIK_CALCULATOR
DIK_PLAYPAUSE
DIK_MEDIASTOP
DIK_VOLUMEDOWN
DIK_VOLUMEUP
DIK_WEBHOME
DIK_NUMPADCOMMA
DIK_DIVIDE
DIK_SYSRQ
DIK_RMENU
DIK_PAUSE
DIK_HOME
DIK_UP
DIK_PRIOR
DIK_LEFT
DIK_RIGHT
DIK_END
DIK_DOWN
DIK_NEXT
DIK_INSERT
DIK_DELETE
DIK_LWIN
DIK_RWIN
DIK_APPS
DIK_POWER
DIK_SLEEP
DIK_WAKE
DIK_WEBSEARCH
DIK_WEBFAVORITES
DIK_WEBREFRESH
DIK_WEBSTOP
DIK_WEBFORWARD
DIK_WEBBACK
DIK_MYCOMPUTER
DIK_MAIL
DIK_MEDIASELECT
SetAutoRepeat
void SetAutoRepeat(DWORD rep);
设置键盘自动重复速率(以毫秒为单位)。
SetAutoRepeatStart
void SetAutoRepeatStart(DWORD rep);
SetIoMode
void SetIoMode(DWORD ioMode);
设置 I/O 模式。使用这些值
GSDX_IO_WANT_MOUSE_EVENTS |
GSDX_IO_WANT_KEY_EVENTS |
GSDX_IO_WANT_JOYSTICK_EVENTS |
GSDX_IO_KEY_AUTO_REPEAT |
GSDX_IO_WANT_ALL_EVENTS(包括自动重复) |
示例
DWORD currMode; // turn off keyboard autorepeat currMode=GetIoMode(); currMode&=~ GSDX_IO_KEY_AUTO_REPEAT; SetIoMode(currMode); // and turn it back on currMode=GetIoMode(); currMode|= GSDX_IO_KEY_AUTO_REPEAT; SetIoMode(currMode);
GuiLib
GuiLib 提供用于显示和使用简单的图形用户界面的函数,这些界面适用于游戏而无需使用任何 MFC 或 win32 调用。使用 GUIEdit 创建 GUI 面板。可以加载多个面板,但只有最后一个加载的面板处于活动状态并返回事件。
- 初始化
- gui_load_gadget
- gui_pop_gadget
- gui_unload_gadget
- gui_unload_all_gadgets
- gui_load_mouse
- gui_hide_mouse
- gui_show_mouse
- gui_do_gadget
- gui_draw_gadget
- gui_draw_all_gadgets
初始化
CGui::CGui(CgsdxIO *dx);
返回值:void
示例
if ( dx.InitResource(0) ) return 0; if ( dx.InitGraphics(640, 480, 32, GSDX_FULL_SCREEN, g_hInst, g_hMainWnd) ) return 0; if ( dx.InitSound() ) return 0; if ( dx.InitIO() ) return 0; CGui gui(&dx);
CGui::~CGui();
退出时将卸载当前 GUI 面板。
请参阅 testgui 以了解使用 gui 库的示例。
gui_load_gadget
int gui_load_gadget(char *fname);
int gui_load_gadget(BYTE *buff);
加载一个新的 GUI 面板,并准备使用它。使其成为活动面板(加载到面板列表的尾部)
fname | 要加载的 GUI 面板的名称。dx 资源加载器用于定位文件。 |
buff:指向包含原始 GUI 面板文件的内存缓冲区的指针。 | 返回值:没有错误时返回零。 |
void gui_pop_gadget(void)
gui_pop_gadget
从列表中释放最后一个小部件(面板),并将上一个 gadget 设为当前 gadget(面板)。
void gui_unload_gadget(gui_list_t *gui_list);
gui_unload_gadget
卸载单个面板,释放所有使用的内存。这是一个高级函数 - 通常使用
gui_pop_gadget()
来释放最后一个 gadget。
gui_unload_all_gadgets
卸载所有 gadget(面板)并释放它们使用的任何内存。
gui_load_mouse
加载要用作鼠标指针的位图。
void gui_hide_mouse(void);
gui_hide_mouse
void gui_show_mouse(void);
gui_show_mouse
隐藏或显示鼠标。这些调用可以嵌套。鼠标最初被隐藏。
gui_do_gadget
执行与 GUI 面板相关的所有逻辑。不绘制 GUI 面板。接收用户输入并更新 GUI 面板的状态。在 testgui 中可以看到在普通 Windows 程序中使用它的完整示例。最后一个加载的 gadget(面板)是活动的。
返回值:如果用户生成了任何事件,则返回非零。
void gui_draw_gadget(void);
示例
typedef struct { HFONT font; int frame_count; DWORD last_time, elapsed; int paused; int done; char msg[MSGLEN+1]; CGui *m_pGui; } TestInfo_t; TestInfo_t tt; int DoTestLogic(CgsdxIO *dx) { gsdxEvent_t event; if ( tt.paused ) return tt.done; if ( tt.m_pGui->gui_do_gadget(&event) ) { if ( event.type == GSDX_IO_TYPE_GUI) { switch ( event.event.gui.type ) { case GUI_BUTTON: sprintf(tt.msg, "Button id %d clicked", event.event.gui.id); break; case GUI_RADIO: sprintf(tt.msg, "Radio id %d clicked, active = %d", event.event.gui.id, event.event.gui.parm1); break; case GUI_SLIDER: sprintf(tt.msg, "Slider id %d height = %d", event.event.gui.id, event.event.gui.parm1); break; case GUI_STRING_INPUT: sprintf(tt.msg, "Input id %d", event.event.gui.id); break; case GUI_PLIST: sprintf(tt.msg, "Plist id %d cursor item = %d", event.event.gui.id, event.event.gui.parm1); break; } } if ( dx->IsKeyDown(DIK_ESCAPE) ) tt.done=1; } return tt.done; }
gui_draw_gadget
绘制活动 gadget(面板)。应每帧调用一次,以反映用户交互更新 GUI 面板。
示例
int DoTestDraw(CgsdxIO *dx) { int err=0; char temp[128]; if ( tt.paused ) return 0; dx->RectFill(NULL, 0); // fill screen black tt.m_pGui->gui_draw_gadget(); // draw some text tt.frame_count++; if ( tt.frame_count > 100 ) { tt.elapsed=timeGetTime() - tt.last_time; tt.last_time=timeGetTime(); tt.frame_count=0; } sprintf(temp, "frameRate: %04d", tt.elapsed/10); dx->DrawText(tt.font, 1,1, RGB(0,255,0), 0, temp); dx->DrawText(tt.font, 150,1, RGB(0,255,0), 0, tt.msg); tt.m_pGui->gui_draw_mouse(); dx->Flip(); return err; }
gui_draw_all_gadgets
绘制所有当前加载的 gadget。
GuiEdit
此版本的 GuiEdit 支持列表、按钮、单选按钮、文本和滑块。
注意!对于您创建的 gadget,请使用高于 99 的 ID,以避免与系统创建的 gadget 冲突。
保存、加载 GUI 面板。按预期工作。
菜单
- 菜单
- 文件
- Edit
- 未使用。
- 打开/关闭工具栏。
- 视图
- Gui
- Grid - 设置与网格相关的选项。当网格打开时,gadget 只能在“网格”上移动和调整大小
- 默认值 - 设置创建新 gadget 时使用的默认值。这些不会在程序退出时自动保存。
- 保存默认值 - 保存当前默认值。只能保存一套。
- Tab 顺序 - 打开此项时,将在每个 gadget 的左上角显示其 tab 顺序。按您希望它们通过 tab 键的顺序单击 gadget。如果 gadget 已经按顺序排列,您仍然必须按顺序单击它们。下一个 tab 编号将在视图窗口的左下角显示。再次选择此选项可退出 tab 顺序模式。
- 上下文(右键单击)
- 右键单击 gadget 或主矩形以弹出此菜单。
- 添加 Gadget - 在当前鼠标位置添加一个 gadget。新 gadget 的左上角将位于鼠标位置。从子菜单中选择所需的 gadget。
- 属性 - 将弹出对话框,允许设置鼠标下 gadget 的所有选项。
- 复制 - 复制鼠标下的 gadget。
- 删除 - 删除鼠标下的 gadget。
- Gadgets
- 静态文本,用于在 GUI 面板上放置文本。无法编辑。
- 输入框,允许用户输入文本。如果启用了“密码”选项,则仅显示星号“*”。如果选择了“数字”选项,则只能输入数字和小数点“.”。输入的文本最多可达 255 个字符。输入框支持水平滚动。
- Button - text
- Button - bitmap
- Button - sprite,一个可以单击的按钮,上面显示有前面项之一。
- Slider,一个垂直或水平滑块。
- Radio buttons,一组互斥的按钮。只能有一个处于活动状态。
- Pick-List,显示文本项列表,并允许选择一项或多项。
- General
- 左键单击 gadget 并拖动以移动它。左键单击 gadget 的右下角并拖动以调整其大小。右键单击 gadget 以访问其属性。
- SpriteLib 提供加载和显示 SpriteEdit 创建的精灵的简单函数。精灵是动画的小位图集合,例如行走角色的位图。
SpriteLib
CSprite
- DrawSprite
- IncrementSprite
- AnimateSpriteBank
- FreeSpriteBank
- LoadSpriteBank
- GetWidest/Highest
- SetHDC
- SetSpriteBank
- GetSpriteBank
- GetDrawMode
- GetCollisionRect
- GetCurrentFrame
- GetCurrentFrameNum
- GetNumAttachPoints
- GetNumFrames
- GetAttachPoints
- GetID
- SetID
- GetDelay
- SetDelay
- GetDX/DY
- GetChangeMode
- SetChamgeMode
- SetDX/DY
- GetNumSprites
- CSprite(CgsdxIO *dx);
DrawSprite
创建 spriteObject。每个 sprite 对象可以包含多个 sprite,如 SpriteEdit 所创建。
返回值:void
返回值:void
IncrementSprite
int DrawSprite(int index, int x, int y)
返回值:无错误时返回零,有错误时返回非零。
AnimateSpriteBank
int IncrementSprite(int sprite_index, int direction);
sprite_index | 要递增的精灵的索引。 |
direction | 设置为大于零以获取下一帧,设置为小于零以获取上一帧。如果超过最大/最小帧,则将帧包装到开头/结尾。 |
返回值:无错误时返回零,有错误时返回非零。
FreeSpriteBank
int AnimateSpriteBank(void);
返回值:无错误时返回零,有错误时返回非零。
LoadSpriteBank
int FreeSpriteBank(void);
返回值:无错误时返回零,有错误时返回非零。
GetWidest/Highest
int LoadSpriteBank(char *fname);
int LoadSpriteBank(BYTE *buff);
Fname | 精灵库文件的名称。使用 DX 资源函数,因此需要已调用 InitResources() 。 |
buff:指向包含原始 GUI 面板文件的内存缓冲区的指针。 | 指向包含有效精灵库文件映像的内存的指针。 |
返回值:无错误时返回零,有错误时返回非零。
SetHDC
int GetWidest(int index);
int GetHighest(int index);
返回值:无错误时返回零,有错误时返回非零。
SetSpriteBank
inline void SetHDC(HDC hdc);
GetSpriteBank
inline void SetSpriteBank(spriteBank_t *bank);
GetDrawMode
inline spriteBank_t *GetSpriteBank(void);
有关结构的详细信息,请参阅 spritelib.h。
GetCollisionRect
inline DWORD GetDrawMode(void);
SetDrawMode
inline void SetDrawMode(DWORD mode);
GetCurrentFrame
inline RECT *GetCollisionRect(int index);
GetCurrentFrameNum
inline spriteFrame_t *GetCurrentFrame(int index);
获取指向由索引指示的精灵的当前帧的内部数据的指针。允许更改当前帧的任何值。
有关结构的详细信息,请参阅 spritelib.h。
GetNumAttachPoints
inline int GetCurrentFrameNum(int index);
GetNumFrames
inline int GetNumAttachPoints(int index);
GetAttachPoints
inline int GetNumFrames(int index);
GetID
inline POINT *GetAttachPoints(int index, int indexAttach);
目录 | 精灵索引; |
IndexAttach | 要获取当前帧的挂接点的索引。 |
GetID
inline POINT *GetAttachPoints(int index);
SetID
inline DWORD GetID(int index);
GetDelay
inline void SetID(int index, DWORD id);
SetDelay
inline DWORD GetDelay(int index);
GetDX/DY
inline void SetDelay(int index, DWORD delay);
GetChangeMode
inline int GetDX(int index);
inline int GetDY(int index);
SetChamgeMode
inline DWORD GetChangeMode(int index);
CHANGE_MANUAL:动画关闭
CHANGE_CYCLE:0 到 n,再到 n,...
CHANGE_PONG:0 到 n,n 到 0,0 到 n...
SetChangeMode
inline void SetChangeMode(int index, DWORD mode);
CHANGE_MANUAL:动画关闭
CHANGE_CYCLE:0 到 n,再到 n,...
CHANGE_PONG:0 到 n,n 到 0,0 到 n...
GetNumSprites
inline void SetDX(int index, int dx);
inline void SetDY(int index, int dy);
CSprite(CgsdxIO *dx);
inline int GetNumSprites(void);
SpriteEdit
精灵是一个可以在屏幕上移动(动画)的小图形。每个精灵由多个帧组成,这些帧也可以进行动画处理。SpriteEdit 允许您加载位图,并选择位图的区域作为精灵的帧。可以从单个位图中创建多个精灵,并且可以将多个位图加载到一个“精灵库”中。
总的来说
- 加载位图
- 创建新精灵
- 为精灵添加帧
- 保存精灵
术语表
- Load Rect:环绕精灵一帧的位图的矩形区域。
- Collision Rect:一个矩形,不大于当前精灵帧,指示碰撞检测发生的位置。
- Attach point:帧上的一个点,用作其他动作的参考,例如武器的尖端,子弹将从那里发射。
- Frame:精灵中的一幅图像。
- Sprite:一组可以动画的帧
- Bitmap:包含一个或多个帧艺术作品的图片。
菜单
- 文件
- 保存、加载精灵库。按预期工作。
- 未使用。
- 打开/关闭工具栏。
- 视图
- Gui
- Sprite
- Animate Frames - 切换动画
- Display Load Rect - 切换显示加载矩形轮廓
- Display Collision Rect - 切换显示碰撞矩形轮廓
- Display Attach Points - 切换显示挂接点
- Load Bitmap - 加载新位图,可以从中选择帧
- Add Frame - 在当前帧之后添加新帧
- Add Attach Point - 追加新的挂接点
- Delete Frame - 删除当前帧
- Delete Attach Point - 删除最后一个挂接点
- Properties - 当前精灵和当前帧的属性
- New Sprite - 向此库添加新精灵
- Delete Sprite - 删除当前精灵
- 左键单击 gadget 并拖动以移动它。左键单击 gadget 的右下角并拖动以调整其大小。右键单击 gadget 以访问其属性。
- 左键单击并拖动可见矩形以移动它。按住 SHIFT 键拖动以调整矩形大小。按住 CTRL 键拖动碰撞矩形以调整当前帧的 dx/dy。
- 添加帧时使用当前显示的位图。
- 添加新精灵时,它会创建一个帧,该帧使用当前显示的位图。
- 加载位图不会影响当前精灵或帧。
- 工具栏
- 前两个箭头图标用于切换当前精灵的上一帧和下一帧。按住 shift 键单击以切换上一张和下一张位图。第二对箭头用于切换上一张和下一张精灵。
- 左右箭头键也会更改帧。上下箭头键会更改精灵。