- 1,604
- 1,361
Думаю не многие, кто использовали ImGui, знают, что его можно использовать в качестве рендера примитивов на экране. (А может и знают?...)
Я не буду рассказывать, как подключить ImGui, и т.д. Так что давайте начнём.
На новой версии ImGui будем использовать
Итак, после строчек
После неё идёт
Дальше вы вольны рисовать что угодно, будь это простые линии или градиенты, текст, картинки и т.д.
Ну и закончу на демонстрации WallHack'a для игроков, с использованием ImGui.
Такое можно сотворить и на Lua, если там, конечно, есть что-то подобное.
Использовалась версия ImGui v1.78 WIP.
Я не буду рассказывать, как подключить ImGui, и т.д. Так что давайте начнём.
На новой версии ImGui будем использовать
ImGui::GetBackgroundDrawList();
, на старых версиях, как я знаю, используется ImDrawList* draw_list = new ImDrawList(ImGui::GetDrawListSharedData());
и ImGui::Render(draw_list); // но это не точно
, anyway, я не проверял, возможно на любых версиях всё одинаково и отличаются лишь названия методов.Итак, после строчек
ImGui::NewFrame
и т.п вставляем:
C++:
ImGui::GetBackgroundDrawList()->_ResetForNewFrame(); // На старых версиях название метода - Clear.
// Для чего она нужна?
// Всё просто, она очищает буфферы, благодаря чему у вас не будет дубликатов, например, линий, которые будут появляться каждый кадр.
ImGui::GetBackgroundDrawList()->PushClipRectFullScreen();
эта функция указывает где будет происходить отрисовка, в нашем случае, отрисовка будет на весь экран.Дальше вы вольны рисовать что угодно, будь это простые линии или градиенты, текст, картинки и т.д.
Ну и закончу на демонстрации WallHack'a для игроков, с использованием ImGui.
C++:
for (int i = 0; i < 1000; i++)
{
if (SF->getSAMP()->getPlayers()->iIsListed[i] == 0)
continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i] == NULL)
continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData == NULL)
continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL)
continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL)
continue;
CPed* pPed = GAME->GetPools()->GetPed((DWORD*)SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped);
if (!pPed->IsOnScreen())
continue;
CVector vecHead;
CVector2D vecScreen;
pPed->GetTransformedBonePosition(eBone::BONE_HEAD2, &vecHead);
SF->getGame()->convert3DCoordsToScreen(vecHead.fX, vecHead.fY, vecHead.fZ, &vecScreen.fX, &vecScreen.fY);
ImGui::GetBackgroundDrawList()->AddLine(ImVec2(600, 0), ImVec2(vecScreen.fX, vecScreen.fY), ImGui::GetColorU32(ImGuiCol_Text));
}
Использовалась версия ImGui v1.78 WIP.
Последнее редактирование: