Guida [Mini-Guida] Creare nuova finestra che si apre alla pressione di un tasto (es. tasto: K)

»SAFE

Utente Emerald
10 Febbraio 2013
566
58
206
445
Ultima modifica:
Salve Inforge.
In questa mini-guida vi spiegherò come creare una nuova finestra, che in questo caso conterrà un immagine diversa per ogni mappa in cui ci si trova, e che verrà aperta alla pressione del tasto K. Poi ovviamente voi potrete inserire ciò che volete dentro la finestra, e potete scegliere di aprirla con il tasto che volete.
Parto con il dire che questa guida serve a prendere spunto (per chi ancora non sa muoversi tanto bene con Python, e con la modifica degli script del client), e ad avere una base su qualche paio di funzioni principali utilizzate dal client di Metin2 per creare nuove finestre.
Bene, detto ciò, possiamo inziare.


Prima di tutto scompattiamo l'archivio `root`, e creiamo un nuovo file al suo interno, che nel nostro esempio chiameremo `uibanner.py`. Al suo interno inseriamo questo codice:
Python:
import ui


class BannerWindow(ui.BoardWithTitleBar):
    def __init__(self):
        # Per creare la finestra deve inizializzare (dal file ui.py) la classe 'BoardWithTitleBar', ed applicarla a questa classe (self)
        ui.BoardWithTitleBar.__init__(self)
        # Richiama la funzione per configurare la finestra e creare gli elementi al suo interno
        self.LoadBoard()

    def __del__(self):
        ui.BoardWithTitleBar.__del__(self)

    def Destroy(self):
        self.Hide()

    def LoadBoard(self):
        self.SetSize(510, 260)
        self.Show()
        self.AddFlag("movable")
        self.AddFlag("float")
        self.SetTitleName("Server Name  -  Pubblicita")
        self.SetCenterPosition(0, -100)
        self.SetCloseEvent(self.Close)
  
        self.wndText = ui.TextLine()
        self.wndText.SetParent(self)
        # 'self.GetWidth() / 2' equivale a 'larghezza_finestra / 2' - cosi facendo sposta l'elemento Testo al centro della finestra
        self.wndText.SetPosition(self.GetWidth() / 2, 35)
        # SetHorizontalAlignCenter imposta il testo allineato al centro
        self.wndText.SetHorizontalAlignCenter()
        self.wndText.SetFontName("Tahoma Bold:15")
        self.SetText("")
        self.wndText.Show()
  
        # wndImage è il contenitore dell'immagine. Quindi l'immagine andrà caricata al suo interno.
        self.wndImage = ui.ImageBox()
        self.wndImage.SetParent(self)
        self.wndImage.SetPosition(10, 60)
        self.wndImage.SetSize(self.GetWidth(), self.GetHeight() - 35)

    # Carica l'immagine all'interno del proprio contenitore
    def _LoadImage(self, img):
        self.wndImage.LoadImage(img)
        self.wndImage.Show()

    # Imposta il testo all'interno della finestra
    def SetText(self, txt):
        self.wndText.SetText(txt)

    def Open(self):
        self.Show()

    def Close(self):
        self.Destroy()

    # Se premi ESC chiude la finestra con questa funzione
    def OnPressEscapeKey(self):
        self.Destroy()

La classe `BannerWindow` contiene la nostra nuova finestra, oltre questo il codice è abbastanza commentato, in teoria si dovrebbe capire quasi tutto. Quindi andiamo avanti.
Una volta salvato il file all'interno dell'archivio root, apriamo `interfacemodule.py`. All'interno di questo file dobbiamo semplicemente creare una nuova funzione, che restituirà il nome della mappa in cui ci si trova come stringa. Quindi cerchiamo:

Python:
    def SetMapName(self, mapName):
        self.wndMiniMap.SetMapName(mapName)

E ci aggiungiamo sotto la nuova funzione:
Python:
    def GetMapName(self):
        return self.wndMiniMap.mapName


Adesso apriamo il file `game.py`. All'inizio dopo tutti gli import degli altri file, inseriamo il codice per importare il nostro nuovo file `uibanner`:
Python:
import uiBanner

Poco più giù, all'interno della classe `GameWindow` troviamo la funzione principale, che inizializza la classe, di nome `__init__`. Al suo interno, prima di tutto il resto, creiamo una nuova variabile che conterrà la classe `BannerWindow`:
Python:
        self.wndBanner = uiBanner.BannerWindow()
        self.wndBanner.Hide()


Il risultato deve essere questo:

Screenshot_2.png



Fatto ciò, cerchiamo questo codice (che sarebbe quello che, alla pressione del tasto M, richiama la funzione che apre la minimappa):
Python:
        onPressKeyDict[app.DIK_M]            = lambda : self.interface.PressMKey()

Subito sotto questa riga, inseriamo il codice che, alla pressione del tasto K, richiama la funzione che apre la nostra nuova finestra:
Python:
        onClickKeyDict[app.DIK_K] = lambda: self.OpenBannerWindow()


Adesso possiamo creare la funzione che apre la nostra finestra:
Python:
#-----
# BANNER WINDOW
    def OpenBannerWindow(self):
        # Con questa funzione assegni all'elemento Testo 'wndText' il nome della mappa attuale (ad es.: metin2_map_c1)
        # Così puoi controllare il nome della mappa in cui ti trovi.
        self.wndBanner.SetText(self.interface.GetMapName())
  
        if self.interface.GetMapName() == "metin2_map_c1":        # Se ti trovi nel villo 1 Blu
            # Con questa funzione carichi l'immagine
            self.wndBanner._LoadImage("d:/ymir work/ui/game/banners/banner_c1.tga")
        elif self.interface.GetMapName() == "metin2_map_a1":    # Se ti trovi nel villo 1 Rosso
            self.wndBanner._LoadImage("d:/ymir work/ui/game/banners/banner_a1.tga")
        # E vai avanti così per tutte le mappe che vuoi carichino un immagine diversa.
        # Dopodiche aggiungi il codice che controlla tutti gli altri casi
        else:
            self.wndBanner._LoadImage("d:/ymir work/ui/game/banners/banner_base.tga")
  
        if self.wndBanner.IsShow():
            self.wndBanner.Close()
        else:
            self.wndBanner.Open()
#-----


I nomi delle mappe potete trovarli nel file `localeinfo.py` all'interno della lista di nome `MINIMAP_ZONE_NAME_DICT`.
Ora abbiamo finito, finalmente possiamo vedere il risultato, che sarà questo:


Banner's Window.png



Le immagini che ho utilizzato sono queste, che comunque potete trovare anche nell'archivio, ma se non avete voglia di scaricarlo ve le metto anche qui nella discussione.



Link download dell'archivio con le immagini e i file Python: Banner's Window




`banner_c1.tga`

banner_c1.png


`banner_a1.tga`

banner_a1.png


`banner_base.tga`

banner_base.png