65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectX 包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (19投票s)

2003 年 7 月 19 日

33分钟阅读

viewsIcon

187751

downloadIcon

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

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);

将 RGB 颜色转换为当前视频模式可用的颜色。对于使用 GDI 的任何函数(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);

在由 left、top、right、bottom 界定的矩形内绘制一个填充的椭圆。Colour 是 RGB 颜色。

返回值:成功时返回零。

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);

绘制饼形填充部分。饼形从由 left、top、right、bottom 界定的椭圆“切出”,并由从边界框中心开始并沿逆时针方向穿过 (x1,y1) 和 (x2,y2) 的线界定。

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);

获取字体 s 的尺寸。size.cx 是宽度,size.cy 是高度。

返回值:成功时返回零。

示例
HFONT font;
SIZE size;

Font=CreateFont(24, 300, 1,1);
GetTextSize(font, "hi world", &size);

UnLoadAllFonts

int UnLoadAllFonts(void);

完全删除使用 CreateFont() 创建的所有字体。

返回值:成功时返回零。失败时返回 GSDX_ERROR_ 代码。

资源

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

int AcquireAllDevices(void);

用于在 I/O 设备丢失时重新获取所有 I/O 设备。通常在 WndProc() 函数的 WM_ACTIVATE 消息中使用。

返回值:成功时返回零。

GetAutoRepeat

DWORD GetAutoRepeat(void);

返回键盘自动重复的当前速率(以毫秒为单位)。

GetAutoRepeatStart

DWORD GetAutoRepeatStart(void);

返回键盘自动重复开始前的当前延迟(以毫秒为单位)。

GetCapState

int GetCapState(void);

返回值:大写锁定关闭时返回零,大写锁定开启时返回非零。

GetEvent

gsdxEvent_t * GetEvent(gsdxEvent_t *pEvent=NULL);

必须频繁调用此函数以确保所有用户 I/O 都得到正确处理。此函数更新 I/O 状态函数使用的内部数据结构。即使您从不使用任何事件而只轮询 I/O 设备,也必须频繁调用此函数(建议最低 60Hz)。

如果 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);

返回鼠标的当前状态,包括 X、Y、滚轮位置、按钮。

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);

在使用任何其他 I/O 函数之前必须调用。在调用 InitIO() 之前必须调用 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 面板。可以加载多个面板,但只有最后一个加载的面板处于活动状态并返回事件。

初始化

CGui::CGui(CgsdxIO *dx);

dx:指向完全初始化的 CgsdxIO 对象的指针。dx 用于所有 I/O 操作,包括绘制 GUI 面板。

返回值: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。

int gui_unload_all_gadgets()

gui_unload_all_gadgets

卸载所有 gadget(面板)并释放它们使用的任何内存。

void gui_load_mouse(char *mouse_name);

gui_load_mouse

加载要用作鼠标指针的位图。

mouse_name:要加载并用作鼠标指针的 bmp 文件的名称。将使用整个位图。

void gui_hide_mouse(void);

gui_hide_mouse

void gui_show_mouse(void);

gui_show_mouse

隐藏或显示鼠标。这些调用可以嵌套。鼠标最初被隐藏。

int gui_do_gadget(gsdxEvent_t *event);

gui_do_gadget

执行与 GUI 面板相关的所有逻辑。不绘制 GUI 面板。接收用户输入并更新 GUI 面板的状态。在 testgui 中可以看到在普通 Windows 程序中使用它的完整示例。最后一个加载的 gadget(面板)是活动的。

event:指向事件的指针,用于返回任何用户 I/O。事件类型将指示它是 GUI 事件还是其他类型的用户 I/O。如果它是 GUI 事件,ID 将指示使用了哪个 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 面板。

void CGui::gui_draw_all_gadgets()

示例
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 是一个用于创建可与 GUI 库一起使用的 GUI 面板的可视化编辑器。可以添加、删除、复制、移动、调整 gadget 的大小,并编辑详细信息。使用 TestGui 在全屏模式下显示和测试您的 GUI 面板。TestGui 源代码也是使用 GUIEdit 创建的 GUI 面板的一个很好的例子。

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

