- 3,461
- 2,378
- Версия MoonLoader
- .026-beta
Использую пример от фипа для рендера текста на экране при помощи d3d. Как было сказано Фипом - рисование идет поверх изображения игры, значит программы для записи игры не должны захватывать этот текст. Но они его видят.
Почему так то...
Lua:
local key = require 'vkeys'
local ffi = require 'ffi'
ffi.cdef [[
typedef struct stRECT
{
int left, top, right, bottom;
} RECT;
typedef struct stID3DXFont
{
struct ID3DXFont_vtbl* vtbl;
} ID3DXFont;
struct ID3DXFont_vtbl
{
void* QueryInterface; // STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
void* AddRef; // STDMETHOD_(ULONG, AddRef)(THIS) PURE;
uint32_t (__stdcall * Release)(ID3DXFont* font); // STDMETHOD_(ULONG, Release)(THIS) PURE;
// ID3DXFont
void* GetDevice; // STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE;
void* GetDescA; // STDMETHOD(GetDescA)(THIS_ D3DXFONT_DESCA *pDesc) PURE;
void* GetDescW; // STDMETHOD(GetDescW)(THIS_ D3DXFONT_DESCW *pDesc) PURE;
void* GetTextMetricsA; // STDMETHOD_(BOOL, GetTextMetricsA)(THIS_ TEXTMETRICA *pTextMetrics) PURE;
void* GetTextMetricsW; // STDMETHOD_(BOOL, GetTextMetricsW)(THIS_ TEXTMETRICW *pTextMetrics) PURE;
void* GetDC; // STDMETHOD_(HDC, GetDC)(THIS) PURE;
void* GetGlyphData; // STDMETHOD(GetGlyphData)(THIS_ UINT Glyph, LPDIRECT3DTEXTURE9 *ppTexture, RECT *pBlackBox, POINT *pCellInc) PURE;
void* PreloadCharacters; // STDMETHOD(PreloadCharacters)(THIS_ UINT First, UINT Last) PURE;
void* PreloadGlyphs; // STDMETHOD(PreloadGlyphs)(THIS_ UINT First, UINT Last) PURE;
void* PreloadTextA; // STDMETHOD(PreloadTextA)(THIS_ LPCSTR pString, INT Count) PURE;
void* PreloadTextW; // STDMETHOD(PreloadTextW)(THIS_ LPCWSTR pString, INT Count) PURE;
int (__stdcall * DrawTextA)(ID3DXFont* font, void* pSprite, const char* pString, int Count, RECT* pRect, uint32_t Format, uint32_t Color); // STDMETHOD_(INT, DrawTextA)(THIS_ LPD3DXSPRITE pSprite, LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;
void* DrawTextW; // STDMETHOD_(INT, DrawTextW)(THIS_ LPD3DXSPRITE pSprite, LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;
void (__stdcall * OnLostDevice)(ID3DXFont* font); // STDMETHOD(OnLostDevice)(THIS) PURE;
void (__stdcall * OnResetDevice)(ID3DXFont* font); // STDMETHOD(OnResetDevice)(THIS) PURE;
};
uint32_t D3DXCreateFontA(void* pDevice, int Height, uint32_t Width, uint32_t Weight, uint32_t MipLevels, bool Italic, uint32_t CharSet, uint32_t OutputPrecision, uint32_t Quality, uint32_t PitchAndFamily, const char* pFaceName, ID3DXFont** ppFont);
]]
local d3dx9_43 = ffi.load('d3dx9_43.dll')
function d3dxfont_create(name, height, charset)
charset = charset or 1
local d3ddev = ffi.cast('void*', getD3DDevicePtr())
local pfont = ffi.new('ID3DXFont*[1]', {nil})
if tonumber(d3dx9_43.D3DXCreateFontA(d3ddev, height, 0, 600, 1, false, charset, 0, 4, 0, name, pfont)) < 0 then
return nil
end
return pfont[0]
end
function d3dxfont_draw(font, text, rect, color, format)
local prect = ffi.new('RECT[1]', {{rect[1], rect[2], rect[3], rect[4]}})
return font.vtbl.DrawTextA(font, nil, text, -1, prect, format, color)
end
function onD3DDeviceLost()
if fonts_loaded then
font_arial.vtbl.OnLostDevice(font_arial)
font_wingdings.vtbl.OnLostDevice(font_wingdings)
end
end
function onD3DDeviceReset()
if fonts_loaded then
font_arial.vtbl.OnResetDevice(font_arial)
font_wingdings.vtbl.OnResetDevice(font_wingdings)
end
end
в
function onD3DPresent() -- в этом событии и осуществляются все операции рисования с помощью DirectX
if draw then
x,y = getScreenResolution()
if fonts_loaded then
d3dxfont_draw(font_arial, 'test string', {x/2, y/2, x, y}, 0xFF88DD44, 0) -- выводим обычный текст в левом верхнем углу
end
end
end
function onExitScript()
if fonts_loaded then
font_arial.vtbl.Release(font_arial)
font_wingdings.vtbl.Release(font_wingdings)
end
end
function main()
draw = true
font_arial = d3dxfont_create('Arial', 64)
font_wingdings = d3dxfont_create('Wingdings', 72, 2)
fonts_loaded = true
end