-
Автор темы
- #1
В файле отрисовки вашего меню объявляем переменные :
Определяем:
В самом хуке отрисовки меню добавляем следующий код :
Меню :
Теперь после закрытия меню нам необходимо обнулять переменные, чтобы анимация повторялась каждый раз при открытии меню за это отвечает хук WndProc :
Теперь у вас анимированное меню.
int screenWidth, screenHeight;
LONGLONG LastFrameTime;
float deltaTime1;
int windowWidth = ваше значение;
int windowHeight = ваше значение;
int curWidth = 1;
int curHeight = 1;
int curX = 0;
int curY = 0;
LONGLONG LastFrameTime;
float deltaTime1;
int windowWidth = ваше значение;
int windowHeight = ваше значение;
int curWidth = 1;
int curHeight = 1;
int curX = 0;
int curY = 0;
Определяем:
LONGLONG milliseconds_now()
{
static LARGE_INTEGER s_frequency;
static BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
if (s_use_qpc)
{
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return (1000LL * now.QuadPart) / s_frequency.QuadPart;
}
}
float GetDeltaTime()
{
LONGLONG ms = milliseconds_now();
float ret = ms - LastFrameTime;
LastFrameTime = ms;
return ret;
}
{
static LARGE_INTEGER s_frequency;
static BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
if (s_use_qpc)
{
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return (1000LL * now.QuadPart) / s_frequency.QuadPart;
}
}
float GetDeltaTime()
{
LONGLONG ms = milliseconds_now();
float ret = ms - LastFrameTime;
LastFrameTime = ms;
return ret;
}
int w, h;
I::Engine->GetScreenSize(w, h);
deltaTime1 = GetDeltaTime();
float deltaSize = 2 * deltaTime1; // скорость
if (curWidth < windowWidth)
curWidth += min(windowWidth - curWidth, deltaSize);
else if (curHeight < windowHeight)
curHeight += min(windowHeight - curHeight, deltaSize);
curX = (w / 2) - (curWidth / 2);
curY = (h / 2) - (windowHeight / 2);
I::Engine->GetScreenSize(w, h);
deltaTime1 = GetDeltaTime();
float deltaSize = 2 * deltaTime1; // скорость
if (curWidth < windowWidth)
curWidth += min(windowWidth - curWidth, deltaSize);
else if (curHeight < windowHeight)
curHeight += min(windowHeight - curHeight, deltaSize);
curX = (w / 2) - (curWidth / 2);
curY = (h / 2) - (windowHeight / 2);
ImGui::SetNextWindowSize(ImVec2(curWidth, curHeight));
ImGui::Begin(charenc("Test"));
ImGui::Begin(charenc("Test"));
void OpenMenu()
{
static bool is_down = false;
static bool is_clicked = false;
if (G::PressedKeys[VK_INSERT])
{
is_clicked = false;
is_down = true;
}
else if (!G::PressedKeys[VK_INSERT] && is_down)
{
is_clicked = true;
is_down = false;
}
else
{
is_clicked = false;
is_down = false;
}
if (is_clicked)
{
curWidth = 50;
curHeight = 50;
Settings.Menu.Opened = !Settings.Menu.Opened;
std::string msg = strenc("cl_mouseenable ") + std::to_string(!Settings.Menu.Opened);
I::Engine->ClientCmd_Unrestricted(msg.c_str());
}
}
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall Hooks::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static bool is_down = false;
static bool is_clicked = false;
if (G::PressedKeys[VK_INSERT])
{
is_clicked = false;
is_down = true;
}
else if (!G::PressedKeys[VK_INSERT] && is_down)
{
is_clicked = true;
is_down = false;
}
else
{
is_clicked = false;
is_down = false;
}
if (is_clicked)
{
curWidth = 50;
curHeight = 50;
Settings.Menu.Opened = !Settings.Menu.Opened;
std::string msg = strenc("cl_mouseenable ") + std::to_string(!Settings.Menu.Opened);
I::Engine->ClientCmd_Unrestricted(msg.c_str());
}
}
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall Hooks::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)