eigenes Addon (Probleme mit dem Event-Handling)

08/17/2012 04:09 EmotionX#1
Hi@all...
Ich habe vor kurzem angefangen, mich mit der WoW-Addon-Materie zu beschäftigen und bin jetzt fleißig dabei, mir eigene Addons zu schreiben. Jetzt bin ich allerdings schon auf die ersten kleinen Probleme gestoßen.

Also bevor ich meine Probleme erläutere erstmal vorne weg etwas über mich. Ich beschäftige mich schon seit einigen Jahren mit Programmier- / Scriptsprachen. Unter meinem Sprachschatz finden sich u.a. C/++/#, Java, JavaScript, PHP, Pascal, Perl und diverse Basic-Sprachen (Visual Basic, Quick Basic, Pure Basic, etc.) außerdem noch einige Auszeichnungssprachen wie XML und das untergeordnete HTML und noch einiges was dazu gehört (MySQL, WordPress, usw.). Ich schreibe das, um ein wenig zu verdeutlichen, wie ungefähr mein derzeitiger Stand in Sachen Programmierung ist. Somit könnt ihr euch vieleicht ein Teil-Bild von mir machen und wisst, dass ihr mir nicht erst vorbeten müsst, was Variablen sind, wozu Funktionen gut sind oder was es mit Schleifen auf sich hat.

Ich hab mich jetzt ein wenig in Lua eingearbeitet und hab das Grundlegende drauf. Allerdings komme ich jetzt bei der WoW-API nicht ganz weiter. Es geht mir da speziell um das Thema Event-Handling.

Nehmen wir dazu mal ein kleines Code-Beispiel:
Code:
local MainFrame = CreateFrame("FRAME", "MainFrame", UIParent)
MainFrame:SetWidth(200)
MainFrame:SetHeight(200)
MainFrame:SetPoint("LEFT", UIParent, "LEFT", 0, 0)
MainFrame:SetBackdrop({
	bgFile = "Interface\\Buttons\\WHITE8x8",
	edgeFile = "Interface\\Buttons\\WHITE8x8",
	edgeSize = 1})
MainFrame:SetBackdropColor(0, 0.5, 0.8, 0.3)
MainFrame:SetBackdropBorderColor(1, 1, 1, 0.7)

MainText = MainFrame:CreateFontString(nil, "ARTWORK")
MainText:SetFont("Fonts\\ARIALN.ttf", 14, "OUTLINE")
MainText:SetPoint("TOP", MainFrame, "TOP", 0, -5)
MainText:SetText("Any Text")
(Es ist nicht wirklich sinnvoll, dient aber auch nur zur Veranschaulichung.)

Jetzt möchte ich das Fenster mit dem Drücken einer Taste auf der Tastatur verschwinden lassen. Um das Fenster verschwinden zu lassen, benötige ich den Befehl "Hide()" das ist mir klar, allerdings weiß ich nicht, wie ich dieses Event bei einem Tastendruck auslöse. Ich hab mich schon ein wenig informiert aber nichts wirklich Hilfreiches zum Thema Event-Handling bei WoW-Addons gefunden. Mich würde auch gerne mal interessieren, was es alles für Events gibt?

Hier jetzt nochmal eine kleine Kurzfassung meiner Fragen:
- Wie reagiere ich auf ein Event? (ein kleines Codebeispiel wär mir am liebsten ^^)
- Was gibt es alles für Events, auf die ich reagieren kann?

Schonmal danke im Voraus. ^^
08/17/2012 13:41 Los#2
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Was du brauchst ist "SetScript"

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Verschiedene ingameevents kannste mit "OnEvent" abfangen
Ne eventliste findest du hier
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...])


Um dein Beispiel also zu erweitern

Code:
local MainFrame = CreateFrame("FRAME", "MainFrame", UIParent)
MainFrame:SetWidth(200)
MainFrame:SetHeight(200)
MainFrame:SetPoint("LEFT", UIParent, "LEFT", 0, 0)
MainFrame:SetBackdrop({
	bgFile = "Interface\\Buttons\\WHITE8x8",
	edgeFile = "Interface\\Buttons\\WHITE8x8",
	edgeSize = 1})
MainFrame:SetBackdropColor(0, 0.5, 0.8, 0.3)
MainFrame:SetBackdropBorderColor(1, 1, 1, 0.7)
MainFrame:SetScript("OnKeyDown", MainFrame.Hide)

MainText = MainFrame:CreateFontString(nil, "ARTWORK")
MainText:SetFont("Fonts\\ARIALN.ttf", 14, "OUTLINE")
MainText:SetPoint("TOP", MainFrame, "TOP", 0, -5)
MainText:SetText("Any Text")
(Ungetesetet sollte aber klappen)
Musst halt bisl rumspielen und code von andren addons bisl durchschaun
08/17/2012 17:18 EmotionX#3
Erstmal dankeschön für deine schnelle und hilfreiche Antwort.

Das Code-Beispiel funktioniert einwandfrei und auch die Links waren sehr hilfreich.


Ich hab es mal so abgeändert, dass es nur dann reagiert, wenn ich die Taste "T" drücke. Der Code Dazu sieht so aus:
Code:
local MainFrame = CreateFrame("FRAME", "MainFrame", UIParent)
MainFrame:SetWidth(200)
MainFrame:SetHeight(200)
MainFrame:SetPoint("LEFT", UIParent, "LEFT", 0, 0)
MainFrame:SetBackdrop({
	bgFile = "Interface\\Buttons\\WHITE8x8",
	edgeFile = "Interface\\Buttons\\WHITE8x8",
	edgeSize = 1})
MainFrame:SetBackdropColor(0, 0.5, 0.8, 0.3)
MainFrame:SetBackdropBorderColor(1, 1, 1, 0.7)

MainText = MainFrame:CreateFontString(nil, "ARTWORK")
MainText:SetFont("Fonts\\ARIALN.ttf", 14, "OUTLINE")
MainText:SetPoint("TOP", MainFrame, "TOP", 0, -5)
MainText:SetText("Any Text")

local function HideWindow(self, button, down)
	if button == "T" then
		self:Hide()
	end
end

MainFrame:SetScript("OnKeyDown", HideWindow)
Allerdings ist es wie fast immer beim Programmieren, wenn man ein Problem löst, tritt ein anderes auf. ^^

So lange das Fensterchen sichtbar ist, verschluckt es alle Tastatureingaben. Es ist mir dann nicht mehr möglich irgend ein anderes Fenster mittels Tastendruck zu öffnen, wie z.B. den Quest-Log mit der Taste "L" oder die Map mit der Taste "M", usw...

Gibt es da eine Möglichkeit, mit dem Event so zu sagen nur eine einzige Taste abzufragen, ohne dass die anderen Tasten ins Leere verlaufen?
08/18/2012 00:22 Mingxie#4
Wenn ich mich nicht irre, dann sollte frame:SetPropagateKeyboardInput(1) das richtige sein. Ansonsten lies mal [Only registered and activated users can see links. Click Here To Register...] nach (ab dem 12. Post).
08/18/2012 02:15 EmotionX#5
Genau das, wonach ich gesucht hab.
Dankeschön =)