Sıfırdan Gui Yapma - İçine Buton Ekleme - Envantere Sabitleme - Sabitlik

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 59

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
hepinize selamlar. bugün biri dc üzerinden ulaşıp boş gui nasıl yaparım diye sordu. bende internette yok mu diye sordum forumlara baktın mı dedim o da yok dedi. ben de dedim ki o zaman ben açayım olsun. aslında gui oluşturmak basit bir şey çok öyle ahım şahım bir şey değil ama konuyu eğlenceli kılmak için biz bugün örnek olarak hande yener guisi yapacağız. guimizde hande yener resmi olacak. ve butona tıkladığımızda gui bizi youtube de ın en sevdiği hande yener şarkısına götürecek.

bu konu ve içindir <3

(konudaki tüm olay aşağıdaki gibi bir şey yapmak içindir.)



öncelikle bir py dosyası oluşturalım. ben can barana göre yapacağım için herşeyin adını hande yener koydum fakat siz öyle yapmayın.

öncelikle biri uihandeyener diğeride handeyener olmak üzere 2 tane py oluşturdum. (isimler değişebilir ui ile başlayan rootun içine düz olan uiscriptin içine olucak)

daha sonra başladım gerekli modülleri girmeye.

Kod:
import ui import net import mouseModule import player import snd import localeInfo import grp import uiScriptLocale import chat import uiTooltip import item import app class HandeYener(ui.ScriptWindow):     def __init__(self):         ui.ScriptWindow.__init__(self)         self.LoadWindow()              def __del__(self):         ui.ScriptWindow.__del__(self)              def Show(self):         self.SetCenterPosition()         self.SetTop()         self.LoadWindow()                  ui.ScriptWindow.Show(self)          def LoadWindow(self):         # if(self.isLoaded == 1):             # return                  # self.isLoaded = 1                   try:             PythonScriptLoader = ui.PythonScriptLoader()             PythonScriptLoader.LoadScriptFile(self, "UIScript/handeyener.py")         except:             import exception             exception.Abort(HandeYenerWindow.LoadWindow.LoadObject)              try:             GetObject = self.GetChild             self.HandeYenerBoard = GetObject("HandeYenerBoard")             self.HandeYenerBoard.SetCloseEvent(ui.__mem_func__(self.Close))             self.sarkiButton = GetObject("sarkiButton")             self.sarkiButton.SetEvent(ui.__mem_func__(self.ClickSarkiButton))         except:             import exception             exception.Abort(HandeYenerWindow.LoadWindow.BindObject)         # if self.sarkiButton:     def ClickSarkiButton(self):         (x, y)=self.GetGlobalPosition()         x+=10         y+=30         MALL_PAGE_WIDTH = 500         MALL_PAGE_HEIGHT = 480         if app.IsWebPageMode():             app.HideWebPage()         else:             app.ShowWebPage("https://www.youtube.com/watch?v=BFN_84IupVg",                 (x, y, x+MALL_PAGE_WIDTH, y+MALL_PAGE_HEIGHT))     def Destroy(self):         self.ClearDictionary()         self.sarkiButton = None          def Close(self):         self.Hide()     def OnPressEscapeKey(self):         self.Close()         return True

kodların ne işe yaradığını sırayla sizin için sıralayalım. en baştan importlar diğer python dosyalarımıza ve client srcden çektirdiğimiz modüllere ulaşmamızı sağlar.

class HandeYener bizim interfacemodule.py taraflı bel kemiğimizdir. Bu isimle oraya tanıtacağız.

içerisindeki __init__ penceremizi yüklemeye

__del__ ise kapatmaya yarar.

def Show penceremizi göstermeye yarar.

def LoadWindow pencereyi ve içindeki modülleri göstermeye yarar. Mesela içine handeyenerboard koymuşum bu boardımızı oradan çektirecek. Hemen altındaki setcloseevent ise butona tekrar bastığımızda kapanması için.

hemen altındaki sarkibutton bizim ilk butonumuz. bizi basınca yaptırdığımız işleve götürecek. ben can baranla konuştum ve en sevdiği hande yener şarkısını sorup cevap aldım. butona da tıkladığımda oyun içinde bir browser açması için komut verdim.

hemen altındaki clicksarkibutton ise üstte anlattığım komutu verdirmeme yarayan kod.

def Destroy pencereyi kapamamıza yarıyor. olmazsa kapatamayız.

def Close de aynı mantık diyebiliriz fazla derine girmeye gerek yok.

def OnPressEscapeKey ise escye bastığınızda gui kapansın diye başka bir olayı yok.

şimdi dediğinizi duyar gibiyim e bunlar elimizde gui açılır mı ? cevap hayır. çünkü uiscript tarafını yapmadık isterseniz oraya geçelim.
Kod:
import uiScriptLocale window = {     "name" : "HandeYenerWindow",     "style" : ("movable", "float",),     "x" : 0,     "y" : 0,     "width" : 900,     "height" : 700,     "children":     (         {             "name" : "HandeYenerBoard",             "type" : "board_with_titlebar",             "style" : ("attach",),             "x" : 0,             "y" : 0,             "width" : 900,             "height" : 700,             "title" : "Can Baran love Hande Yener",         },         {             "name" : "sarkiButton",             "type" : "button",             "x" : 550,             "y" : 150,             "tooltip_text" : "Tikla Git",             "default_image" : "d:/ymir work/ui/handeyener.tga",             "over_image" : "d:/ymir work/ui/handeyener.tga",             "down_image" : "d:/ymir work/ui/handeyener.tga",         },     ), }

en üstten tekrar başlayalım.

importumuz olmazsa olmaz.

window oyundaki pencerenin içini gösteriyor artık. buraya pencere modüllerini giriyoruz.

x ve y ayarı pencerenin nerede açılacağını ayarlar ekrana göre ben ayarlamadım ayarlamak isteyen ayarlayabilir.

width ve height genişlik ve yükseklik ayarı. guinizin ne kadar büyük olacağını burdan ayarlıyorsunuz.

children açıp bu windowun içinde olacaklardan bahsediyoruz.

handeyenerboard zaten uihandeyener den eklemiştik o yüzden buraya da ekledik. yani kısacası loadwindowdakilerin burada olması şart.

board_with_titlebar ise başlıklı bir board açmak için yani ekstradan titlebar modülü girmeye gerek yok.

width ve height yine genişlik ve yükseklik ayarı.

title ise guinin tepesinde yazacak başlık.

sarkibutton ise butonumuz.

x ve y si ise butonun yerini belirtiyor.

default = butonun normal görünüşü
over = üstüne geldiğindeki görünüşü
down = tıkladığınızdaki görünüşü

ben hepsini aynı yaptım gerek yok fazlalığa

tooltip_text ise mauseniz buton resminin üstüne geldiğinde çıkacak yazı.

peki şimdi hande yenerde bizi görecek mi ? maalesef hayır muhtemelen jakuzisindedir...

şimdi interfacemodule.py mize girip oradan ayar çekiyoruz.

öncelikle roota oluşturduğumuz dosyanın (bende uihandeyener) adını dosyanın başına importluyoruz.

yani import uihandeyener.

sonra interface classı altında __init__ in altında tanımlıyoruz. (açılması için)

self.wndHandeYener = None

sonra def makewindows altına tanımlıyoruz. (pencere oluşturması için)

wndHandeYener = uiHandeYener.HandeYener() (uihandeyener dosyamızın adı hemen yanındaki hande yener bizim pymizin içindeki classımızın adı)

ufak aşağıdaki yere de tanımlıyoruz.

self.wndHandeYener = wndHandeYener

def close ye tanımlıyoruz (kapanması için)

if self.wndHandeYener:
self.wndHandeYener.Destroy()

aşağıya doğru inip del kısımlarına da tanımlıyoruz (kapanması için)

del self.wndHandeYener

def showallwindows a da tanımlıyoruz (quest felan açılınca gizlenen pencereler geri gelsin diye)

self.wndHandeYener.Show()

def hideallwindows a da tanımlıyoruz (quest felan açılınca gizlensin diye)
if self.wndHandeYener:
self.wndHandeYener.Hide()

aşağıya toggle ile başlayan deflerin arasına ekliyoruz
def ToggleHandeYenerWindow(self):
if False == player.IsObserverMode():
if False == self.wndHandeYener.IsShow():
self.wndHandeYener.Show()
self.wndHandeYener.SetTop()
else:
self.wndHandeYener.Close()

(üstteki eklemenin amacı eğer pencere açıksa kapatması için tekrar açılmasın diye)

def __HideWindows a da ekliyoruz (gizlesin diye gerektiğinde)
if self.wndHandeYener:
hideWindows += self.wndHandeYener,

bunları eklediğimizde artık açabilir miyiz ? cevap hayır. çünkü sorunsuz olsa bile henüz bir yere atamadık. yani gui çalışıyor ama açmak için bir buton vb. bir şey olması lazım.