创建 spriteObject。每个 sprite 对象可以包含多个 sprite,如 SpriteEdit 所创建。

dx:指向已初始化的 CgsdxIO 对象的指针。

返回值:void

返回值:void

IncrementSprite

int DrawSprite(int index, int x, int y)

当前精灵集中的每个精灵都带有一个索引,从零开始。此函数绘制一个精灵,使用其当前帧在位置 x, y。X, Y 是精灵左上角的位置(加上在精灵编辑器中进行的调整)。

返回值:无错误时返回零,有错误时返回非零。

AnimateSpriteBank

int IncrementSprite(int sprite_index, int direction);

使精灵的下一帧或上一帧成为当前帧。忽略精灵的 changeMode。对于具有手动 changeMode 的精灵很有用。

sprite_index 要递增的精灵的索引。
direction 设置为大于零以获取下一帧,设置为小于零以获取上一帧。如果超过最大/最小帧,则将帧包装到开头/结尾。

返回值:无错误时返回零,有错误时返回非零。

FreeSpriteBank

int AnimateSpriteBank(void);

如果到了移动时间,则将所有精灵移到下一帧。每个精灵可以有独立的动画速度,此函数将遵循该速度。

返回值:无错误时返回零,有错误时返回非零。

LoadSpriteBank

int FreeSpriteBank(void);

释放银行中所有精灵相关的所有资源;

返回值:无错误时返回零,有错误时返回非零。

GetWidest/Highest

int LoadSpriteBank(char *fname);

int LoadSpriteBank(BYTE *buff);

将 SpriteEdit 创建的精灵库加载到内存中。

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);

返回指向内部 spriteBank 结构的指针。不建议使用此函数!它允许您直接更改 sprite bank 中的任何值。

有关结构的详细信息,请参阅 spritelib.h。

GetCollisionRect

inline DWORD GetDrawMode(void);

获取 drawMode。目前无效。

SetDrawMode

inline void SetDrawMode(DWORD mode);

获取 drawMode。目前无效。

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);

获取当前帧的挂接点的 POINT 结构的指针。

目录 精灵索引;
IndexAttach 要获取当前帧的挂接点的索引。

GetID

inline POINT *GetAttachPoints(int index);

获取由索引指示的精灵的当前帧的所有挂接点。点以 POINT 结构数组的形式返回。

SetID

inline DWORD GetID(int index);

返回由索引指示的精灵的 ID。每个精灵都可以在 SpriteEdit 中设置 ID。

GetDelay

inline void SetID(int index, DWORD id);

设置精灵的 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);

获取当前帧的 dx 或 dy。Dx/Dy 将添加到精灵绘制的位置。这在编辑器中设置,以便在动画时使精灵对齐。

SetChamgeMode

inline DWORD GetChangeMode(int index);

获取精灵的当前 changeMode。将是以下之一

CHANGE_MANUAL:动画关闭
CHANGE_CYCLE:0 到 n,再到 n,...
CHANGE_PONG:0 到 n,n 到 0,0 到 n...

SetChangeMode

inline void SetChangeMode(int index, DWORD mode);

将精灵的 changemode 更改为以下之一

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);

为精灵的当前帧设置 dx/dy。Dx/dy 将添加到绘制位置。

CSprite(CgsdxIO *dx);

inline int GetNumSprites(void);

获取精灵库中的精灵数量。有效索引为 0 到返回的数字减一。

SpriteEdit

精灵是一个可以在屏幕上移动(动画)的小图形。每个精灵由多个帧组成,这些帧也可以进行动画处理。SpriteEdit 允许您加载位图,并选择位图的区域作为精灵的帧。可以从单个位图中创建多个精灵,并且可以将多个位图加载到一个“精灵库”中。

总的来说

  1. 加载位图
  2. 创建新精灵
  3. 为精灵添加帧
  4. 保存精灵

术语表

  • 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 键单击以切换上一张和下一张位图。第二对箭头用于切换上一张和下一张精灵。
    • 左右箭头键也会更改帧。上下箭头键会更改精灵。
© . All rights reserved.