Interface (WoW - L'Atelier de Gnomeregan)

[wiki]KgPanels, Le Jol-wiki!

Répondre
Partager Rechercher
Ce message est en mode wiki. Tous les comptes de plus de 30 jours avec plus de 30 messages peuvent le modifier.
Voici un tutoriel pour KgPanels. Il se décompose en quelques explications sur son fonctionnement, ainsi, qu'en des exemples de ses possibilités. Vous pourrez y trouver à la fin quelques scripts pour profiter au maximum de cet addon.

Présentation


exempleglob.jpg
puis avec kgpanels:
exempleglob2.jpg

KgPanels est un addon d' "Artworks" dont un des principaux attraits repose sur la personnalisation d'interface. On désigne KgPanels comme étant le successeur de Eepanels (ou DiscordArt).
La grande force de cet addon est de permettre de générer des panneaux (=> frames, panels) statiques, dynamiques ou actifs. Par exemple: remplissage esthétique, support de frames dynamiques ou boutons, etc...

Voilà pourquoi cet addon s'adresse à un très large public, qui peut aisément y trouver son compte .


Vous pourrez trouver d'autres informations sur WoWAce ou CurseForge (lien vers le forum) qui partage la même base de données.


Une bonne installation


Télécharger KGpanels c'est bien, mais ça ne suffit pas! En effet, si vous ne lui donnez pas d'outils, bah, il ne vous sera pas d'une grande utilité. C'est pourquoi il vous sera nécessaire de télécharger des packs de textures et bordures (et polices) et/ou d'en générer grâce à des logiciels.

Le téléchargement





L'importation des fichiers


le Prêt à l'emploi: Quelques packs.



  • Une priorité: SharedMedia grâce auquel, des textures, des bordures, des barres et des polices peuvent être partagées entre les différents addons.
    Sur Curse
  • VivienskgPanelsCollection contient pas mal de choix et fait partie des plus populaires.
  • GiganticTexturePack qui contient quelques images incontournables (Dont motifs Diablo).



Le "sur-mesure" des textures et des bordures.


Les packs tout fait, c'est bien pratique, mais tellement frustrant! Certaines textures nous plaisent mais feront peut-être tâche dans notre projet. Certaines ont l'air très bien, puis on se rend compte qu'elles ont des défauts. Une majorité des images ne sont pas forcément exploitables. Manque d'harmonie, etc...

C'est pourquoi, très vite, on peut être tenté de faire ses propres textures, et ainsi, de mieux profiter de notre personnalisation d'UI.

Là, je vous invite à consulter les règles de bases pour générer des images ou des textures dans ce wiki à la partie Modifications des images.


N'oubliez pas que si votre import de texture ne fonctionne pas, il faut bien vérifier:



  • que vous n'êtes pas en train d'enregistrer une texture "background" dans "bordure" (et vice-versa)
  • que votre image a bien été enregistrée en .tga
  • que votre image est bien strictement aux dimensions basées sur la suite logique des multiples de 2. (Inutile de faire plus large que 512 pixels, je vous laisse deviner pourquoi )
  • ou que votre bordure est bien découpée dans une image de 128x16 et que les zones "vides" sont bien transparentes.
  • que votre chemin correspond bien à votre image en respectant la racine à partir d'interface avec les séparateurs: "\\" entre les liens.
    ex: \\Interface\\AddOns\\Textures\\bg_homemade\\[nom-de-votre-image-avec-ou-sans-son-extension] (1)
  • que votre image existe .



(1): Dans cet exemple, j'ai fabriqué un dossier dans Interface nommé "Textures" qui comprend un dossier nommé "bg_homemade" pour y stocker mes travaux de textures. Votre dossier doit impérativement rester en aval de la racine "World of Warcraft" ce qui rend superflue la précision dans vos chemins.


Un retour de pause: Importation d'Eepanels dans KgPanels?


En reprenant le flambeau, kgPanels a prévu que les utilisateurs de Eepanels puissent transférer leurs travaux dans KgPanels. Si quelqu'un a eu à le faire, je l'invite à compléter cette partie.

Utiliser KGPanels pour décorer son UI


Pour de la simple deco, techniquement, utiliser KgPanels n'a rien de compliqué une fois qu'on sait importer un fichier en jeu (cf quelques bases)

Cependant même pour de la simple décoration, il n'est pas inutile de comprendre le fonctionnement des couches, ainsi que la gestion des positionnements.


Régler l'ancrage d'une texture, et lui attribuer un "Parent".


Un élément hérite des caractéristiques de son parent et est généralement attaché à celui-ci.

Pour commencer, tentons de comprendre comment se comporte le positionnement d'un panneau.

positionnementpanels.jpg

La première chose à noter, est qu'il est difficile de se fier à l'unité en pixels d'une image dans le jeu. En effet, avec une résolution 1680x1050, vous pouvez par exemple ne disposer que d'une largeur de panneau de ~1365 sur une hauteur de ~854. La raison, je pense qu'elle vient de l'échelle de l'interface que vous pouvez maintenant modifier dans Video->Avancé->Echelle d'Interface dans le Menu en jeu.

L'image ci-dessus nous montre différents types de positionnement sur notre écran. Pourtant je vais peut-être vous surprendre, chacun de ces 8 panneaux possèdent exactement les mêmes coordonnées, c'est à dire: x=0 et y=0.

Ça vous épate, je sais !



La raison à cela est que chacun de ces 8 panneaux se place en fonction d'une ancre et d'un attachement qui lui est propre. La déclaration du "Parent" et de "l'attache" se fait dans le menu général de votre panneau courant (en bas).

La position attribuée par rapport au PARENT est en fait l'ancre du panneau. C'est ce qui marque la différence par exemple entre (5) dont l'ancre est en son centre, et (6) dont l'ancre est son coin "Haut-Gauche". Autrement-dit, c'est le point d'union entre le panneau et son Parent.

La position attribuée par l' ATTACHE est cette fois-ci l'ancre du parent de ce panneau. Si nous avions demandé à (6) de s'attacher au "Haut-Gauche" de son parent (UIParent), celui-ci prendrait exactement la même place que (1). A l'inverse, si nous l'avions attaché au Bas-Droite, il disparaîtrait au delà des limites de notre écran en son coin inférieur droit.

Bref, "Parent" est l'ancre de l'enfant qui dépend de l'ancre de son parent désigné par "Attache". Les coordonnées correspondent donc à l'écart entre ces deux points.

Voyons maintenant pourquoi il était important de comprendre la logique qui se cache derrière le positionnement en fonction du Parent et de l'Attache:


positionnementpanels2.jpg
Une astuce consiste à désigner un élément majeur pour chacune de ces zones qui pourra devenir le centre d'attache des autres éléments de sa zone. Par exemple, si on souhaite décorer sa fenêtre de discussion, on désigne pour parent à notre panneau de décoration la fenêtre de chat, et on lui attribue cette même fenêtre pour attache.
=====>: Le panneau se déplacera avec la fenêtre de discussion si on la bouge. Si on cache la fenêtre de discussion, le panneau sera lui aussi caché, et de façon générale, héritera des caractéristiques de son parent.

Par contre, si on veut placer un panneau qui n'a pas de lien avec cette fenêtre de discussion, par exemple, une frame qui décore des boutons , placée juste au dessus de celle-ci, alors, on ne lui attribuera que l'attache, et son parent peut ainsi rester UIParent.
=====>: Le panneau se déplacera avec la fenêtre de discussion, mais n'héritera pas de ses caractéristiques.
Grâce à cet effort dans l'ancrage de nos panneaux, en plus de nous assurer une sureté, nous pouvons moduler notre interface à tout moment en réduisant considérablement les manipulations superflues.


Dans cette image, il faut distinguer plusieurs zones.


  • La première est la zone centrale (verte encadrée) qui représente le centre d'attention dans jeu. Les panneaux qui peuvent s'y ancrer sont donc en principe, uniquement des panneaux ponctuels ou dont la fonctionnalité justifie qu'ils nuisent au champ de vision.
  • Les quatre cotés haut, bas, gauche, droite sont généralement les espaces consacrés aux fenêtres de bossmods, de sorts ou d'outils divers apportant des informations générales (captures de drapeaux, etc..).
  • Les quatre angles (parties plus sombres avec dégradés) qui marquent les quatre-quarts de notre Interface (bleu, orange, jaune et violette) sont idéalement les attaches de différents éléments de l'interface que l'attention peut délaisser momentanément tels que les boussoles, maps, zones de discussion, buffs et voire debuffs...


Il est essentiel de placer chacun de nos éléments d'interface de façon logique selon ces différentes zones afin entre autres, que notre UI puisse supporter une modification de résolution (Changement de matériel informatique, passage en mode fenêtré, modification d'échelle de l'interface, etc...). Du moins, de réduire au maximum les manipulations dans un cas de ce type.

Il faut donc impérativement commencer ses travaux en déterminant quel élément va dans quelle zone, et attribuer en conséquence les Parent et Attache de ceux-ci.


ANNEXE: Scripts en rapport avec le positionnement.

GESTION D'ATTACHE ET DE PARENTE PAR UN PANNEAU
ProcédureObjet:fonctionarguments
FormeFrame-à-déplacer:SetPoint(point, relativeFrame, relativePoint et/ou ofsx, ofsy)
Exemple1MinimapZoneTextButton:SetPoint( "TOPRIGHT", Minimap, 0, -20 )
Exemple2MainMenuBar:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", 0, 0)


Les Couches

Textures et Bordures

Du Texte




Utiliser des scripts dans KgPanels


Sans doute la plus belle fonctionnalité de cet addon, puisque il offre la possibilité à son utilisateur d'interagir pleinement avec son UI, et ce, sans pour autant exiger de grandes connaissances en scripts.

Grâce à cette partie, on peut générer des boutons, on peut forcer un panneau à n'apparaître que dans le cas du chargement d'un addon ou d'une fenêtre précise, on peut "dynamiser" des éléments, interagir avec d'autres éléments et même, donner des ordres à ces derniers. On aussi, quand on sait maîtriser un peu le lua, construire des modules tels que des UnitFrames, des kikimeters, etc...


OnLoad


Dans OnLoad, le script associé s'active au chargement de l'interface. C'est idéalement là qu'on gère la visibilité d'un élément, de la dépendance avec un autre chargement (dépendance avec un autre addon par exemple), de la déclaration d'un évènement que surveille un élément, etc...
Exemple:
Code PHP:

self:RegisterEvent("UNIT_TARGET")
self:Hide() 
Frame cachée au chargement qui surveille si le personnage cible.

OnEvent


Dans OnEvent, le script appliquera une fonction (ou plusieurs) en fonction d'un évènement que la frame surveille depuis son chargement (OnLoad).
Exemple (qui fait suite au point précédent):
Code PHP:

if UnitExists("Target") == nil then
   self
:Hide()
   return
end
local cl 
UnitClassification("Target")
if (
cl == "elite") or (cl == "worldboss") or (cl == "rareeleite"then
   self
:SetBackdropColor(0.10.10.10.1)
   
self:Show()
else
   
self:SetBackdropColor(1111)
   
self:Show()
end 
Si le personnage cible quelque chose, la frame réagit en fonction de la classification de l'unité ciblée.

OnUpdate


Dans OnUpdate, le script réagit par rafraichissement, ce qui intervient lors d'un évènement, ou d'une action de l'utilisateur. Tenir compte que le script s'exécute avant l'affichage à l'écran, ce qui explique pourquoi il est fréquent qu'un script qui s'exécute en Update appelle souvent OnShow.
Exemple:
Code PHP:

if not self.resized then
  ChatFrame1
:SetScript("OnSizeChanged", function(f)
    
self:SetWidth(f:GetWidth())
    
self:SetHeight(f:GetHeight())
  
end)
  
self:SetWidth(ChatFrame1:GetWidth() + 10)
  
self:SetHeight(ChatFrame1:GetHeight() + 10)
end 
La frame adaptera sa taille en fonction de la fenêtre de discussion avec une largeur augmentée de 10.

OnShow


Dans OnShow, le script s'exécute lorsqu'un élément est visible.

OnHide


Dans OnHide, il s'exécute lorsque l'élément est caché.

OnEnter


Dans OnEnter, le script s'exécute lorsque la frame est survolée par la souris.

OnLeave


Dans OnLeave, il s'exécute lorsque la souris ne survole plus la frame.

OnClick


Dans OnClick, le script réagit lorsqu'on clique sur la frame.

Quelques exemple de scripts


Générer des boutons (affichage de Recount)

Parmi les exemple les plus courant de l'utilisation de kgpanels, on trouve un bouton simple:

<OnClick>
Code PHP:

if pressed then
if Recount_MainWindow:IsVisible() then
Recount_MainWindow
:Hide()
else
Recount_MainWindow:Show()
end
elseif released then
end 
Quand on clique sur une frame, celle-ci fait apparaître une autre fenêtre (ici, recount). Mais entre vous et moi, avoir un bouton aussi statique que ça, c'est vraiment se contenter de peu...

C'est pourquoi, je vous conseille plutôt une autre version de bouton, cette fois ci plus dynamique:




  1. Faîtes deux panneaux de mêmes dimensions (par exemple 35x35). Le premier est nommé "Frame_On" et le second "Frame_Off" pour notre illustration.
    Puis on attribue un skin très légèrement différent pour les deux:

    on_off.gif
    • Demandons à notre Frame_On de cacher la fenêtre Recount au chargement:

      <OnLoad>
      Code PHP:
      
      Recount_MainWindow:Hide() 
      
      Puis attribuons un click; Frame_On disparaît en laissant place à Frame_Off et notre frame Recount:

      <OnClick>
      Code PHP:
      
      self:Hide()
      local Frame_On kgPanels:FetchFrame("Frame_Off")
      kgPanels:FetchFrame("Frame_Off"):Show()
      local Frame_On Recount_MainWindow
      Recount_MainWindow
      :Show() 
    • Puis à Frame_Off de réagir en inversement:

      <OnLoad>
      Code PHP:
      
      self:Hide() 
      
      <OnClick>
      Code PHP:
      
      self:Hide()
      local Frame_Off kgPanels:FetchFrame("Frame_On")
      kgPanels:FetchFrame("Frame_On"):Show()
      local Frame_Off Recount_MainWindow
      Recount_MainWindow
      :Hide() 

  2. Encore mieux, on peut aussi lui attribuer une réaction au survol de la souris. Par exemple, nous allons changer la couleur du bouton qu'on survole, et activer sa désignation dans une infobulle.

    Pour moduler la teinte d'un "Backdrop" (=> couche alpha) par script, reportez vous au chapitre VII -> SetBackdropColor. Une astuce consiste à regarder le réglage dans le kgpanels (WTF) -> global->layout-> [nom-du-layout-actif]->color, et de moduler en prenant compte des valeurs du bouton.
    Dans notre exemple, on va assombrir en mouseover et relever un peu le bleu.

    • Réaction du bouton.

      <OnEnter>
      Code PHP:
      
      self:SetBackdropColor(0.50.50.81
      <OnLeave>
      Code PHP:
      
      self:SetBackdropColor(1111
      Faîtes la même chose pour les deux boutons On et Off (avec possibilité de les moduler différemment).
    • Activation de la tooltip.

      <OnEnter>
      Code PHP:
      
      Gametooltip_SetDefaultAnchorGameTooltipUIParent )
      Gametooltip:SetText("Afficher Recount\\n le double slash+n permet de passer  à la ligne")
      GameTooltip:Show() 
      <OnLeave>
      Code PHP:
      
      GameTooltip:Hide() 
      
      Placez les codes à la suite. Ici, ils ne sont séparés que pour plus de clarté, et n'oubliez pas juste de modifier le texte de l'infobulle .




Ordonner à un autre élément (replacer le "pop" de Haut-Faits)


S'il y a bien quelque chose que les adeptes d'addons s'accordent à montrer du doigt, c'est la gêne occasionnée par certains éléments d'interface de Blizzard. Que ce soit l'affichage de nom de la région dans laquelle on se trouve, le manque de souplesse de la fenêtre de discussion, ou encore, le pop des fenêtre de Haut-Faits (illustration en début de Wiki)
Voyons ici comment déplacer ce pop-frame de HF afin qu'il cesse de cacher nos éléments d'interface en plein combats. Commençons par nommer notre panneau Move_Frames puis:

<OnUpdate>
Code PHP:

function AchievementAlertFrame_FixAnchors()
if(
not AchievementAlertFrame1then
return;
end
AchievementAlertFrame1
:ClearAllPoints();    AchievementAlertFrame1:SetPoint("TOPLEFT"kgPanels:FetchFrame("Move_Frames"), "TOPLEFT"00);
end 
(A noter qu'ici, on utilise une argumentation qui s'avérera très utile dans bien des cas: "return" permet d'ignorer un script tant que ne se présente pas l'évènement de référence.)

Plus qu'à placer le panneau où vous souhaitez voir apparaître votre pop de HF en tenant compte qu'il est ancré en haut, à gauche du panneau. N'oubliez pas non plus de rendre la frame transparente (ainsi que choisir "aucune" à bordure) et de ne pas activer "l'interaction avec la souris".

BONUS: Afin d'éviter de multiplier la gestion de panneaux actifs, on peut ajouter à la suite d'autres gestions d'éléments. Par exemple, si vous vous apprêtez à faire une partie de Plants vs Zombies:

<OnUpdate>
Code PHP:

if PlayerPowerBarAlt:IsVisible() then
PlayerPowerBarAlt
:ClearAllPoints()
PlayerPowerBarAlt:SetPoint("TOPLEFT"UIParent"TOPLEFT",40,-250)
end
La frame s'affichera en haut à gauche avec un décalage de 40 du bord gauche et de 250 du bord supérieur. Pour trouver l'ancrage qui convient, il suffit de faire un panneau de test qu'on place à l'endroit où on veut voir apparaître la fenêtre, et d'y prélever les coordonnées.


Maquiller des éléments (Reskiner les boutons de Carbonite)

BCtuto.jpg

Les utilisateurs de Carbonite le savent, ça a beau être un excellent addon, sa gestion des boutons de la minimap est vraiment pas terrible et fait souvent tache. C'est pourquoi je vous propose de maquiller ses boutons.

Pour commencer, repérez les boutons qu'il gère car il faudra faire un nouveau panneau pour chacun d'eux. Pour ma part, j'ai:


  • Le bouton Carbonite. -> frame: NXMiniMapBut
  • Le calendrier. -> frame: GameTimeFrame
  • L'affichage de la grande map. -> frame: MiniMapWorldMapButton
  • Le bouton de pistages. -> frame: MiniMapTracking
  • Les files d'attente en BG ou instances. -> frame BG: MiniMapBattlefieldFrame & frame instances: MiniMapLFGFrame
  • L'annonce de Courriers reçus. -> frame: MiniMapMailFrame
  • les boutons de certains addons qui ne sont pas gérés par un Fu. (Facultatif).
exemples frames: DPMMinimapButton, TrinketMenu_IconFrame, etc..

L'objectif est qu'ils gardent une harmonie avec mon interface, c'est pourquoi je vais leur attribuer une bordure et une texture qu'on retrouve sur un plugin de BouttonFacade:

La texture:
glosstuto.png

La bordure:
Squaretuto.png

Pour le reste, on va pas trop s'en soucier, laissant les panneaux se débrouiller tous seuls!

BOUTON CARBONITE: BC_Carbonite


["parent"] = "NxMapDock",
["anchor"] = "NXMiniMapBut",
["strata"] = "HIGH",


NxMapDock est la frame qui reçoit les boutons, et sera donc "parent" de chacun de nos panneaux. NxMiniMapBut est le bouton de Carbonite ("C").
Concernant la couche (=> "strata"), elle doit recouvrir notre bouton, mais hérite de son parent. C'est pourquoi on va la forcer à agir comme une couche supérieure.
Un conseil quand vous attribuez une teinte à ces boutons: préférez ici le mode "Gradient" afin d'améliorer la souplesse de votre texture.

<OnLoad>
Code PHP:

if ( IsAddOnLoaded"Carbonite" ) ) then
return;
else
self:Hide()
end 
<OnUpdate>
Code PHP:

NXMiniMapBut:SetFrameStrata("MEDIUM"
En forçant le bouton à prendre la couche "Moyenne", celui-ci sera couvert par notre texture.

Il n'y a plus qu'à affiner votre maquillage en modifiant la taille et l'écart de votre bordure et en attribuant les couleurs.
Une fois que vous êtes satisfait, faites les autres panneaux, et "copiez tout" de BC_Carbonite en modifiant à chaque fois l'attache et le nom du bouton dans votre OnUpdate.

BOUTON DE FILE D'ATTENTE: BC_AttenteDonjons.

["parent"] = "NxMapDock",
["anchor"] = "MiniMapLFGFrame",
["strata"] = "MEDIUM",

Pourquoi la couche est ici MEDIUM et pas HIGH? C'est juste pour montrer que ça n'a pas d'importance tant que la logique reste la même, c'est à dire, qu'on demande à ce que notre bouton ait une couche inférieure à notre skin.

<OnLoad>
Code PHP:

if ( IsAddOnLoaded"Carbonite" ) ) 
then
return;
else
self:Hide()
end 
<OnUpdate>
Code PHP:

if MiniMapLFGFrame:IsVisible() then
self
:SetAlpha(1)
else
self:SetAlpha(0)
end
MiniMapLFGFrame
:SetFrameStrata("LOW"
Une des particularité des boutons de réception de courrier, de file d'attente BG ou d'instances, c'est de n'apparaître qu'en fonction d'un évènement. C'est pourquoi, nous allons rendre transparentes nos textures pour ces boutons lorsque leurs attaches n'apparaissent pas (On peut aussi utiliser "Hide() ). Plus qu'à "copier tout" pour les panneaux concernés en faisant les modifications adéquates.

A noter: Le choix de placer notre script en OnUpdate au lieu de le placer dans OnEvent semble peu pertinent... sauf que je suis flemmard et que moins j'en fais, mieux je me porte!
Je tâcherai de revenir éditer ce code si je trouve une meilleure option.



INDEX: quelques scripts utiles.


recensement de nom de frames



  • Se rapportant à soi-même: self.
  • Bazooka -> Frames: BazookaBar_(numero). Exemple: BazookaBar_1.
    • Pluggins -> Brokers: BazookaPlugin_Broker_(désignation). Exemples: BazookaPlugin_Bazooka, BazookaPlugin_Broker_RecountStats, BazookaPlugin_VuhDo, BazookaPlugin_ArkInventory_Money, BazookaPlugin_kgPanels, BazookaPlugin_AckisRecipeList_QuickScan
  • Boussole (dont les noms de territoires) -> MinimapCluster
  • Carbonite
    • Minimap -> NxMap1
    • Table des quêtes en cours -> NxQuestWatch
    • Liste des Punks -> NxPunkHUD
    • Configurations ->
  • Fenêtre de discussion
    • Fenêtre générale -> ChatFrame1
    • Fenêtre associés aux autres onglets -> ChatFrame2, ChatFrame3, etc...
    • Barre d'onglets -> GeneralDockManager
    • Icône de défilement du texte -> ChatFrame1ButtonFrameBottomButton
    • Icône "Social" -> FriendsMicroButton
    • Table des options de discussions -> ChatFrame1ButtonFrame
    • Option de langues -> ChatFrameMenuButton
  • Dominos
    • Barres -> Dominos.Frame:Get(nom), exemple: Dominos.Frame:Get(1) à Dominos.Frame:Get(10) ou Dominos.Frame:Get('pet')
    • Slots -> DominosActionButton[numero], exemple: DominosActionButton33 ou PetActionButton[numero], exemple: PetActionButton10
  • EavesDrop -> EavesDropFrame
  • KgPanels ->Frames ->kgPanels:FetchFrame("nom"), exemple: kgPanels:FetchFrame("Frame_On")
  • Messages d'erreurs ("Vous n'êtes pas à porté"...) -> UIErrorsFrame
  • Omen
  • Recount
    • Fenêtre des kikis -> Recount_MainWindow
    • Fenêtre des analyses ->
    • Comparateurs des graphiques -> Recount_GraphWindow (Pour sa propre fenêtre d'analyses graphiques -> Recount_Realtime_[nom]_DAMAGE, ex: Recount_Realtime_Alahn_DAMAGE)



Recensement de quelques scripts


IMPORTANCE DE LA DÉCLARATION


DÉCLARER LA DÉPENDANCE D'UN ELEMENT
ProcédureConditionSignatureAction
Formeif ____ thenloaded = IsAddOnLoaded("name") or IsAddOnLoaded(index)
return



  • Exemple: Si l'Addon VuhDo est chargé, alors le script s'exécute, sinon, la frame est cachée sans exécution.

    Code PHP:
    
    if ( IsAddOnLoaded"VuhDo" ) ) 
    then
    return
    else
    self:Hide()
    end 



DÉCLARER UN ÉVÈNEMENT
ProcédureObjet:fonctionArgument
FormeFrame:RegisterEvent("EVENTS")
liste des évènements



  • Exemple: Surveiller si PLAYER_REGEN_DISABLED ou PLAYER_REGEN_ENABLED => si le joueur entre ou sort du combat.

    <OnLoad>
    Code PHP:
    
    self:RegisterEvent("PLAYER_REGEN_DISABLED")
    self:RegisterEvent("PLAYER_REGEN_ENABLED"
    Faire apparaitre la frame en combat et disparaitre hors-combat:
    <OnEvent>
    Code PHP:
    
    if event == "PLAYER_REGEN_ENABLED" then
    self
    :SetAlpha(0)
    elseif 
    event == "PLAYER_REGEN_DISABLED" then
    self
    :SetAlpha(1)
    end 



EN VRAC!


ADAPTER LA TAILLE D'UNE FRAME EN FONCTION D'UN ÉLÉMENT



  • Exemple: Panneau de décoration du premier bloque d'UnitFrame de VuhDo.
    <OnLoad>
    Code PHP:
    
    self.resized false 
    
    <OnUpdate>
    Code PHP:
    
    if not self.resized then
         VdAc1
    :SetScript("OnSizeChanged", function(f)
              
    self:SetWidth(f:GetWidth())
              
    self:SetHeight(f:GetHeight())  
    end)
         
    self:SetWidth(VdAc1:GetWidth())
         
    self:SetHeight(VdAc1:GetHeight())
    end 

REACTION A LA COULEUR DE CLASSE



  • Exemple: Une frame réagit en fonction de l'existence d'une cible et de sa classe:
    Déclaration de l'évènement. La frame est cachée au chargement.
    <OnLoad>
    Code PHP:
    
    self:RegisterEvent("UNIT_TARGET")
    self:Hide() 
    Si l'évènement prend une valeur "nulle", alors la frame se cache, sinon, elle s'affiche.
    <OnEvent>
    Code PHP:
    
    if UnitExists("target") == nil then
         self
    :Hide()
    else
         
    self:Show()
    end 
    Une fois affichée, la frame se colorise en réaction à la classe de notre cible.
    <OnUpdate>
    Code PHP:
    
    local _, class = UnitClass("Target");
        if class == 
    "WARRIOR" then
            self
    .bg:SetVertexColor(0.950.230.23self.bg:GetAlpha())
        elseif class == 
    "PRIEST" then
            self
    .bg:SetVertexColor(10.960.98self.bg:GetAlpha())
        elseif class == 
    "MAGE" then
            self
    .bg:SetVertexColor(0.0011self.bg:GetAlpha())
        elseif class == 
    "DRUID" then
            self
    .bg:SetVertexColor(10.490.04self.bg:GetAlpha())
        elseif class == 
    "PALADIN" then
            self
    .bg:SetVertexColor(0.920.220.46self.bg:GetAlpha())
        elseif class == 
    "HUNTER" then
            self
    .bg:SetVertexColor(0.330.860.00self.bg:GetAlpha())
        elseif class == 
    "ROGUE" then
            self
    .bg:SetVertexColor(10.940.16self.bg:GetAlpha())
        elseif class == 
    "SHAMAN" then
            self
    .bg:SetVertexColor(0.130.421self.bg:GetAlpha())
        elseif class == 
    "WARLOCK" then
            self
    .bg:SetVertexColor(0.360.181self.bg:GetAlpha())
        elseif class == 
    "DEATHKNIGHT" then
            self
    .bg:SetVertexColor(0.770.120.23self.bg:GetAlpha())
        
    end 
  • A noter que si on détermine dans OnUpdate un paramètre class == nil,
    alors, on peut retirer self:Hide() dans OnLoad et OnEvent.
    Dans ce cas, la frame reste toujours affichée, ce qui peut être approprié dans le cas où,
    on veut que la réaction se fasse sur une frame qui possède une autre fonction.
    Par exemple, on peut appliquer notre script à la décoration de notre bloc d'UnitFrame.


REACTION AU TAG PVP



  • Exemple: Admettons une frame qu'on peut par exemple placer sur son portrait, dont la couleur de la bordure réagit en fonction du Tag PVP, et que celle-ci indique le temps restant quand on clique dessus.
    Déclaration de l'évènement:
    <OnLoad>
    Code PHP:
    
    self:RegisterEvent("UNIT_FLAGS"
    <OnUpdate>
    Code PHP:
    
    if UnitIsPVP("player"then
          self
    :SetBackdropBorderColor(10.120.23self.bg:GetAlpha())
    else
          
    self:SetBackdropBorderColor(0.330.860.00self.bg:GetAlpha())
    end 
    Lorsque le joueur est taggué PVP, la bordure est rouge, sinon, elle devient verte.

    <OnClick>
    Code PHP:
    
    local m=GetPVPTimer()/1000 message(not UnitIsPVP("player")
    and
    "Mon mode PVP est désactivé"
    or(GetPVPDesired()>0)
    and
    "Mon mode PVP est activé"
    or"Je ne serai plus taggué dans "..(m>60 and floor(m/60).." minutes et "or"")
    ..
    floor(m%60).." secondes"
  • A noter que le clique génère une nouvelle frame qui peut elle même être arrangée à sa convenance. Par ailleurs, il est possible aussi d'avoir l'information du temps restant par une infobulle.

Dernières modifications :
(Voir) 19/1/2011 01:59:32 : CosmicDebris (correction)
(Voir) (Comparer)08/1/2011 19:25:56 : CosmicDebris (correction)
(Voir) (Comparer)08/1/2011 19:24:30 : CosmicDebris (ajouts: réactions aux bordures et tag PVP.)
Voili, voilou!

Je l'avais promis il y a bien longtemps, et le voici enfin!

Un peu frustré de ne pas avoir mieux complété ce wiki, ayant que de très maigres connaissances en .lua, mais de l'autre coté, vous verrez justement que n'importe qui peut aisément se faire plaisir avec ce remarquable addon, même sans rien y connaitre.

J'espère que cet outil vous accompagnera dans sa découverte, voire, sa redécouverte, et que celui-ci fera naître en vous des idées que vous partagerez dans ce thread dédié.
Très bon boulot de ta part. Moi qui cherché désespérément comment changer la couleur de ma Frame en fonction de ma classe, ça va beaucoup m'aider. Merci
J'aurais une petite question: comment faites vous pour que la bordure prenne la même couleur que la classe du personnage, à partir de ce que tu as mis ?

Car je cherche depuis un moment je ne trouve pas. Merci d'avance
Pour les bordures, je dois me pencher sur la question, ne l'ayant pas envisagé -ce qui doit être corrigé-. Quoi qu'il en soit, pour le moment, je dois préciser que la signature est la suivante:
Code PHP:

obj:SetVertexColor(redgreenblue[, alpha]); 

(source)

Les unités, quand à elle, comme à chaque fois sont comprises entre 0 à 1 ce qui permet de les moduler, et l'alpha n'est pas obligatoirement précisée.

L'objet déterminant la bordure doit être assez facile à trouver, donc je vais jeter un œil demain, et apporter les précision en conséquence.

Merci pour vos remarques
Voilà, j'ai donc trouvé comment faire réagir la bordure (je le rajouterai dans le wiki après quelques tests encore):

Code HTML:
self:SetBackdropBorderColor(red, green, blue [, alpha])
( source )

Pour faire le test, j'ai utilisé le code suivant:

<OnClick>
Code PHP:

if pressed then
if kgPanels:FetchFrame("test1"): IsVisible() then
self
:SetBackdropBorderColor(10.490.04self.bg:GetAlpha())
else
self:SetBackdropBorderColor(0.330.860.00self.bg:GetAlpha())
end 
aaaah super merci beaucoup je vais essayer de faire en sorte que mes bordures aient la couleur des classes de mes perso, merci encore, ça va beaucoup m'aider.

Edit: Salut j'ai quelques petits soucies en ce qui concerne le changement de couleur pour les bordures. En fait j'aimerais savoir comment faire pour que les bordures change de couleur uniquement en fonction de la classe de mon personnage. Et pas quand je suis en pvp si possible.
- Ensuite, quelqu'un connaitrait la macro qui permet de savoir le nom exactement de chaque élément de notre UI, et addon du style [Recount_MainWindow] ?
- Pour finir, j'aimerais savoir pour ceux qui est de la transparence d'une Frame: En effet je n'arrive pas à comprendre comment on peut faire, en utilisant le script, car d'après ce que j'ai compris il n'y a que par là qu'on peut modifier ça, pour changer l'opacite, le gradient d'une frame.

J'espère que je pose pas des questions trop compliqué sinon tan pis, merci d'avoir lut quand même,
Bonjour a tous,

J'aurais besoin d'aide concernant certains de mes panneaux kgpanels. J'utilise grid pour healer en raid et j'aurais aimé sous chaque cellule de grid créer un panneaux qui afficherais le nom du joueur de la cellule correspondante (donc 25 panneaux) dans la couleur de sa classe. Si certains ont des idées je suis preneur.

Merci d'avance.
Houla ça me parrait compliqué et fastidieux, et surtout je vois pas la différence que ça fait avec un grid paramétré normalement! Tu veux juste le nom de chacun avec la couleur de classe c'est ça? Grid peut le donner si tu veux, ou alors tu veux un effet visuel que je n'arrive pas à m'imaginer!
J'aimerais que le nom du joueur soit afficher dans un panneaux en dessous de la cellule grid dans le but de libérer de la place dans la cellule et pouvoir y afficher d'autres info.
Aaah ouais. Ah ben ouais. Ah ouais. Ben ça doit être drolement chiant.
C'est surement pas la manière la plus simple d'utiliser kgpannel, t'aurais plus vite fait de te plonger dans le code de grid pour rajouter un module je pense, ça demanderait surement pas beaucoup plus de maîtrise. À moins de trouver un truc super tricky pour récupérer les infos des persos dans un script de kgpannel, mais là je vois pas. :x
Ben si quelqu'un à une idée pour modifier le .lua de grid afin de poouvoir descendre le nom des unités plus bas ca fera parfaitement l'affaire aussi mais mes connaissances sont malheureusement trop limités pour faire ca. Il existe bien des modules grid permettant des rajouter du texte mais pas en dehors de la cellule
interfacee
bonjour,
D'abord très bon tuto!
Mais il y a un truc que je n'arrive pas a faire. Dans les premieres lignes, vous avez mis des liens a telecharger. J'ai donc pris le temps de les prendre et installer comme c'etait marqué ( meme si c'est en anglais ) mais rien a faire, je ne vois rien en sachant que j'ai tout effacer mon add-on et tous mes "carrés" pour repartir a zéro. Comment ca se fait?

Merci d'avance
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés