Bu düzenleme ile inventory penceresinin ekrandaki son konumu kaydedilir. Oyuncu inventory’yi nereye taşıdıysa, client tekrar açıldığında pencere aynı koordinattan yüklenir.

Burada sadece X ve Y pozisyonlarını kaydediyoruz. Visibility, minimized, height gibi diğer değerlerle uğraşmıyoruz.
1. UserInterface/PythonSystem.cpp dosyasını aç
Aşağıdaki fonksiyonu bul:
void CPythonSystem::SaveInterfaceStatus()
{
...
}
Bununla değiştir:
void CPythonSystem::SaveInterfaceStatus()
{
if (m_poInterfaceHandler)
{
PyCallClassMemberFunc(
m_poInterfaceHandler,
"OnSaveInterfaceStatus",
Py_BuildValue("()")
);
} FILE* File = fopen("interface.cfg", "wb"); if (!File)
{
TraceError("Cannot open interface.cfg");
return;
} fwrite(
m_WindowStatus,
1,
sizeof(TWindowStatus) * WINDOW_MAX_NUM,
File
); fclose(File);
}
Buradaki amaç şu:interface.cfg dosyasına pencere durumlarını yazıyoruz. Eğer m_poInterfaceHandler mevcutsa Python tarafındaki kayıt fonksiyonunu da çağırıyoruz.
2. interfaceModule.py dosyasını aç
Inventory kapatılırken konumunu kaydetmemiz gerekiyor.
Şu kodu bul:
if self.wndInventory:
self.wndInventory.Hide()
self.wndInventory.Destroy()
Bununla değiştir:
if self.wndInventory:
xInventory, yInventory = self.wndInventory.GetGlobalPosition() systemSetting.SaveWindowStatus(
systemSetting.WINDOW_INVENTORY,
False,
True,
xInventory,
yInventory,
0
) self.wndInventory.Hide()
self.wndInventory.Destroy()
Bu kısımda inventory penceresi destroy edilmeden hemen önce mevcut ekran pozisyonu alınıyor ve WINDOW_INVENTORY için kaydediliyor.
3. Inventory oluşturulurken kayıtlı konumu geri yükle
Yine interfaceModule.py içinde şu kısmı bul:
self.wndInventory = uiInventory.InventoryWindow()
self.wndInventory.BindInterfaceClass(self)
Bununla değiştir:
self.wndInventory = uiInventory.InventoryWindow()
self.wndInventory.BindInterfaceClass(self)(_, _, invX, invY, _) = systemSetting.GetWindowStatus(
systemSetting.WINDOW_INVENTORY
)if (
invX > 0 and
invY > 0 and
invX + self.wndInventory.GetWidth() < wndMgr.GetScreenWidth() and
invY + self.wndInventory.GetHeight() < wndMgr.GetScreenHeight()
):
self.wndInventory.SetPosition(invX, invY)
Bu kontrol önemli. Çünkü kayıtlı koordinat ekran dışına taşıyorsa pencereyi oraya basmıyoruz. Mesela oyuncu çözünürlük değiştirdiyse inventory ekran dışında kalabilir. Bu yüzden önce ekran sınırı kontrol ediliyor.
Daha Temiz Kullanım İçin Önerilen Yardımcı Fonksiyon
Aynı sistemi ileride character, skill, messenger, guild gibi başka pencerelere de uygulayacaksan her yere aynı kodu yazmak yerine küçük bir yardımcı fonksiyon kullanmak daha temiz olur.
interfaceModule.py içine uygun bir yere ekleyebilirsin:
def __SaveWindowPosition(self, window, windowType):
if not window:
return x, y = window.GetGlobalPosition() systemSetting.SaveWindowStatus(
windowType,
False,
True,
x,
y,
0
)
Sonra inventory kapatılırken şöyle kullanırsın:
if self.wndInventory:
self.__SaveWindowPosition(
self.wndInventory,
systemSetting.WINDOW_INVENTORY
) self.wndInventory.Hide()
self.wndInventory.Destroy()
Konumu geri yüklemek için de ayrı bir yardımcı fonksiyon yazılabilir:
def __LoadWindowPosition(self, window, windowType):
if not window:
return (_, _, x, y, _) = systemSetting.GetWindowStatus(windowType) if (
x > 0 and
y > 0 and
x + window.GetWidth() < wndMgr.GetScreenWidth() and
y + window.GetHeight() < wndMgr.GetScreenHeight()
):
window.SetPosition(x, y)
Inventory oluşturulduktan sonra kullanımı:
self.wndInventory = uiInventory.InventoryWindow()
self.wndInventory.BindInterfaceClass(self)self.__LoadWindowPosition(
self.wndInventory,
systemSetting.WINDOW_INVENTORY
)
Son olarak açıklayayım
Bu sistemle inventory penceresi kapatılırken pozisyonu kaydedilir, tekrar oluşturulduğunda da aynı yerden açılır. En mantıklı tarafı da sadece X ve Y koordinatlarını kullanması. Gereksiz window state bilgileriyle uğraşmadan, oyuncunun pencere düzeni korunmuş olur.
Paylaş :