ben envantere ekledim.

uiinventory açtım

class inventorywindow içinde costume buttonun altına ekledim (inventorywindow tarafına tanımlamak için)

self.handeButton = self.GetChild2("handeButton")

sonra clickdssbutton arattım altına ekledim (hande buton gözüküyorsa tıklandığında penceremiz açılsın)
if self.handeButton:
self.handeButton.SetEvent(ui.__mem_func__(self.ClickHandeButton))

def destroy arattım ve altına ekledim

self.handeButton = None

clickdssbutton arattım tekrar ve altına ekledim
def ClickHandeButton(self):
print "click_hande_button"
self.interface.ToggleHandeYenerWindow()

(butona tıkladığımızda penceremizi açıcak)

ve son olarak uiscriptte (veya locale tarafı filesinize göre) inventorywindow.py açtım ve şunu ekledim
{
"name" : "handeButton",
"type" : "button",

"x" : 133,
"y" : 148+15,

"tooltip_text" : uiScriptLocale.TASKBAR_DRAGON_SOUL, (buranın böyle olmasına bakmayın size ne lazımsa onu yazın ben öylesine bıraktım)

"default_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_01.tga",
"over_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_02.tga",
"down_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_03.tga",
},

(bu da butonumuzun yerini belirtiyor ve ismini)

ve sonunda artık her şey hazır butonumuza bastığımızda artık guimiz açılacak.
Metin2 Oyununda Sıfırdan GUI Oluşturma ve Buton Ekleme Rehberi

Giriş
Metin2 özel sunucu geliştirme sürecinde, oyuncuların etkileşimde bulunduğu arayüzlerin (GUI) doğru ve estetik bir şekilde tasarlanması oldukça önemlidir. Bu yazıda, sıfırdan bir GUI nasıl yapılır, içine buton nasıl eklenir ve bu butonu envanter paneline sabitleme konusunu detaylıca ele alacağız. Bu rehber özellikle PyMT2 veya benzeri Python tabanlı GUI kütüphaneleriyle çalışırken uygulanabilir olacaktır.

GUI Nedir ve Neden Önemlidir?
GUI (Graphical User Interface), yani grafiksel kullanıcı arayüzü, oyuncunun doğrudan etkileşimde bulunduğu pencere, buton, menü gibi görsel bileşenleri kapsar. Metin2 özel sunucularında bu yapılar, kullanıcı deneyimini doğrudan etkileyen unsurlardır. Doğru bir GUI tasarımı, hem estetik hem de işlevsel açıdan oyuncunun daha kolay navigasyon yapmasını sağlar.

Sıfırdan GUI Oluşturma
PyMT2 veya UIScript sistemlerinde bir GUI oluşturmak için öncelikle temel bir pencere tanımlamalıyız. Bu pencere genellikle bir sınıf olarak tanımlanır ve 'ui.Window' sınıfından miras alınır. Örneğin:

import ui
import app

class MyGui(ui.Window):
def __init__(self):
ui.Window.__init__(self)
self.__CreateWindow()

def __CreateWindow(self):
self.SetSize(200, 150)
self.SetPosition(app.GetScreenWidth() / 2 - 75, app.GetScreenHeight() / 2 - 50)
self.SetTitle('My Custom GUI')
self.SetTop()
self.Show()


Yukarıdaki kod bloğu, 200x150 boyutlarında, ekranın ortasında konumlandırılmış bir pencere oluşturur. Bu pencereye başlık da eklenmiş olur.

Buton Ekleme
GUI içine bir buton eklemek için 'ui.Button' sınıfını kullanırız. Buton ekleme işlemi genellikle '__CreateWindow' fonksiyonu içinde yapılır:

def __CreateWindow(self):
...
self.myButton = ui.Button()
self.myButton.SetParent(self)
self.myButton.SetPosition(50, 50)
self.myButton.SetText('Tıkla Beni')
self.myButton.SetEvent(lambda: self.OnButtonClick())
self.myButton.Show()


Bu kod, pencerenin içine bir buton ekler ve butona tıklanınca 'OnButtonClick' adlı bir fonksiyon çağrılır.

Butonu Envantere Sabitleme
Oyuncunun GUI'nin her zaman erişilebilir olması için butonu veya tüm GUI'yi envanter penceresine sabitlemek isteyebilirsiniz. Bu işlem genellikle GUI'nin pozisyonunu dinamik hale getirerek yapılır. Örneğin butonun pozisyonunu envanterin belirli bir noktasına göre ayarlayabilirsiniz:

