İmgui Menü Camera Problem!

SantaHacks

Silver Üye
Katılım
16 Mar 2020
Mesajlar
95
Beğeniler
7
Menüyü açıyorum setcursorpos yöntemiyle oyunun ortaya sabitleme sorununu düzeltiyorum mouseyi haraket ettirince oyun mouseyi takip ediyor istediğim menü açık iken mouseyi kullandığım zaman oyunda hiç bir tıklama ve haraket algılamasın
 
başım döndü artık o şekil kullanmaktan çözümde bulamıyorum dinput vb denedim yok hiç bir şekilde olmuyor yardımcı olursan tşk ederim
o zaman menü açıkken input tamamen bloklamalısın wndproc içinde menü açıkken WM_MOUSEMOVE WM_LBUTTONDOWN WM_KEYDOWN gibi eventleri direkt return et oyuna gitmesin imguide zaten io.WantCaptureMouse ve io.WantCaptureKeyboard flagleri var bunlar trueysa oyun hiçbir tıklama veya hareket algılamaz
 
o zaman menü açıkken input tamamen bloklamalısın wndproc içinde menü açıkken WM_MOUSEMOVE WM_LBUTTONDOWN WM_KEYDOWN gibi eventleri direkt return et oyuna gitmesin imguide zaten io.WantCaptureMouse ve io.WantCaptureKeyboard flagleri var bunlar trueysa oyun hiçbir tıklama veya hareket algılamaz
denedim hiç alakası yok herhangi bir şey yapmadı
 
o zaman menü açıkken input tamamen bloklamalısın wndproc içinde menü açıkken WM_MOUSEMOVE WM_LBUTTONDOWN WM_KEYDOWN gibi eventleri direkt return et oyuna gitmesin imguide zaten io.WantCaptureMouse ve io.WantCaptureKeyboard flagleri var bunlar trueysa oyun hiçbir tıklama veya hareket algılamaz
eksiklerin var menü açıkken inputun oyuna gitmemesi için sadece imgui flaglerine güvenmek yeterli değil bu flagler sadece imgui’nin o an inputu kullanıp kullanmadığını bildirir ama mesajı otomatik olarak bloklamaz o yüzden işi tamamen wndproc ya da input hook seviyesinde çözmen gerekir wndproc içinde WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_KEYDOWN, WM_KEYUP, WM_INPUT gibi eventleri yakalayıp menü açıkken direkt return etmelisin yani o mesaj oyuna hiç geçmemeli callwindowproc kısmına bile ulaşmamalı imgui tarafındaki io.WantCaptureMouse ve io.WantCaptureKeyboard flagleri menü açıkken true oluyorsa bunları da kontrol olarak kullanabilirsin ama çoğu oyunda flagler gecikmeli güncelleniyor veya backend farklı çalıştığı için tam etki etmez bu yüzden kendi değişkeninle kontrol etmek en sağlamı olur örneğin menü açıkken if(menu_open) durumunda oyuna hiçbir input iletme SetCursorPos kullanmak sadece imleci sabit tutar inputu engellemez bu yüzden hareket ve tıklamayı durdurmak istiyorsan mesaj seviyesinde bloklamak zorundasın böyle yaptığında menü açıkken karakter hareket etmez tıklama işlemez ve oyun input almaz ama imgui tarafında mouse ve klavye normal şekilde çalışır bu yöntem imgui’nin resmi dokümantasyonunda da öneriliyor kaynaklarda io.WantCaptureMouse ve io.WantCaptureKeyboard değerlerinin “underlying application’a input geçirmemek için kullanılması gerektiği” açıkça belirtiliyor yani menü açıkken oyuna input geçmesini engellemenin tek doğru yolu bu tabi oyun win32 üzerinden giriş alıyorsa :perfect:
 
Text atmak yerine kod atmayı deneyebilirsiniz arkadaşlar 👍


Bu şekilde yapabilirsin, daha önce aynı sorunu yaşayan bir arkadaş için atmıştım.

C++:
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (GUI::getIsInit())
    {
        if (msg == WM_KEYDOWN && wParam == 0x11)
            GUI::setDoDraw(!GUI::getDoDraw());
          
        if (GUI::getDoDraw() && ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
            return true;
          
        if (GUI::getDoDraw())
        {
            switch (msg)
            {
                case WM_MOUSEMOVE:
                case WM_MOUSEWHEEL:
                case WM_MOUSEHWHEEL:
                case WM_LBUTTONDOWN:
                case WM_LBUTTONUP:
                case WM_RBUTTONDOWN:
                case WM_RBUTTONUP:
                case WM_MBUTTONDOWN:
                case WM_MBUTTONUP:
                case WM_XBUTTONDOWN:
                case WM_XBUTTONUP:
                    return true;
                  
                case WM_KEYDOWN:
                case WM_KEYUP:
                case WM_CHAR:
                    if (wParam != 0x11)
                        return true;
                    break;
            }
        }
    }
  
    return CallWindowProcA(origin_wndproc, hWnd, msg, wParam, lParam);
}
 
ben de zaten bunu demiştim menü açıkken inputu direkt wndproc seviyesinde kesmek lazım demiştim eline sağlık sen kodla güzel göstermişsin ben o an örnek kod atmadım çünkü direkt mantığı anlatmak istemiştim herkes kendi sourceuna göre uyarlasın diye
 
o zaman bunlarla beraber ekstra yapman gereken şeyler olabilir, çünkü mantığı bu şekilde
anlayan biri varsa
Text atmak yerine kod atmayı deneyebilirsiniz arkadaşlar 👍


Bu şekilde yapabilirsin, daha önce aynı sorunu yaşayan bir arkadaş için atmıştım.

C++:
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (GUI::getIsInit())
    {
        if (msg == WM_KEYDOWN && wParam == 0x11)
            GUI::setDoDraw(!GUI::getDoDraw());
         
        if (GUI::getDoDraw() && ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
            return true;
         
        if (GUI::getDoDraw())
        {
            switch (msg)
            {
                case WM_MOUSEMOVE:
                case WM_MOUSEWHEEL:
                case WM_MOUSEHWHEEL:
                case WM_LBUTTONDOWN:
                case WM_LBUTTONUP:
                case WM_RBUTTONDOWN:
                case WM_RBUTTONUP:
                case WM_MBUTTONDOWN:
                case WM_MBUTTONUP:
                case WM_XBUTTONDOWN:
                case WM_XBUTTONUP:
                    return true;
                 
                case WM_KEYDOWN:
                case WM_KEYUP:
                case WM_CHAR:
                    if (wParam != 0x11)
                        return true;
                    break;
            }
        }
    }
 
    return CallWindowProcA(origin_wndproc, hWnd, msg, wParam, lParam);
}
setcursorpos kullanmama gerek yokmu ozaman
 

Şuanda konuyu görüntüleyen kullanıcılar

Geri
Üst Alt