def SetToInventory(self):
inv_window = uiInventory.InventoryWindow() # varsayılan envanter penceresi
inv_x, inv_y = inv_window.GetGlobalPosition()
self.SetPosition(inv_x + 200, inv_y + 100) # envanterin sağına hizalama


Bu yöntemle buton, envanter penceresi hareket ettikçe ona göre konumlanır. Ancak bu dinamik konumlandırma için bazı oyun döngüsü güncellemeleri gerekir.

Sabitlik ve Kullanıcı Deneyimi
GUI'nin sabit kalması demek, oyuncunun arayüzü her açtığında aynı yerde görünmesidir. Bu durum kullanıcıyı rahatlatabilir ancak bazı durumlarda esneklik istenebilir. Sabitlik için GUI'nin pozisyonu her zaman aynı koordinatlarla ayarlanmalıdır. Bunun için ayar dosyaları (örneğin XML, JSON gibi) kullanılabilir. Bu sayede kullanıcı kendi tercih ettiği konuma sabitleyebilir.

Sonuç
Metin2 özel sunucularında sıfırdan GUI oluşturma, buton ekleme ve bunları envantere sabitleme işlemleri, kullanıcı deneyimini artırmak için kritik öneme sahiptir. Bu rehber ile başlangıç seviyesinde bile olan geliştiriciler, kendi özelleştirilmiş GUI sistemlerini kolayca oluşturabilirler. Daha fazla bilgi ve destek için Metin2Lobby forumlarına göz atabilirsiniz.


Creating a Custom GUI from Scratch in Metin2 - Adding Buttons - Pinning to Inventory - Stability

Introduction
In the process of developing custom Metin2 servers, correctly and aesthetically designing user interfaces (GUIs) that players interact with is crucial. In this article, we will detail how to create a GUI from scratch, add buttons inside it, and pin these buttons to the inventory panel. This guide can be applied when working with Python-based GUI libraries such as PyMT2 or UIScript systems.

What is GUI and Why is it Important?
GUI (Graphical User Interface) encompasses visual components like windows, buttons, and menus with which players directly interact. In Metin2 custom servers, these elements significantly impact the user experience. Properly designed GUIs allow players to navigate more easily, both visually and functionally.

Creating a GUI from Scratch
To create a GUI in PyMT2 or UIScript systems, we first need to define a basic window. This window is typically defined as a class inheriting from 'ui.Window'. For example:

import ui
import app

class MyGui(ui.Window):
def __init__(self):
ui.Window.__init__(self)
self.__CreateWindow()

def __CreateWindow(self):
self.SetSize(200, 150)
self.SetPosition(app.GetScreenWidth() / 2 - 75, app.GetScreenHeight() / 2 - 50)
self.SetTitle('My Custom GUI')
self.SetTop()
self.Show()


The above code creates a 200x150 window positioned at the center of the screen, with a title added.

Adding a Button
To add a button inside the GUI, we use the 'ui.Button' class. The button addition is usually done within the '__CreateWindow' function:

def __CreateWindow(self):
...
self.myButton = ui.Button()
self.myButton.SetParent(self)
self.myButton.SetPosition(50, 50)
self.myButton.SetText('Click Me')
self.myButton.SetEvent(lambda: self.OnButtonClick())
self.myButton.Show()


This code adds a button to the window and triggers the 'OnButtonClick' function when clicked.

Pinning the Button to Inventory
To ensure the GUI is always accessible, you may want to pin the button or the entire GUI to the inventory window. This is typically achieved by dynamically setting the GUI's position. For instance, aligning the button relative to a specific point of the inventory window:

def SetToInventory(self):
inv_window = uiInventory.InventoryWindow() # default inventory window
inv_x, inv_y = inv_window.GetGlobalPosition()
self.SetPosition(inv_x + 200, inv_y + 100) # aligning to the right of the inventory


With this method, the button will reposition itself according to the inventory window’s movement. However, dynamic positioning may require updates during the game loop.

Stability and User Experience
Making the GUI static means it appears in the same place every time the player opens it. This can comfort users, though flexibility might sometimes be desired. To ensure stability, the GUI's position should always be set to the same coordinates. Configuration files (e.g., XML, JSON) can be used for this purpose, allowing users to pin it to their preferred location.

Conclusion
Creating GUIs from scratch, adding buttons, and pinning them to the inventory in Metin2 private servers are critical steps in enhancing user experience. With this guide, even beginners can easily build their own custom GUI systems. For more information and support, visit the Metin2Lobby forums.​
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Geri
Üst Alt